zoukankan      html  css  js  c++  java
  • 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),可进入扩展指令集,同时开启图形模式

      

      

  • 相关阅读:
    FFmpeg 视频处理入门教程
    FFmpeg 视频处理入门教程
    Flutter音视频裁剪flutter_ffmpeg踩坑笔记
    Centos7 tiup搭建tiBD集群、扩容、缩容存储节点、修改监控节点
    tiup实操部署tidb5.1.0 最新版本
    利用ogg实现oracle到kafka的增量数据实时同步
    比喻
    git分布式版本控制系统
    并行和并发区别
    git合并本地分支
  • 原文地址:https://www.cnblogs.com/jqdy/p/13906346.html
Copyright © 2011-2022 走看看