历史上的今天
今天是:2025年02月19日(星期三)
2020年02月19日 | STM8L152的LCD模块原理及驱动
2020-02-19 来源:eefocus
STM8L182内部集成了一个高达320个像素LCD的驱动模块。框图如下:

1. 配置LCD的时钟源、分频比、占空比、偏移电压、启用LCD端口复用功能、清晰度,并使能LCD功能。
void LCD_Config(void)
{
/* Enable RTC CLK */
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
/* Enable RTC CLK */
CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);
/* Choice CLK Source, HSI_Freq = 16M, RTC_Freq = 500Khz*/
CLK_RTCClockConfig(CLK_RTCCLKSource_HSI,CLK_RTCCLKDiv_32);
/* Frequence = 500K/(32+16) Frame_Freq = Frequence/Duty = 60Hz */
LCD_Init(LCD_Prescaler_32, LCD_Divider_16, LCD_Duty_1_8,
LCD_Bias_1_3, LCD_VoltageSource_External);
/* Enable PM */
LCD_PortMaskConfig(LCD_PortMaskRegister_0, 0xFF);
LCD_PortMaskConfig(LCD_PortMaskRegister_1, 0x0F);
LCD_PortMaskConfig(LCD_PortMaskRegister_2, 0x00);
LCD_PortMaskConfig(LCD_PortMaskRegister_3, 0x00);
LCD_PortMaskConfig(LCD_PortMaskRegister_4, 0x00);
LCD_PortMaskConfig(LCD_PortMaskRegister_5, 0x00);
/* LCD_Contrast_Level_7: Medium Density / High Density Maximum Voltage = 3.30V / 3.51V */
LCD_ContrastConfig(LCD_Contrast_Level_7);
/* No dead time */
LCD_DeadTimeConfig(LCD_DeadTime_0);
/* LCD_PulseOnDuration_7: Pulse ON duration = 7/CLKprescaler */
LCD_PulseOnDurationConfig(LCD_PulseOnDuration_7);
LCD_Cmd(ENABLE);
}
其中LCD_PortMaskRegister: The LCD register index in the port mask matrix.相关的寄存器为:

只用到12个SEG,置位PM0的8位和PM1的低4位。
2. 关闭、打开、清屏操作
void LCD_OFF(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, DISABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_LCD, DISABLE);
}
void LCD_ON(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);
}
void LCD_Clear(void)
{
uint8_t i=0;
for(i=0;i LCD->RAM[i]=0; LCD_PageSelect(LCD_PageSelection_SecondPage); LCD->RAM[i]=0;} } 在LCD_Clear();函数中,因为项目中用到8个COM,所以有2个Page(LCD_PageSelection_FirstPage,LCD_PageSelection_FirstPage)。 3. 配置好LCD的相关寄存器,往LCD的RAM里面写数据。 例如这样一块屏: 根据规格书,的出对应的RAM列表 #define a 0x01 #define b 0x02 #define c 0x04 #define d 0x08 #define e 0x10 #define f 0x20 #define g 0x40 #define NONE 0x00 const unsigned int LCD_MODEL[]= { {a+b+c+d+e+f}, //0 {c+b}, //1 {a+b+d+e+g}, //2 {a+c+b+d+g}, //3 {c+b+f+g}, //4 {a+c+f+d+g}, //5 {a+c+e+f+d+g}, //6 {a+c+b}, //7 {a+c+e+b+f+d+g}, //8 {a+c+b+f+d+g}, //9 } /** * 假如显示0,0对应的值的二进制位01111111,通过对比表中的位置,进行移位赋值操作 */ void Display_LCD_Num(u8 NUM) { LCD_PageSelect(LCD_PageSelection_FirstPage); /* 清除C、D段位的显示 */ LCD->RAM[LCD_RAMRegister_0]&=(~0x03); /* 写入C、D段位的值 */ LCD->RAM[LCD_RAMRegister_0]|=(((LCD_MODEL[Data]>>1)&0x02)+((LCD_MODEL[Data]>>3)&0x01)); /* 清除G、E段位的显示 */ LCD->RAM[LCD_RAMRegister_3]&=(~0x30); LCD->RAM[LCD_RAMRegister_3]|=(((LCD_MODEL[Data]>>1)&0x20)+((LCD_MODEL[Data])&0x10)); /* 清除B、F段位的显示 */ LCD->RAM[LCD_RAMRegister_7]&=(~0x03); LCD->RAM[LCD_RAMRegister_7]|=((LCD_MODEL[Data]&0x02)+((LCD_MODEL[Data]>>5)&0x01)); /* 清除A段位的显示 */ LCD->RAM[LCD_RAMRegister_10]&=(~0x10); LCD->RAM[LCD_RAMRegister_10]|=((LCD_MODEL[Data]<<4)&0x10); //A } 



史海拾趣
|
使用altera cycloneIII, 外接20M晶振,接内部一个1:1的PLL(PLL输入20M, 输出也是20M), 在许多引脚上都感应出40M的脉冲波形,是什么原因啊? … 查看全部问答> |
|
各位高手,在shell中用spy可以查看各个任务以及总的cpu利用率,并用一个表列出结果,现在我只想取出空闲率这个数据,请问该怎样实现呢?… 查看全部问答> |
|
#include #define uchar unsigned char #define uint unsigned long int #define RS RB4 #define E RE2 #define UPKEY RB1 #define DOWNKEY RB2 #define CLRKEY RB5 uchar table[]=\" 000:000:000 ...… 查看全部问答> |
|
手持设备,操作系统为WINCE,当USB接口接上电脑的时候为手持设备为disk mode,而接上带USB接口的充电器就充电, 现在的问题是:我怎样区分插上的另一头连接计算机的USB线,还是另一头个就是AC供电器的线。wince usb驱动里面 怎样标志他们的不同呢 ...… 查看全部问答> |
|
如题,9B96的EPI模块能用于访问并行接口的AD吗? EPI模块为什么要强调地址总线,还有EPI时钟,这些好像不是为AD这样的东西准备的吧,那是不是说EPI模块就不能用于访问并行接口的AD呢? 完全不懂,请大家不要见笑,多多指教我哦……… 查看全部问答> |




