老子按:液晶显示,一直都用的是成都飞宇达FYD12864-0402B,由于该液晶自带字库,我也只使用基本的显示功能,觉得很方便很不错。但是今天要求使用扩展功能,比如反白显示、滚屏显示等,就发现很大的问题了。

先说说遇到的两个问题。

  • 首先就是反白显示,从使用手册上来看,扩展指令里的0x03+行号(从0开始)即可反白对应行,看起来本来就不方便了,因为每次都一行感觉实用性不大。可是就这不太实用的功能都有问题,实测效果,反白行为0、1的时候分别反白了第0、2行、第1、3行,每次都同时反白两行,反白第2、3行时没反应。

  • 其次是滚屏显示,这个和理解中的相去甚远。理解中滚屏应该是整屏滚动,结果是第0、1行为一个单元,第2、3行为一个单元,独立滚动。造成滚着滚着,第2行就没了,第1行后面缺搞一堆白板出来。

关于第二个问题,目前没有解决;第一个问题,解决的方法也是无意发现的,后来上网查阅的时候,发现还是有不少兄弟都想到了这个办法,果然是英雄所见略同啊!

解决方法就是混用图形显示和字符显示

在ST7920中,字符显示的CGRAM和图形的GGRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。异或运算拿笔走一走就知道怎么回事儿了。

举例来说,如果某个点上,绘图RAM的没有绘图、数据为0,而字符RAM上有点阵、数据为1,那么异或的结果就是1,也就是说正常显示字符。当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。

如果该点上绘图RAM绘图了、数据为1,当字符RAM上有点阵、数据为1时,异或的结果为0,效果就是反白显示,如果字符RAM没有点阵、数据为0时,异或结果为1,效果就是显示绘图的背景。

所以呢,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地方的绘图即可!这样一来可以实现任何地方、任意大小的反白显示,反而比手册上的功能更好更强大咯。

另外,再列举几个注意事项:

  • 如果要使用绘图功能,必须在初始化的时候清空绘图RAM,否则会花屏。清空的方法效率很低、很原始、很绰,就是用全零填充绘图RAM的每一个单元。

  • 如果用低速晶振,基本上不用考虑时序的问题,比如读忙啊、EA有效时间等等,都可以忽略。但如果是高速系统,或者使用8051Core的情况下,这个问题将非常严重,严重到液晶基本无法正常显示。

  • 开启绘图功能时注意,尽量先写指令开扩展,再写指令开绘图。另外网上很多人说绘图时要先关闭绘图,然后再写数据,再开。我测试的效果刚好相反,不知何故。