本次使用的OLED是Seeed的一款小显示模块,分辨率为128*64位,屏幕尺寸为0.96,这是一款单色显示模块,这一款用到的是SSD1315,实际上常用的还有SSD1306.oled屏幕的发光原理不同于lcd,上电后无法直接显示,需要初始化后才能正常显示,这一方面和IPS的彩屏有些类似。SSD1315是一款单芯片CMOS OLED/PLED驱动控制芯片,直接从内部128*64位GDDRAM中显示数据。
使用SSD1315作为主控的OLED,硬件有两种接法,区别是是否使用DC引脚。使用DC引脚,需要主控来控制DC引脚确定当前发送的是命令还是数据,不使用DC引脚,需要主控在发送数据之前发送一个bit,来确定是命令还是数据,观察模块的接口,只有IIC的两个引脚和供电,所以需要通过第二种方法实现控制。
作为单色的显示,实际上对于大多数的单片机控制起来都是比较富裕的,所要的资源还是挺少的,这一次我们采用的接口使用的是硬件IIC,实际上很多时候我都喜欢用IO口模拟的方式控制,这次尝试了一下硬件IIC,MX中的配置还是非常简单的:
启动IIC后,直接就可以,采用常规模式100K的速度,什么都不用配置,初始化也不用像定时器那样需要启动,我们直接用一下进行适配就OK了:
void OLED_WR_CMD(uint8_t cmd) { HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100); } void OLED_WR_DATA(uint8_t data) { HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100); }
关于SSD1315的驱动编写,我们可以通过网络搜索,实际上就是对一些寄存器的配置,这一方面中景园也有一些官方的例程,必须初始化才能进行显示,显示并不复杂,主要用的也是初始化和固定位置的且操作,这里我们显示的内容选用的英文方式,毕竟现实区域是有限的,英文的显示相对来说也是比较连贯的:
uint8_t CMD_Data[]={ 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40,0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6,0x8D, 0x14, 0xAF}; void OLED_Init(void) { HAL_Delay(200); uint8_t i = 0; for(i=0; i<23; i++) { OLED_WR_CMD(CMD_Data[i]); } }
注意,初始化完的屏幕是花屏的,花屏证明这个时候显示是正常的,然后进行清屏操作,为统一的底色,单色要不为黑底,要不为白底。
接下来就是字符串的显示,这里我们显示“EEPW_Flowmeter”,本章节主要进行功能展示,简单显示一下,效果如下: