基于ST7920的液晶显示模组LCM12864之自定义字模篇
为了保证文章的完整性,我们再次简单回顾一下ST7920内部存储器的基本构成。DDRAM是数据显示存储器(Data Display RAM),该存储器的每个单元都是16位(2个字节),当你往其中写入2个字节的字模地址(不是字模本身,先写高字节,后写低字节),屏幕上就会显示相应字库中定义的字符。GDRAM为图形显示存储器(Graphic Display RAM),与DDRAM不同,我们往其中写入的数据就是字模本身(每次同样写入2个字节,先写高字节,再写低字节),这16位数据就代表屏幕像素的亮灭(0为灭,1为亮)。使用GDRAM也可以显示字库中不存在的字符,但这并非本文的关注点,后续有机会再来讨论。CGRAM也表示字符生成存储器,本质上也是一个字库,只不过我们能够将自己定义的的字模数据写入进去,然后再将相应的字模地址写入到DDRAM即可显示自定义字符。这里重点强调一下CGRAM与DDRAM的区别:DDRAM中的数据只是字模地址,也就是字符相应字模数据的索引,而CGRAM(或CGROM)中字模数据才是真正显示的内容。就如同图书馆一样,CGRAM(或CGROM)中的数据就相当于图书本身,而图书都有一个索引号,这个索引号就相当于DDRAM中的内容(GDRAM中的内容也相当于图书本身,但这些图书没有索引)。如果要让模组显示字库中不存在的字符(就相当于你想借一本图书馆中不存在的图书),就必须首先在CGRAM中创建这个字符(就相当于将图书归入图书馆系统中),然后再将该字符的索引号写入到DDRAM即可(就相当于通过图书的索引号找到相应的图书)ST7920允许用户自定义4个16×16点阵的字符,如下图所示,它们的字模地址分别为0x0000、0x0002、0x0004、0x0006(因为仅B1与B2位有效,相应的值为00,01,10,11,而B0是无效的),它们分别各自代表右侧16个连续CGRAM地址中的数据(整个CGRAM地址空间为0x00~0x3F)。也就是说,如果你想在屏幕上显示自定义的“电”字,则往DDRAM中写入的2个字节数据依次为0x00与0x00。如果想显示汉字“子”,则需要往DDRAM中依次写入0x00与0x02(先写高字节,再写低字节)
那字模数据到底以何种顺序写入到CGRAM呢?同样是以2个字节为一个单位写入,完整的一个汉字应该由32个字节构成。以汉字“电”为例,相应的CGRAM数据由左至右(先高字节,再低字节)、从上至下如下图所示。
好的,现在开始正式自定义字模!基本思路是,首先需要使用指令定位CGRAM地址到0x00(当然,也可以是0x20、0x40、0x60,只需要注意字模地址不同,但是切勿写入到类似0x21、0x42、0x65等低4位非零的CGRAM地址,因为这样一来,一个完整的汉字字模数据会分别对应2个字模地址,后续显示出来的汉字肯定是不完整的)。当字模数据写入完成后,再使用指令定义到DDRAM地址,最后写入字模地址(此处为0x0000)即可,我们来看看相应发送的数据,如下图所示。
其中,设置CGRAM地址指令0x40表示将当前地址计数器指向CGRAM地址0x00,接下来写入32个字节的字模数据后,再将DDRAM首地址设置为代表屏幕左上角的0x80即可显示相应的字符,最后的效果如下图所示(后续写入的“欢迎关注”等汉字依次右移)
放大后的效果如下图所示:
关联阅读:基于ST7920的液晶显示模组LCM12864之指令篇