关于编码和字库
问一个问题,单片机液晶上的字是怎么显示出来的,电脑上的字是怎么显示出来的,您真的知道真真实实的原理了吗??
关于字库,您真的知道实质是如何调用的吗????
先看一下
相信大家都听说过 GB2312,实际上就是用16进制来表示咱中国人的符号和字,咱主要说一下字
可以看一下
https://blog.csdn.net/halchan/article/details/78353947 GB2312
https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php GBK 国标扩展 GBK包含GB2312 是在GB2312之上进行了补充
实际上就是把每一个汉字用两个16进制表示, 0xB0,0xA1 就表示 啊
好了这里就说完了,现在看如何把0xB0,0xA1和字库联系上
首先说一下液晶是如何显示字的,
实质上就是一个一个的小灯,假设咱用16*16的灯来显示字,0控制灯灭,1控制灯亮
然后写完所有控制的数据,字就显示出来了.
然后说一下,实质上字库就是上面的0x08,0x80......0x10,0x40,.....后面的其它字,这样的数据
假设我要显示 "你" 就是把提取0x08,0x80.....0x10,0x40 就可以了
但是大家有没有发现像那种带字库的芯片我们只需要 写给它 "啊" 或者 0xB0,0xA1 这个 "啊" 就显示出来了,实际上你写的 "啊" 单片机也是换做 0xB0,0xA1
然后丢给处理芯片就可以了.
现在说处理芯片是如何做的
假设用的GBK编码
假设数据是从存储芯片的0地址开始存的
我要显示 "丂" 是不是只需要从0地址开始取,取32个字节然后用这32个字节控制小灯就可以了
可是咱们让含有字库的芯片显示 丂 是给芯片的 0x81,0x40
实质上吧!芯片是这样做的
0x81-0x81 + 0x40-0x40 就是0啦,就是从存储芯片的0地址开始取,取32个字节
假设
(0x81-0x81 + 0xEF-0x40)*32(因为每一个字都会产生32个字节的数据哈) 就是5600,就是从存储芯片的5600地址开始取,取32个字节
假设
(192*(0xD0-0x81)+(0xDE-0x40))*32 自己去算哈
实质上这就是最终的
(192*(汉字前面的字节-0x81)+(汉字后面的字节-0x40))*32 = 汉字在字库的位置
说一下,注意看,间隔了192个,空的地方在字库里面就是..我也不确定,但是占位置,不是32个0,就是32个ff
假设存储芯片存储的地址有偏移
(192*(汉字前面的字节-0x81)+(汉字后面的字节-0x40))*32 +偏移的地址 = 汉字在字库的位置
关于驱动芯片
大家有没有用过裸屏,就是还没有接上驱动芯片的液晶屏
一般裸屏都是用并口传输数据
所谓并口呢就是很多个IO
一般呢都是8的倍数
因为8个引脚就代表了一个字节
并口通信呢速度很快,因为一个时钟信号过去,就接收处理至少一个字节嘛
如果是串口/SPI/IIC什么的需要至少8个时钟信号,太慢了.
假设咱的数据IO是24个,分别表示RGB
0xff0000 就表示显示一个红点
0xffffff 显示一个白点
0x000000显示一个黑点
当然裸屏一般用以下引脚实现通信
数据IO:并口,用来传输数据
CLK : 时钟信号(每发出一个脉冲,显示一个点,从左到右横着显示哈)
HSYNS : 换行信号(每发一个脉冲,表示从新的下一行开始显示)
VSYNC:帧同步信号(每发一个信号,表示新的一幅图像开始传输)
大家看哈,其实就是一个点一个点的控制显示在屏幕上
如果没有驱动芯片的话用单片机也可以,不过....图像死卡死卡的
而且咱要实现什么动态移动什么的如果没有驱动芯片,就比较费劲了
当然原理还是一个点一个点的实现刷屏而已!
有了驱动芯片呢就不一样了,咱只要把数据丢给驱动芯片
然后给驱动芯片发命令,图像就会按照咱的命令显示了
很是省劲呀!
所以咱单片机平时做让液晶显示图像都是和驱动芯片打交道
不过呢大家做的时候需要注意一些事情
注意什么呢!
1.我给驱动芯片发数据,驱动芯片是如何刷屏显示的
1.1 每次显示1个或者8的倍数个点,从左到右,从上到下
这个时候如果大家要显示自己的图片一定要注意
让制作软件提取的时候一定要按照上面的图像显示顺序提取图片数据
你要是让软件按照下面提取肯定不对了
所以大家要先知道自己驱动液晶的程序是按照什么顺序显示的
然后大家制作图像的时候一定要按照显示顺序制作就可以