我对LCD液晶驱动还是朦朦胧胧的时候,遇上了这个刚硬的task。
所以,写下这个帖子,为后面的同学填坑!
说一下遇到问题的时候啊,不应该张口就问(我感觉我有时候就是,自己不动脑):
首先,你要知道自己的问题在哪儿,把问题罗列清楚,就已经解决一半了。
其次,查资料,百度,Google,必应等搜索引擎;发烧友,21IC,51黑,CSDN,开源电子网,野火电子论坛等各种论坛。
最后,运用官方手册,咨询(液晶)厂家官方,配合程序代码的配置,看了又看,翻译之后再翻译,捋一捋清楚;示波器、程序调试仿真,来了又来!我敢保证问题就解决了。
进入正题:
1、状态描述,LCD段码液晶屏幕驱动,我写这个驱动的时候,还不太清楚原理,就网上找了一下,大楷了解了,就是用方波信号驱动,如下图:
2、波形分析,3channel和4channel是COM信号,2channel是SEG信号,我是点亮所有段的程序,所以这里呢,SEG信号对应的两个COM也就是2段都会亮,在段码的任意一个高(低)电平,2个COM都
会有与之对应的相反电平且各占一半,这里又要插入一份液晶屏厂家提供的液晶资料,如下图:
这是由2个COM口,25个段码组成的屏,参数的话主要就是看驱动模式和电压,图上的5V电压有误(应该是3.3V),可以看到占空比是1/2,偏压也是1/2,
然后驱动频率>128Hz,从波形中看出来我们的配置没有问题,其他的参数可以自行了解。这里再插入一张STM8的LCD_CR1寄存器的图:
初始化如下:
void LCD_init(void)
{
/*
系统时钟HSI=16MHz , LSI=38KHz
1、LSI clock used as RTC clock source
2、RTC clock source / 2
*/
CLK_CRTCR = 0x24;//RTC_CLK = 38KHz/2= 19KHz
CLK_PCKENR2 = 0x08;//开启LCD时钟
/*
19KHz = RTCCLK / 2 to LCD
19KHz = (Halt) LCDCLK
*/
LCD_FRQ=0x10;//这里 2PS[3:0]=2^1=2 ; DIV[3:0]+16=? 1.8ms*4=5.2 192.3Hz 7ms 142.86Hz
LCD_CR1=0x03;// 1/2duty 1/2bias 0x03
/*
高驱动使能
该位永久启用低电阻分压器。 内阻高的显示器可能
需要更长的驱动时间才能获得令人满意的对比度,因此如果存在
没有强大的功率约束。
*/
LCD_CR2=0x1E;//PON调节对比度 将高性能驱动打开就OK
LCD_CR3=0x03;//1-phase period dead time
LCD_CR4=0x00;//
//Configures the LCD Port Mask.
LCD_PM0=0xFF;
LCD_PM1=0xFF;
LCD_PM2=0xFF;
LCD_PM3=0x01;
LCD_PM4=0x00;
LCD_PM5=0x00;
LCD_CR3|=0x40;//LCD enable
//点亮所有的段
/*LCD_RAM0=0xff;LCD_RAM1=0xff;LCD_RAM2=0xff;LCD_RAM3=0xff;
LCD_RAM4=0xff;LCD_RAM5=0xff;LCD_RAM6=0xff;LCD_RAM7=0xff;
LCD_RAM8=0xff;LCD_RAM9=0xff;LCD_RAM10=0xff;LCD_RAM11=0xff;
LCD_RAM12=0xff;LCD_RAM13=0xff;LCD_RAM14=0xff;LCD_RAM15=0xff;
LCD_RAM16=0xff;LCD_RAM17=0xff;LCD_RAM18=0xff;LCD_RAM19=0xff;
LCD_RAM20=0xff;LCD_RAM21=0xff; */
}
3、问题现象,我之前配置出来的现象是COM2端口的所有SEG段比COM1端口的所有SEG暗,应该是驱动能力不够!
后面打开LCD_CR2的bit4,就感觉好很多了,功能描述如下:
High drive enable
This bit permanently enables the low resistance divider. displays with a high internal resistance may
need longer drive time to achieve a satisfactory contrast, so the software can set the HD bit IFthere is
高驱动使能
该位永久启用低电阻分压器。 内阻高的显示器可能
需要更长的驱动时间才能获得令人满意的对比度,因此如果存在
没有强大的功率约束。
看起来整体暗了一点,
有点怀疑液晶屏内阻较大,单片机的驱动能力不够,but , it looks much better ,isn't? ~~~
4、段码如何和显存地址对应起来
可以从手册中看出来STM8L152是高密度型器件,那么他就有8个COM,44个SEG,但是我这里呢,只用了2个COM,25个SEG,看网上说的用4个COM还是8个COM会有问题(
没有试过,不知道!)
那么液晶厂家给的PIN脚和COM脚对应的单片机引脚怎么和液晶的显示缓存地址对应起来,实现把数据写到缓存对应的SEG段就会亮呢?
我们的COM脚和SEG脚在STM8L152数据手册上已经给出了
我们就是对应这里的LCD_COMx和LCD_SEGx,然后再看一张显存表,一张SEGx段对应的COMx[y]口关系图和一张中高密度器件如果要用8个COM的控制寄存器LCD_CR4:
现在就很清晰了,对不对,就是SEG0[Pin]=COM0[Pin] , SEG1[Pin]=COM1[Pin],Pin就是你连接到单片机的引脚对应的LCD_SEGx,COM就是你接到单片机的COM0~COM7;
我这里LCD液晶屏资料的COM1连到单片机的COM0,COM2连到单片机的COM1,Pin脚1~25接到单片机的LCD_SEG0~LCD_SEG24;所以我要点亮P1这个笔段的话
就是S0[SEG0]或者就说S0[0]=1就行了,然后对应单片机内存地址0x0C(LCD_RAM0)这个地址(寄存器)的第0位写1,就能点亮了。
see you next time
2