STM8L152C8T6TAB段式LCD液晶驱动原理

最近项目中做流量仪表测量产品,使用到了段码LCD,为了简化硬件设计,节约硬件成本,于是想到STM8L152系列单片机集成了LCD 控制器,直接驱动LCD很方便,于是开始了硬件设计,硬件设计不是特别复杂,根据LCD的规格书,有几个公共端,对应的单片机就使能几个公共端与LCD对应公共端连接,段码根据数量使用,stm8l152最多有28个段码,硬件设计完,开始软件调试,问题来了,硬件段码如何与软件显存数据对应,尤其是动态显示的LCD需要公共端和段码配合使用,百度吧,资料有不少,看了好多也没有看明白,于是自力更生,通过阅读手册理解了。
在这里插入图片描述
这个图讲的是单片机硬件端口和LCD的对应关系,一共做多28个段码,用哪个段码了,软件上就使能那个iO的段码功能。那么对于多为数据,用同一个段码,那软件如何操作呢,平时我们知道动态显示就是段码送显示的数据,对应为的公共端COMX使能,对应为就亮,万变不离其中,这个也是这样的原理只不过,对于stm8l152不是直接操作段码而是把数据先写到显存中,显存中每个公共端对应最多28位,你想让哪位数码管亮,就把数据写到对应显存上去,单片机会自动映射到硬件的段码上
在这里插入图片描述
在这里插入图片描述

看上图了么,比如硬件上你使能了12个段码seg0 ~ seg11,LCD一共有四位数码管,那么就有4个公共端com0 ~ com3,想要数码管1亮,那么数据写到缓存s0[0:11],那么单片机会自动把数据通过硬件的seg对应的io输出到lcd点亮数码管,以此类推如果要第二位数码管亮,那就要把段码数据写到s1[0:11],这样第二位数码管就亮了。

还有个注意点,就是硬件设计上,如果单片机的VLCD信号外接了电源,那软件中要使能外部电源,反之则使能内部电源。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是初始化STM32F103C8T6驱动LCD1602液晶屏的程序示例(使用C语言): ``` #include "stm32f10x.h" #include "delay.h" // 自定义的延迟函数库 // LCD1602液晶屏引脚定义 #define LCD_RS GPIO_Pin_0 #define LCD_RW GPIO_Pin_1 #define LCD_EN GPIO_Pin_2 #define LCD_D4 GPIO_Pin_4 #define LCD_D5 GPIO_Pin_5 #define LCD_D6 GPIO_Pin_6 #define LCD_D7 GPIO_Pin_7 void LCD_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟 // 设置LCD1602引脚为输出模式 GPIO_InitStructure.GPIO_Pin = LCD_RS | LCD_RW | LCD_EN | LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void LCD_Init(void) { // 首先要等待1602上电稳定 Delay_Ms(100); // 初始化开始 LCD_WriteCommand(0x38); // 8位数据接口,2行显示,5x7点阵 Delay_Ms(1); LCD_WriteCommand(0x08); // 关闭显示 Delay_Ms(1); LCD_WriteCommand(0x01); // 清除显示 Delay_Ms(1); LCD_WriteCommand(0x06); // 设置输入方式:光标右移,不移动屏幕 Delay_Ms(1); LCD_WriteCommand(0x0C); // 开启显示,光标关闭,光标闪烁关闭 Delay_Ms(1); } void LCD_WriteCommand(uint8_t cmd) { GPIO_ResetBits(GPIOB, LCD_RS); // RS引脚为0表示写入的是命令 GPIO_ResetBits(GPIOB, LCD_RW); // RW引脚为0表示写入模式 GPIO_SetBits(GPIOB, LCD_EN); // 使能EN引脚 GPIO_Write(GPIOB, (GPIO_ReadOutputData(GPIOB) & 0xFF00) | cmd); // 写入命令 Delay_Ms(1); GPIO_ResetBits(GPIOB, LCD_EN); // 禁止EN引脚 } void LCD_WriteData(uint8_t data) { GPIO_SetBits(GPIOB, LCD_RS); // RS引脚为1表示写入的是数据 GPIO_ResetBits(GPIOB, LCD_RW); // RW引脚为0表示写入模式 GPIO_SetBits(GPIOB, LCD_EN); // 使能EN引脚 GPIO_Write(GPIOB, (GPIO_ReadOutputData(GPIOB) & 0xFF00) | data); // 写入数据 Delay_Ms(1); GPIO_ResetBits(GPIOB, LCD_EN); // 禁止EN引脚 } ``` 这是一个简单的初始化程序,其中包含了初始化GPIO引脚和初始化LCD1602的函数。在实际应用中,还需要根据实际情
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值