使用STM32 HAL库驱动IIC LCD段码屏
由于LCD段码屏功耗极低,所以在低功耗应用中非常广泛,首先我们来看下LCD段码屏的最终显示效果图:
段式LCD的引脚一般分为SEG和COM,COM作为公共驱动,SEG作为区段驱动,即单个COM和多个SEG段共同控制着LCD上部分像素点。如下表所示:
由于应用场合不同,我们可以根据自己的需求找厂家定制自己所需要的段码屏,如果用单片机直接驱动段码屏,不仅浪费管脚,而且程序繁杂,因此这里我们采用单片机+IIC通讯方式的驱动芯片CNV1792S,(数据手册可以到旌芯半导体官网下载),从数据手册中我们可以得知,该驱动芯片采用的是标准的IIC通讯,故我们直接采用STM32单片机的硬件IIC接口进行驱动就可以了,我们不着急建立工程,先来看下手册中一些比较重要的命令以及写数据的格式:
解析:(模式设置)
D7:数据最高位C指的是如果该位为0,则下一个字节是写入RAM的数据;如果该位为1,则下一个字节则是命令;
D3:如果该位为0,则输出全部停止,D3位为1时输出才有效;
D2:如果该位为0,输出波形采用1/3Bias,该位为1时采用1/2Bias的波形,如下图:
1/3Bias
1/2Bias
解析:(地址设置)
D4—D0:可以设置RAM的地址
常用的命令还有下边列举出来的一些,我就不一一解析了,大家可以在数据手册中找到,写的非常详细
显示数据的例子我们来详细的看下:
上边两张图可以看出,当COM和SEG所对应的笔段为1时,则该段点亮,这样我们就可以对RAM寄存器给予一定的值,来显示我们所需要的字符了,接下来我们打开STM32CubeMX,建立一个新工程,使能硬件I2C3,并设置合适的时钟,由于比较简单,我在这里就不贴图了,下面我们直接看生成后的代码:
// 这里我们根据段码屏做的一些定义,方便测试用
// 1---0x0A 2---0xBC 3---0x9E 4---0x4E 5---0xD6[5,6,7,8,9,10] V---0x01[10]
// 6---0xF6 7---0x8A 8---0xFE 9---0xEE 0---0xFA
// 电池:0---0x08 1---0x18 2---0x38 3---0x78 4---0xF8 蓝牙---0x04[12]
// 信号:0---0x08 1---0x0A 2---0x0E 3---0x0F[11]
// 单位:Mpa---0x80 Kpa---0x40 %---0x20 。C---0x10[11]
// 模式:进口---0x08 出口---0x04 浓度---0x02 设置---0x10 报警---0x80[13]
//这是根据数据手册我定义的一些数组,可以方便直接调用
#define ADDRES 0x7C//地址
uint8_t LCD_Init[12] = {0xEA,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//初始化
uint8_t LCD_Display[4] = {0xBF,0xF0,0xFC,0xC8};//显示开启
uint8_t LCD_WriteRAM[14] = {0xBF,0xF0,0xFC,0xC8,0x00,0xFA,0xFF,0xFA,0xFE,0xFA,0xFE,0x8F,0xF8,0x08};//写RAM
uint8_t LCD_ALLON[] = {0xFE};//全部点亮
uint8_t LCD_Close[] = {0xC0};//显示关闭
下面是我在主程序中添加的一些代码,上电初始化完成后我们先延时100ms(可以根据需求进行填写此值,这里仅作测试用),然后再对LCD屏进行初始化,RAM地址设为00000,RAM中的数据全部写0x00:
HAL_Delay(100);
HAL_I2C_Master_Transmit(&hi2c3,ADDRES,&LCD_Init[0],12,1000);//初始化
这里我们用到最多的函数就是HAL_I2C_Master_Transmit(),函数解析如下:
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
uint16_t Size, uint32_t Timeout)
函数解析:
I2C_HandleTypeDef *hi2c:句柄
uint16_t DevAddress:从设备地址
uint8_t *pData:发送的数据起始地址
uint16_t Size:发送字节个数
uint32_t Timeout:超时时间
我们在While循环中添加自己的程序,该程序主要是显示特定的字符5秒后关闭显示,一秒后重新显示,如此往复:
HAL_I2C_Master_Transmit(&hi2c3,ADDRES,&LCD_Display[0],4,1000);
LCD_WriteRAM[5]=0x0A+1;
LCD_WriteRAM[6]=0xBC+1;
LCD_WriteRAM[7]=0x9E+1;
LCD_WriteRAM[8]=0x4E+1;
LCD_WriteRAM[9]=0xD6+1;
LCD_WriteRAM[10]=0xF6;
LCD_WriteRAM[12]=0x08+0x04;
LCD_WriteRAM[13]=0x08+0x80+0x10;
HAL_I2C_Master_Transmit(&hi2c3,ADDRES,&LCD_WriteRAM[0],14,1000);
HAL_Delay(5000);
HAL_I2C_Master_Transmit(&hi2c3,ADDRES,&LCD_Close[0],1,1000);
HAL_Delay(1000);
显示效果如下图,可以验证和我们想要的字符图形一致:
作者:小白小菜。