快速上手0.91寸OLED

基于中景园代码分析+使用

环境:0.91寸OLED+STM32F1XX+模拟IIC

文中资源链接:【免费】-0.91寸/0.96寸OLED模块4P(iic)demo+资料资源-CSDN文库


代码分析:

一、OLED初始化

        OLED_Init();            //初始化IO+OLED  
        OLED_Clear();            //清屏

在使用OLED屏幕前给一个小延时是必要的。这里OLED_Init();展开可以看到已经延时了,延时后的OLED初始化是根据SSD1306的指令来写的。

delay_ms(200);
		OLED_WR_Byte(0xAE,OLED_CMD);//关闭显示屏

		OLED_WR_Byte(0x40,OLED_CMD);//---set low column address		设置起始行地址
		OLED_WR_Byte(0xB0,OLED_CMD);//---set high column address 	设置页面起始地址为页面寻址模式,0-7

		OLED_WR_Byte(0xC8,OLED_CMD);//上下反置关(行重映射),C8,从COM[N-1]扫描到COM0;C0,设置 从COM0扫描到COM[N-1],N为复用率

		OLED_WR_Byte(0x81,OLED_CMD);// 设置对比度
		OLED_WR_Byte(0xff,OLED_CMD);// 选择0xff对比度,选择范围0x00-0xff

		OLED_WR_Byte(0xa1,OLED_CMD);// 左右反置关(段重映射),A0H 设置GDDRAM的COL0映射到驱动器输出SEG0,A1H 设置COL127映射到SEG0

		OLED_WR_Byte(0xa6,OLED_CMD);// 正常显示(1亮0灭)

		OLED_WR_Byte(0xa8,OLED_CMD);//	设置多路传输比率,显示行数
		OLED_WR_Byte(0x1f,OLED_CMD);//  MUX=31	 (显示31行)

		OLED_WR_Byte(0xd3,OLED_CMD);// 设置垂直显示偏移(向上)
		OLED_WR_Byte(0x00,OLED_CMD);// 偏移0行

		OLED_WR_Byte(0xd5,OLED_CMD);// 设置DCLK分频和OSC频率
		OLED_WR_Byte(0xf0,OLED_CMD);// 频率最高

		OLED_WR_Byte(0xd9,OLED_CMD);// 设置预充电的持续时间
		OLED_WR_Byte(0x22,OLED_CMD);

		OLED_WR_Byte(0xda,OLED_CMD);// 设置COM引脚配置
		OLED_WR_Byte(0x02,OLED_CMD);// 序列COM配置,禁用左右反置

		OLED_WR_Byte(0xdb,OLED_CMD);//调整Vcomh调节器的输出
		OLED_WR_Byte(0x49,OLED_CMD);

		OLED_WR_Byte(0x8d,OLED_CMD);// 启用电荷泵
		OLED_WR_Byte(0x14,OLED_CMD);// 启用电荷泵

		OLED_WR_Byte(0xaf,OLED_CMD);// 开OLED显示
		OLED_Clear();

参考:

ssd1306 OLED 初始化流程_ssd1306初始化-CSDN博客

SSD1306 OLED驱动芯片 详细介绍-CSDN博客

12. STM32——硬件IIC驱动OLED屏幕显示_oled stm32-CSDN博客


汉字显示:
		OLED_ShowCHinese(0,0,0);//中
		OLED_ShowCHinese(18,0,1);//景
		OLED_ShowCHinese(36,0,2);//园
		OLED_ShowCHinese(54,0,3);//电
		OLED_ShowCHinese(72,0,4);//子
		OLED_ShowCHinese(90,0,5);//科
		OLED_ShowCHinese(108,0,6);//技

其函数原型为

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;
      }                    
}

x代表开始列、y代表开始行,no代表的是顺序(也就是我们字模数组中汉字的排序)。文中的字模数组为Hzk[]。重点来了,我们看一下Hzk[]存储了哪些东西。

char Hzk[][32]={

{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},
{0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},/*"中",0*/

{0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00},
{0x00,0x40,0x20,0x0F,0x09,0x49,0x89,0x79,0x09,0x09,0x09,0x0F,0x20,0x40,0x00,0x00},/*"景",1*


//......
/}

数组中存储的16进制代码即我们要显示的汉字。那么这些代码是怎么来的呢。

在文章资源中找到取模软件pctolcd2002,模式(字符模式)按图上配置即可输出字模数组。

按照格式给替换一个字看看效果。

 注意数组的中间多加了{}。取模的时候一个汉字点阵的大小是16*16,由两个8*16的点阵组成。

参考:

0.91寸OLED显示学习总结(STM32F103c8),OLED128*64为硬件平台,以取模软件PCtoLCD2002为软件平台,列行式取模方式,主要针对16*16像素汉字。_lcp什么是列行式取模-CSDN博客


字符串显示:
//显示一个字符号串
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++;
	}
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63			 
//size:选择字体 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{      	
	unsigned char c=0,i=0;	
		c=chr-' ';//得到偏移后的值			
		if(x>Max_Column-1){x=0;y=y+2;}
		if(Char_Size ==16)
			{
			OLED_Set_Pos(x,y);	
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
			}
			else {	
				OLED_Set_Pos(x,y);
				for(i=0;i<6;i++)
				OLED_WR_Byte(F6x8[c][i],OLED_DATA);
				
			}
}
/*修改前的原码
OLED_ShowString(0,0,"0.91OLEDTEST",8);
OLED_ShowString(0,1,"0123456789AB",8);*/

/*修改后的代码*/
OLED_ShowString(0,0,"0.91OLEDTEST",8);
OLED_ShowString(10,2,"0123456789AB",16);

x代表行,数字越大显示越往右;y代表列,数字越大显示越往下;Char_Size代表可选择的字体的大小。


图片显示:

图片的显示与汉字类似,都是需要我们进行取模。

/*功能描述:显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{ 	
 unsigned int j=0;
 unsigned char x,y;
  
  if(y1%8==0) y=y1/8;      
  else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
	    {      
	    	OLED_WR_Byte(BMP[j++],OLED_DATA);	    	
	    }
	}
} 

下面是对函数中各个参数的解释:

  1. x0:起始点的x坐标,范围为0~127。
  2. y0:起始点的y坐标,范围为0~7,表示页的范围。
  3. x1:结束点的x坐标,范围为0~127。
  4. y1:结束点的y坐标,范围为0~7,表示页的范围。
  5. BMP[]:存储BMP图片数据的数组。

其中,x0、y0、x1、y1这四个参数用于确定要显示的图片的位置和大小。通过设置这四个参数的值,可以决定图片在屏幕上的显示位置和大小。

具体联系如下:

  • x0和y0确定了图片的起始点位置。
  • x1和y1确定了图片的结束点位置。
  • BMP[]数组中存储了要显示的BMP图片的数据。

如果想在屏幕上显示一个128×64像素的BMP图片,可以将x0设置为0,y0设置为0,x1设置为128,y1设置为8。这样就可以将整个屏幕作为一个显示区域来显示图片。

如果上方的输出图像大小为(54,64),那么起始列和结束列的差必须为54,也就是x1-x0=54,同理(y1-y0)*8=64。最后主函数调用OLED_DrawBMP();函数,即可显示啦。

请注意,具体的参数值需要根据你要显示的图片和屏幕的分辨率来确定。
0.91寸OLED分辨率为128*32,0.96寸OLED分辨率为128*64。

还是用取模软件,替换图中的数组的参数即可。


下面说图形取模的两种方式:

一、自己手绘:PCtoLCD2022-模式-图形模式;文件-新建-图片宽度(128)-图片高度(32)-确定(图片的宽和高根据自己的oled分辨率128*32来定义,不要超过最大的图像尺寸)。

比较傻但自己定义的尺寸比较好把握。

左键点击亮,右键点击灭(取消)。(图上应该是c51格式,我这里不小心用了a51但是也输出了.......)

效果如下:


二、导入图片(BMP格式),没有bmp格式的可以用下面的方法转一下。

1.找一张图片,打开电脑自带的画图功能,

        修改像素为图片大小,则使用时函数参数设置为 :OLED_DrawBMP(0,0,127,4,BMP1);资源例程中第三个参数给到了128,虽不影响使用但个人觉得取值范围还是需要规范在0-127。


 2. 也可以用lmage2Lcd来转换图片,最后注意例子中输出的图像的分辨率大小是37*32。

        函数修改为:OLED_DrawBMP(0,0,37,4,BMP1);

然后放入PCtoLCD2022取出字模--替换数组,最后调用注意修改函数参数

效果展示:

链接:

像素与分辨率的关系-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值