昨晚编写液晶屏显示程序的时候遇到了两个问题:
1.LED背光点不亮;
2.开机LCD亮的瞬间有花屏,并且LCD每帧图片显示的时候不是从 Y 轴的零点开始刷新;
issue
找了大量资料,最终把这两个问题都解决了,这两个问题竟然都和LCD屏的初始化有关。
关于问题 1 的分析:
开机后,屏幕不亮,这显然是背光没有点亮,参照了一下LCD的背光电路图:

图一
图一为LCD背光驱动电路,由图中可提炼出三条对编程有用的信息:
1. KEYBOARD 为输入项,当 KEYBOARD 有效时,可点亮背光;
2. KEYBOARD 高电平有效;
3. LED+ 和 LED- 为输出;
然后,又参照了芯片的GPIO引出管脚图:

图二
由上图可知 KEYBOARD 接到了 GPB0 上。
又去核验了一下代码中 GPBCON 寄存器的配置表:
![]()
图三
由图中可知 GPB0 应该设置为 01 Output 模式,没错。
然后又去复核了一下代码中 LCDCON5 关于 PWREN 的设置:

图四
发现 PWREN 和 INVPWREN 均已设置。
然后又去复核了一下代码中 LCDCON1 的 ENVID 位:
图五
发现 ENVID 位已经设置。
那么问题来了,为何LCD屏幕的背光仍然没有点亮?
后来查找了大量的资料,最终发现我在代码中虽然设置了 GPBCON 的 GPB0 位,但是没有在 GPBDAT 中写入要输出的值。出现这个问题的原因是我对 LCDCON5 寄存器的理解不透彻,对 GPIO寄存器 和其他控制寄存器的配合使用理解不透彻。前几天写代码的时候,当看到 PWREN 有如下解释:
![]()
图五
当时还以为只要设置了 PWREN ,LCD控制器就会通过 GPB0 向外输出信号。这种理解是错误的,因为此处设置 PWREN 仅表示允许 LCD_PWREN 向外输出。至于输出值则是由 GPBDAT 决定的。至此解决了第一个问题,当我向 GPBDAT 写入高电平之后,LCD屏的背光终于被点亮了。
关于问题 2 的分析:
从视频中可以看到,图片刷新的时候有两个问题,LCD亮的瞬间有花屏,并且LCD每帧图片显示的时候不是从 Y 轴的零点开始刷新。
查找了大量资料,再加上无数次的重复实验,终于解决了问题 2 。
其实问题二是由两个问题组成的:
a.开机在没有输出图片的时候 LED 背光被点亮了;
b.LCD每帧图片显示的时候都不是从 Y 轴的零点开始的。
问题 a 的原因是过早的设置了 LCDCON5 的 PWREN 位,当此位被设置并且 GPBDAT 被写入 1 之后,背光就开始亮了,这亮的太早了。要等输出图片之前再点亮,不要太早使能。
#if 1
LCDCON5 |= (the_polarity.INVLEND << 4);
#if 0
LCDCON5 |= (the_polarity.PWREN << 3);
#endif
LCDCON5 |= (the_polarity.ENLEND << 2);
LCDCON5 |= (the_polarity.BSWP << 1);
#endif
LCDCON5 |= (the_polarity.HWSWP << 0);
当把 PWREN 位的设置注释掉,并且把 PWREN 位的设置移到 controller_enalbe() 之后 解决了问题 a。
问题 b 的原因是过早设置了 LCDCON1 的 ENVID 位,如果过早打开此位,而图片没有随后立刻到来,那么就会有杂乱的条纹输出,而后图片到来之后,图片就没有从 Y 轴的零点开始输出,而是从白底时杂纹开始的地方一帧帧的刷新图片。
223

被折叠的 条评论
为什么被折叠?



