嵌入式之路,贵在日常点滴

      ---阿杰在线送代码

我们可以直接拿商家的初始化程序来用 

https://pan.baidu.com/s/1J57Izsv-PKmbwVrA2ynDzg                       提取码:vktz

这里我使用的是优信电子的4P 0.96寸白色的OLED

对比程序更改初始化函数,一般SCL和SDA引脚需要改变一下。

我使用的是C8T6最小板来开发这个项目,所以我得引脚为

SCL--PC14
SDA--PC15

一、修改OLED_Init() 函数 -》(修改引脚)

二、修改oled.h中的宏

三、 调用初始化函数

四、在main使用显示函数
显示字符串

//x:0-127 列(即一行有128个点可用于显示)  y :0-63 行(即一列有64个点可用于显示)
//u8 *chr :想要显示的字符串内容
//size:字体大小
 
//显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j],Char_Size);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}
OLED_ShowString(6,3,"ABCDSDKJF",16);//显示一个字符号串
OLED_ShowString(0,6,"GFGFGF:",16);
OLED_ShowString(63,6,"FGFGFG:",16);

显示数据的一种方法

比如:我们要显示温度数据等等 带有小数点 

数据转字符串函数
sprintf((char *)string,"Pitch:%.2f",pitch);
u8 string[16] = {0};
 
int main(void)
{
    float pitch = 1.2;
    OLED_Init();			//初始化OLED  
	OLED_Clear();           //清屏
	
	while(1)
    {
        sprintf(string,"Pitch:%.2f",pitch);//将数据转换为字符串.存放在string中
	    OLED_ShowString(6,6,string,16);//显示字符串,“string只能是字符串”  
        //如果显示大小为16,y最多只能从0到6
        //如果显示大小位8,y可以从0到7
    }
}

  

显示汉字

补充知识:

没有行的概念  一页=八行  按页写
字符:两页八列 (一个字节)
汉字:两页十六列(两个字节) 

图片:自己设定(不能大于128*64)

//显示汉字
//x:0-127 列(即一行有128个点可用于显示) 必须是16的倍数
//y :y每递增1代表8个位(即一列有64个点可用于显示)
//一个汉字所占的点数:行16个点,列16个点
 
//no:显示汉字序号
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{      			    
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
				adder+=1;
      }					
}
int main(void)
{
    float pitch = 1.2;
    OLED_Init();			//初始化OLED  
	OLED_Clear(); 
	
	while(1)
    {
        OLED_ShowCHinese(0,0,0);//遥
		OLED_ShowCHinese(0,2,1);//控
		OLED_ShowCHinese(0,4,2);//模
		OLED_ShowCHinese(0,6,3);//式  y最多只能到6,在递增就溢出了
    }
}

oledfont.h
 
char Hzk[][32]={
 
{0x40,0x40,0x42,0xCC,0x00,0x00,0x4A,0x32,0x22,0x2A,0xF1,0x21,0x31,0x2D,0x00,0x00},
{0x00,0x80,0x40,0x3F,0x40,0x80,0x81,0xBD,0xA1,0xA1,0xBF,0xA1,0xA1,0xBD,0x81,0x00},/*"遥",0*/
/* (16 X 16 , 宋体 )*/
{0x10,0x10,0x10,0xFF,0x90,0x20,0x98,0x48,0x28,0x09,0x0E,0x28,0x48,0xA8,0x18,0x00},
{0x02,0x42,0x81,0x7F,0x00,0x40,0x40,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x40,0x00},/*"控",1*/
/* (16 X 16 , 宋体 )*/
{0x10,0x10,0xD0,0xFF,0x90,0x14,0xE4,0xAF,0xA4,0xA4,0xA4,0xAF,0xE4,0x04,0x00,0x00},
{0x04,0x03,0x00,0xFF,0x00,0x89,0x4B,0x2A,0x1A,0x0E,0x1A,0x2A,0x4B,0x88,0x80,0x00},/*"模",2*/
/* (16 X 16 , 宋体 )*/
{0x10,0x10,0x90,0x90,0x90,0x90,0x90,0x10,0x10,0xFF,0x10,0x10,0x11,0x16,0x10,0x00},
{0x00,0x20,0x60,0x20,0x3F,0x10,0x10,0x10,0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00},/*"式",3*/
/* (16 X 16 , 宋体 )*/
};

oledfont.h可通过取模软件来生成, 需要简单的配置

若上一次调用字符或汉字后屏幕被点亮的范围(即哪一行那一列的点比本次点亮的多)比本次大。

需要一次清屏 OLED_Clear(); //即将所有的点熄灭 (只让清一次即可 太多次会出事)