ST7920驱动的LCD12864实现单行反白显示

本文地址:https://www.cnblogs.com/jqdy/p/13906346.html

  用12864显示菜单时,将当前项菜单反白显示是一个比较常见的显示效果。然而,ST7920驱动的12864模块扩展指令集中的反白显示(Reverse)功能,却没有什么实际使用价值。因为反白第1行时,第3行也同时反白了;反白第2行时,第4行也同时反白了。

  查阅网上资料,向DDRAM写入文字,再向文字所在处的GDRAM内存相应位置写入“1”,可实现反白效果。

  为此,研究了一下ST7920的图形操作。

1.  GDRAM内存与屏幕的对应关系

  GDRAM空间有64×256 bit 组成。使用扩展指令集中的Set Graphic RAM Address指令将GDRAM地址添加到AC(Address Counter)之后,就可向GDRAM写入数据了。Set Graphic RAM Address是一个两字节指令,连续写入垂直地址(第一个字节)和水平地址(第二个字节)就可完成该指令。这样就需要首先了解垂直地址、水平地址和GDRAM空间的关系。

  • GDRAM的64个bit,每个 bit 对应着一行像素,从上到下分别记作0~63,这就是所谓“垂直地址”。
  • GDRAM的256个bit,每个 bit 对应着一列像素,从左到右分成16组,每组包含16列像素,这16组像素依次分别记作0~15,这就是所谓“水平地址”,那么16组×16列像素/组=256列像素。

  可见,GDRAM的垂直地址有64个(0~63),水平地址有16个(0~15)。利用Set Graphic RAM Address指令时,就是使用这两组数据。那么,这两组数据和屏幕的实际对应关系是怎样的呢?

  如下图所示:12864屏幕只使用了上一半的GDRAM内存:

  • 屏幕的第一行全宽字符:对应的垂直地址是0~15,水平地址是0~7
  • 屏幕的第二行全宽字符:对应的垂直地址是16~31,水平地址是0~7
  • 屏幕的第三行全宽字符:对应的垂直地址是0~15,水平地址是8~15
  • 屏幕的第四行全宽字符:对应的垂直地址是16~31,水平地址是8~15

2.  如何向GDRAM写入数据

  使用Set Graphic RAM Address指令写入垂直地址和水平地址之后,AC中就存储了指定的GDRAM地址了,此时利用写数据指令,就会向GDRAM中写入图形数据了。

  垂直地址好理解,一个垂直地址就是一行像素的垂直位置。

  一个水平地址指向16个 bit 数据,代表着屏幕上16个像素,这16位数据分别称作 b15~b0,如上图所示。值为1的位代表亮点,值为0的位代表暗点。因此连续写入两个字节的数据,就可完成一个水平地址的写数据操作。根据Entry Mode设置的方向,写完这两个字节后,AC会自动±1。接着就可直接写下一个水平地址包含的16位数据了。

  连续写入数据时有一个问题需要注意,当AC中的水平地址为15时,写入16位数据后,AC中的水平地址将会自动变成0,而垂直地址不会发生变化。也就是说,当写满一行后,如果不调整垂直地址,就会反复在同一行中写入,从而将前面写入的数据擦除。

  因此向GDRAM写入数据的流程是:

  • 使用Set Graphic RAM Address指令,连续写入垂直地址和水平地址
  • 使用写数据指令,写入b15~b8位构成的一个字节,再写入b7~b0位构成的一个字节
  • 根据需要看是否需要调整AC中的垂直地址和水平地址,然后再继续写入下一个水平地址的16个位

  将一个全宽字符(汉字)位置对应的GDRAM全部写1,就可实现这个汉字的反白效果,将一行全宽字符位置对应的GDRAM全部写1,就可实现该行的反白,这样就实现了菜单的反白显示目的。

3. 切换基本指令集和扩展指令集需要注意的问题

  写字操作的是DDRAM,画图操作的是GDRAM,相关指令分属基本指令集和扩展指令集。因此,在反白显示操作时需要在两个指令集中切换,切换涉及的寄存器结构如下,我采用的串行通讯,所以RS、RW不用考虑,仅考虑寄存器本身的位即可,其中DL位是8、4位并行通讯格式的选择位,我也不用考虑,直接取0,使用8位并行通讯时取1。

  在基本指令集和扩展指令集中切换时,注意不要影响DB1-G位。

  • 执行指令:0x20(DB5=1,RE=0,G=0),可进入基本指令集,同时关闭图形模式(将所画图形隐去,但GDRAM中的数据还在,再次开启图形模式时就会直接显示图形)
  • 执行指令:0x22(DB5=1,RE=0,G=1),可进入基本指令集,同时保持图形模式开启(可操作DDRAM,例如写字等,不影响后面的图形,字型和图形都是1的像素会反白)
  • 执行指令:0x24(DB5=1,RE=1,G=0),可进入扩展指令集,但不开启图形模式
  • 执行指令:0x26(DB5=1,RE=1,G=1),可进入扩展指令集,同时开启图形模式

 

  

 

 

 

  

 

posted @ 2020-11-05 16:58  jqdy  阅读(1954)  评论(0编辑  收藏  举报