使用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);

显示效果如下图,可以验证和我们想要的字符图形一致:


    

作者:小白小菜。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32 HAL库驱动IIC LCD段码屏

发表评论