深圳市航顺芯片技术研发有限公司
直播中

王健

7年用户 958经验值
私信 关注
[问答]

在LCD上显示字符或者汉字是怎么实现?

lcd12864基本特性参数是什么?
lcd12864具有哪些引脚功能?
在LCD上显示字符或者汉字是怎么实现?

回帖(1)

蔡晨史

2021-9-29 15:23:50
lcd12864简介

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字。也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
注:
我们所用的LCD屏的命名,基本都是按照其分辨率来进行命名的  比如lcd1602  就是分辨率为16×2  lcd128128 就是分辨率为128×128
lcd12864基本特性参数

(1)低电源电压(VDD:+3.0--+5.5V)
(2)显示分辨率:128×64点
(3)内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)
(4)内置128个16×8点阵字符
(5)2MHZ时钟频率
(6)显示方式:STN、半透、正显
(7)驱动方式:1/32DUTY,1/5BIAS
(8)视角方向:6点
(9)背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10
(10)通讯方式:串行、并口可选
(11)内置DC-DC转换电路,无需外加负压
(12)无需片选信号,简化软件设计
(13)工作温度:0℃-+55℃,存储温度:-20℃-+60℃
lcd12864引脚图及功能







我们所用的为串口通信模式,所以仅介绍下串行所用管脚





引脚:
1 VSS  电源负极
2 VDD 电源正极
4 CS 片选引脚 高电位可接受数据,低电位锁存   
5 SID 串行数据输入端
6 CLK 串行同步时钟
可选引脚:
3 V0 调节屏幕亮度   
15 PSB 低电平有效 其中低电平为串口方式 如果只用串口通信模式  可以将PSB引脚飞线与地线相连 即固定低电平
17 RESET 复位引脚 低电平可使LCD复位     
19 A LCD背光源的电源
20 K LCD背光源的地      如果需要背光   可以将19引脚与LCD2引脚电源正极相连,20引脚与LCD1引脚电源地相连

串行模式下传输过程






1.首先CS片选一直为高电平期间,LCD可接受数据或指令,
2.随后,单片机要给出数据传输起始位,这里是以5个连续的“1”作数据起始位,如模块接收到连续的5个“1”,则内部传输被重置并且串行传输将被同步。
3.紧接的两个位指定传输方向RW,用于选择数据的传输方向  ,1是读数据,0是写数据)以及传输性质(RS,用于选择内部数据寄存器或指令寄存器,0是命令寄存器,1是数据寄存器)  最后的第8位固定为“0”。   到此第一个字节 /数据传输起始位发送完成。
4.在接收到起始位及“RW”和“RS”的第1个字节后,之后便开始传输指令或者数据,在传输过程中会进行拆分处理,该字节将被分为2个字节来传输或接收。
5.你想发送的数据或指令的高4位,被放在发送的第2个字节串行数据的高4位,其低4位则置为“0”;数据或指令的低4位被放在第3个字节的高4位,其低4位也置为“0”,如此完成一个字节指令或数据的传送。 (D7-D0)
比如说你想发送的数据为“A” 对应16进制0x41   对应二进制 0100 0001‬
那么发送的顺序就是:

  1 先发送0xFA (11111 010)                 五个1  RW=0 RS=1 ,
  2 发送0100 0000                              高四位为“A”对应的高四位    低4位补0
  3发送0001‬ 0000                               高四位为“A”对应的低四位    低4位补0
   到此一个字节发送完成
所以写指令之前,必须先发送 11111 000 (即0xF8)
写数据之前      必须先发送 11111 010 (即0xFA)

而如何实现字符的拆分呢?
参考:《C语言运算符与操作符的用法全面汇总(非常有用)》
将字符“A”的低四位清零 保留高四位   可以做“A”&240( 0xf0)
    0100 0001‬——————“A”的二进制数
   1111 0000‬——————240的二进制数
    ------------------
   0001 0000                            保留了“A”的高四位
将字符“A”的低四位变为高四位 可以用<<(左移运算符)  A<<4
    0100 0001‬——————“A”的二进制数
    0001 0000 ‬——————保留了“A”的低四位

6 完成一个字节数据的发送需要24个时钟周期 因为1个字节实际是发送了3个字节 (3x8)
7.只有在时钟线SCLK拉低时,数据线SID上的数据才允许变化,在时钟线SCLK高电平时,SID上的数据必须保持稳定(不能变化)
这点与IIC是相同的
LCD内部资源/显示原理

  LCD的控制芯片为ST7920 ,ST7920有丰富的内部资源,并且内部的ROM已经固化存储了中文字库,半角英文/数字字符
也就是自带中文字库
ST7920的内部资源:
提供8 位,4 位并行接口及串行接口可选
自动电源启动复位功能
内部自建振荡源
1、ST7920 内部固化了8192 个16×16 点阵中文字型在CGROM(2M 位中文字型ROM)里。
2、固化有126 个16*8 点阵的半角英文/数字字符(ASCII)在HCGROM里。
3、提供4个16×16点阵自造字符的存储空间CGRAM(字形产生RAM)。
4、提供128×64的点阵绘图共1024个字节的存储空间GDRAM(点阵绘图RAM)。
5、提供1个16×15点阵图标的存储空间IRAM(ICON RAM)
6、64×16 位字符显示RAM (DDRAM 最多16 字符×4 行)

那么在LCD上显示字符或者汉字是怎么实现的呢:
LCD显示原理:
作为字符显示,在控制器内有个供写入字符代码的缓存器DDRAM ,你只要将要显示的中文字符编码其他字符编码写入DDRAM(显示数据),也就是串行模式下发送一个字节数据,硬件将依照编码自动从CGROM(2M 中文字型ROM)    HCGROM(16K ASCII码ROM)   CGRAM(自定义字形RAM)三种字形中自动辨别选择对应的是那种字形的哪个字符/汉字编码,再将要显示的字符/汉字编码显示在屏幕上。
也就是字符显示是通过将字符显示编码写入字符显示RAM(DDRAM )实现的
模块内部的RAM提供64×16的显示空间 ,最多可以显示4行8字(32个汉字)或64个ASCII码字符的显示       一个汉字2个字节
DDRAM一共有32个字符显示区域,当然字符显示的RAM的地址与32个字符显示区域有着一一对应的关系
字符显示时,DDRAM地址与液晶屏的位置:





通过写入不同的地址,就可以实现字符显示的不同位置

LCD控制指令

LCD12864提供了两套控制命令,分别为基本指令和扩展指令    ,涉及到了LCD的清屏,开关,显示字符位置等等
其实也就是向LCD写入特殊字符而已    ,根据RS和RW可以判断指令方式










下面我们介绍几个常用的:
1清屏





  清除屏幕字符  ,也就是对整块屏幕写入空字符 并且将游标移到开始位置   在使用清屏时,需要加上一定的延时等待液晶稳定

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
0  00000 0001
2显示状态开关





其中第6位置1打开显示,第7位与第8位对应游标相关设置  一般配置为 0X0C //显示器开,光标关闭,不反白

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
0  00 0 0 0 1 1/0 1/0 1/0
3功能设定





DL = 0/1 : 4/8位数据    我们是使用8位 所以为1     RE=1时,使用扩充指令集,RE=0时,使用基本指令集,我们正常使用基本指令集  所以RE需要为0         一般配置为 0X30 //  基本指令集 8bit数据流

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
0  00 0 1 1/0 任意 1/0 任意 任意
4游标功能设置





进入点设定   :   是表示在写入或者读取的时候,游标相对于上一个位置的移位  不设置即默认对地址加1(移1位)  如果你想要字符之间有空隙  可以修改移位
游标的位置移动设置,写入相对应的数据即可改变游标位置,实现LCD界面的书写, 32个字符显示区域对应32个地址
5读取BF忙标志和地址





忙标志BF:
BF标志提供内部工作状况,BF=1表示模块内部正在进行操作,此时模块不接受指令和数据. BF=0 模块为准备接受状态,可以接受指令和数据
6读/写数据





就是进行数据的读写,
写数据:

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
1  08bit数据

读数据:

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
1  18bit数据
7 CGRAM(自定义字形RAM)设置






设定该地址即可自定义字形编码,在显示图片时会先将图片编码写入这里,然后再读它进行显示

LCD初始化






我们把它分为6步分别讲解



  • 1.在开电之后,首先要等待40ms以上,等待液晶自检,使LCD系统复位完成
  • 2. 之后便是功能的设定  选择基本指令集或者扩充指令集  随后延时等待100us以上
  • 3. 功能设定2   选择8bit数据流 或者 4bit数据流  随后延时37us以上
  • 4. 开关显示  是否打开显示开关          随后延时100us以上
  • 5.清屏  清空RAM并初始化光标位置    随后延时10us以上
  • 6. 进入模式选择  也就是设定游标相对于上一个位置的移位 默认为地址自动+1  

之后初始化完成,可以对LCD进行数据的写入或读取
当然第二步与第三布写入数据是相同的,可以只写一次然后延时137us以上也可
LCD图片显示







LCD12864在地址的排列上是分为上、下半屏来显示的,上半屏横向的列地址(X)是0-7(00h-07h),下半屏的列地址是8-15(08h-0fh)。而每个一地址都可写入两个字节的内容,它们是按高位在前低位在后排列的。垂直方向上的地址(Y)上半屏是0-31(00h-1fh),下半屏的Y地址仍是0-31(00h-1fh)   
   也就是一幅图片写入时垂直坐标Y要写64次 (上下屏)   水平横向坐标X要写8次
在每两个字节写入后时候就要重新设置垂直地址,再设置水平地址(连续写入两个字节确定X,Y地址)  然后再写图片的正常编码  这样便可以实现一幅图像的写入     简单说就是对每个位置写入图片的相对于位置的编码
图片显示的步骤
1切换到扩充指令
2 关闭绘图显示功能


3 先将垂直的坐标(Y)写入CGRAM地址
4 再将水平的位元组坐标(X)写入CGRAM地址
5 将高位字节
D15-D8写入RAM中
6 将低位字节D7-D0写入到RAM中

重复3-6步,完成图片各个部分的写入  先写上半屏,再写下半屏
7 打开绘图显示功能                                                                                                                                                                          8切换回基本指令
其实也就是先打开CGRAM(自定义字形RAM) 然后把定义好的图片编码写入CGRAM  然后再对DDRAM正常写入该图片编码, 这时硬件将依照编码从CGRAM(自定义字形RAM)读取之前写入的图片编码,然后显示该图片
具体看代码即可
注意事项:

用带中文字库的128X64显示模块时应注意以下几点:
PS: 图片显示之后需要加上延时,否则会持续写入,不会有图片显示
     图片写入CGRAM(自定义字形RAM)时必须要先写垂直地址坐标,再写水平地址坐标
①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
③当字符编码为2字节时,应先写入高位字节,再写入低位字节。
④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。
⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。

到此,LCD的串行通信就讲的差不多了,可以结合着代码篇博客,学习完对应相关原理,然后查看相对应代码,可以更好地理解
举报

更多回帖

发帖
×
20
完善资料,
赚取积分