技术文档

单片机lcd显示程序 STM8L单片机驱动LCD-LCD的驱动

小编 2024-10-09 技术文档 23 0

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的问题了首先确定你焊接没虚焊假焊,其次检查供电,在检查是否单片...

猜你喜欢