STM8L单片机驱动LCD-LCD的驱动
今天记录下,使用STM8L152驱动LCD段码屏。
一般来讲,使能单片机外设需要进行如下配置:
1、如涉及到IO端口,须配置IO口,如设为输入/输出/浮空输入或者进行复用功能重映射等。注意,在某些单片机,如stm32,还需要使能相应端口时钟。
2、使能外设端口时钟。
3、配置外设参数,初始化外设。
4、开启中断等功能。
下面说下如何驱动LCD:
针对STM8L152 LCD外设部分,需要注意两个寄存器:
1、LCD_PM寄存器,对端口LCD复用功能的配置。
LCD_PM寄存器
对相应BIT位置1使能LCD复用功能,清零则为普通IO口。
2.LCD_RAM寄存器,LCD显示缓冲寄存器。
LCD_RAM寄存器
对stm8l152c6单片机来说,共有4个COM23个SEG,14个LCD_RAM寄存器:COM0-RAM0/1/2、COM1-RAM3/4/5/6、COM2-RAM7/8/9、COM3-RAM10/11/12/13
LCD驱动初始化程序如下:
LCD驱动初始化程序
需要注意的是,由于LCD频率发生器使用的时钟源是RTC时钟,所以必须使能RTC时钟。
频率发生器
STM8L152单片机LCD相关引脚
从原理图中可看出,我们使用了4个COM,10个SEG口-SEG8,9,16,17,18,19,20,21,22,23.所以,对LCD_PM配置如下:
LCD_PortMaskConfig(LCD_PortMaskRegister_1,0X03); // seg 8,9为seg口
LCD_PortMaskConfig(LCD_PortMaskRegister_2,0XFF); // seg 16,17,18,19,20,21,22,23为seg口
由于当时规划原理图时,没有仔细研究LCD外设,导致程序驱动,有些复杂。这应该引以为戒!
本次实验显示一个数需要驱动四个LCD_RAM,每个RAM中的2个SEG.如显示灵敏度值,则需要配置LCD_RAM1,4,8,11,显示延时,则需要配置LCD_RAM2,6,913等。
简单程序实例如下:
typedef enum {DELAY,SENSE,...}ITEM_t;
typedef struct
{
ITEM_t Item;
INT8U RamValue[4];
}FIGURE_t;//定义一个包含显示项目类型以及需要显示段的结构体类型。
const FIGURE_t FigureGroup[42]=
{
......
{SENSE,{0x02,0x30,0x01,0x30}}, //0
{SENSE,{0x00,0x20,0x00,0x20}}, //1
{SENSE,{0x02,0x10,0x02,0x30}}, //2
......
{DELAY,{0x30,0x03,0x10,0x03}}, //10
{DELAY,{0x10,0x02,0x00,0x02}}, //11
{DELAY,{0x30,0x01,0x20,0x03}}, //12
{DELAY,{0x30,0x02,0x20,0x03}}, //13
};//显示缓冲数组
显示驱动
void DISP_ShowFigure(INT8U num)
{
INT8U temp=num;
switch(FigureGroup[temp].Item)
{
...
case SENSE:
LcdCache1&=0xfc;
LcdCache1|=FigureGroup[temp].RamValue[0];
LcdCache4&=0xcf;
LcdCache4|=FigureGroup[temp].RamValue[1];
LcdCache8&=0xfc;
LcdCache8|=FigureGroup[temp].RamValue[2];
LcdCache11&=0xcf;//数据处理以防对其他显示SEG产生影响
LcdCache11|=FigureGroup[temp].RamValue[3];
LCD_WriteRAM(LCD_RAMRegister_1,LcdCache1);
LCD_WriteRAM(LCD_RAMRegister_4,LcdCache4);
LCD_WriteRAM(LCD_RAMRegister_8,LcdCache8);
LCD_WriteRAM(LCD_RAMRegister_11,LcdCache11);
break;
case DELAY:
......
break;
......
}
}
显示效果
STM8L单片机驱动LCD-LCD的学习记录
由于最近一款产品需要LCD显示,综合考虑了一下,所以选取了带有LCD驱动外设的STM8L152这款单片机。今天就记录一下LCD段码屏的学习吧!
stm8l152c6t6
LCD段码屏
一般来说,驱动LCD段码屏,我们只需要考虑三个参数:
1/3Bias,1/4Duty
1、Duty(占空比):
Duty这个参数主要由LCD本身的COM(公共极)的个数决定。LCD一般是采用时分动态扫描的驱动模式,即每个 COM 下段的有效导通时间为一个扫描周期的1/COM数,即每个COM的占空比(Duty) 为 1/COM 数。
2、Bias(偏置电压):
LCD 的驱动波形为模拟信号。LCD输出的最小模拟电压与最高电压的比例称为偏置。一般来说,Bias的选择与COM使用个数有关:COM使用个数越多,周期内各COM段导通时间越短,对比度就会降低。若想提高对比度,则需要增大Bias。
3.Frame:扫描帧频
扫描频率则会影响LCD的显示效果和功耗。扫描频率过高,会导致驱动功耗的增加;扫描频率过低,则又会导致LCD显示闪烁。
其实,LCD段码屏的驱动本质上和数码管的驱动是一样,即通过SEG/COM间加电压使段码显示,分时扫描各段,并通过调整频率避免闪频。当然区别也是明显的:LCD段码屏需要单独的驱动片或单片机本身带有LCD外设,驱动程序十分简单;数码管则可以直接使用单片机驱动或者为了节约IO口使用74HC595这种常规位移缓存芯片,程序较为复杂点。
数码管
74HC595
相关问答
单片机 怎样用C语言实现二进制转十进制并在 LCD 中 显示 - 人生...把二进制转换为ascii码,自然在LCD显示假设被转换的二进制数为tempunsignedchari=0;unsignedchardis_buf[3];for(i=0;i<3;i++){dis...
单片机 怎样用C语言实现二进制转十进制并在 LCD 中 显示 - MBJDX...假设被转换的二进制数为tempunsignedchari=0;unsignedchardis_buf[3];for(i=0;i<3;i++){dis_buf[i]=temp%10;temp/=1...
51 单片机lcd 1602如何 显示 数字变量?1602是可以显示字符的,如'1','2'等,可以设置一个字符串,如charAA[]={'0123456789'}那么设置一个变量i,AA[i]就行...
哪个 单片机 自带触摸按键和 lcd 功能?触摸的单片机有,新塘,赛普拉斯,昆泰,ST,飞思卡尔,TI,ADS…触摸的单片机有,新塘,赛普拉斯,昆泰,ST,飞思卡尔,TI,ADS…
如何在线实时监控调试 单片机程序 运行?在线实时监控调试单片机程序运行只有一种方式:程序在线仿真。在线实时监控单片机程序运行可以有多种方式:在线仿真;程序实时输出运行状态(可通过LED,LCD等显...
LCD 12864的屏总是在闪,我是用51 单片机 做的,屏带字库,补充里...看了你的程序,问题在while里面。没必要循环初始化你的LCD,将初始化程序放到主函数中。你的显示函数中也已经包含了清屏指令,不需要在while里面再次加入清屏指...
请问如何用STC 单片机 直接驱动段码 LCD ,具体那些型号,各位高手可否提供方法与参考代码?1602吧,我们做过那个,挺简单的,随便一本单片机书上都有他的代码,汇编写的,也有c的,我这有一段它的控制显示代码,C的,不短1602吧,我们做过那个,挺简单的,随便...
请问在 单片机 LCD 中初始化时 0x38 0x01都可以理解 但是0x80 ...0x80不是初始化的命令,是显示区域第一行第一个字符的寄存器地址,往这个地址写字符就在第一行第一个位置显示相应的字符。在这个地址的基础上加多少就表示偏移第...
LCD 1602在编写 程序 写指令用到OX80、OX30分别代表什么意思?write_cmd(OX80+OX40);表示在第二行第一位显示write_cmd(OX80);表示在第一行第一位显示write_date(OX30+shi);中OX30+0,1,2,3~9是表示...
用 单片机 焊接好 lcd 屏幕一直闪烁怎么办?首先确定你焊接没虚焊假焊,其次检查供电,在检查是否单片机程序作怪,最后就能判断出是不是LCD的问题了首先确定你焊接没虚焊假焊,其次检查供电,在检查是否单片...