IIC也是我们常用的串行接口,我们常用其驱动一些传感器,这次我们用其驱动OLED。
本次采用的是Seeed品牌的一款小型OLED显示模块,其分辨率为128x64像素,屏幕尺寸为0.96英寸,属于单色显示类型。该模块采用SSD1315作为驱动芯片,尽管SSD1306亦是常用之选。OLED屏幕的发光机制与LCD截然不同,上电后需经过初始化流程方能正常显示信息,此特性与IPS彩色液晶屏幕存在相似之处。SSD1315是一款集成的CMOS OLED/PLED驱动控制芯片,能够直接从其内置的128x64像素GDDRAM中读取并显示数据。采用SSD1315作为控制核心的OLED显示屏,在硬件连接上存在两种配置方式,核心差异在于是否启用DC引脚。若采用DC引脚方案,则需由主控芯片负责操控DC引脚,以明确当前传输的是指令信息还是数据内容。反之,若不启用DC引脚,则要求主控在数据发送前,预先传输一个比特位来界定后续内容为指令或数据。鉴于目标模块接口仅包含IIC通信的两根引脚及电源引脚,因此,必须通过非DC引脚方案,即预先传输界定比特的方式,实现对OLED显示屏的控制。
单色显示对于大多数单片机而言,控制上相对充裕,所需资源较少。本次设计采用硬件IIC接口,尽管个人倾向于使用IO口模拟方式控制,但硬件IIC的尝试亦颇具意义,在STM32CubeMX中的配置过程极为简洁:
启动IIC后,直接就可以,采用常规模式100K的速度,什么都不用配置,初始化也不用像定时器那样需要启动,我们直接用一下进行适配就OK了:
<p>void OLED_WR_CMD(uint8_t cmd)</p><p>{</p><p>HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);</p><p>}</p><p>void OLED_WR_DATA(uint8_t data)</p><p>{</p><p>HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100);</p><p>}</p>
在SSD1315的驱动编写过程中,核心在于对网络资源的有效利用及寄存器的精确配置。中景园提供的官方例程对于初始化步骤具有指导意义,该步骤是实现显示功能的前提。显示操作本身并不复杂,关键在于完成必要的初始化后,执行固定位置的显示指令。鉴于显示区域的局限性,采用英文内容展示能更有效地利用空间,同时保证显示的连贯性和可读性:
<p>uint8_t CMD_Data[]={</p><p>0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40,0xA1, 0xC8, 0xDA,</p><p>0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6,0x8D, 0x14,</p><p>0xAF};</p><p>void OLED_Init(void)</p><p>{</p><p>HAL_Delay(200);</p><p>uint8_t i = 0;</p><p>for(i=0; i<23; i++)</p><p>{</p><p>OLED_WR_CMD(CMD_Data[i]);</p><p>}</p><p>}</p>
请注意,初始化完成后的屏幕将呈现花屏状态,此现象表明显示功能正常。随后需执行清屏操作,将屏幕底色统一设置为单色,非黑即白。接下来进行字符串显示,具体展示内容为“21IC STM32C092”。本章节旨在进行功能演示,简要呈现效果如下:
|