問一個問題,單片機液晶上的字是怎么顯示出來的,電腦上的字是怎么顯示出來的,您真的知道真真實實的原理了嗎??
關於字庫,您真的知道實質是如何調用的嗎????
先看一下
相信大家都聽說過 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的倍數個點,從左到右,從上到下
這個時候如果大家要顯示自己的圖片一定要注意
讓制作軟件提取的時候一定要按照上面的圖像顯示順序提取圖片數據
你要是讓軟件按照下面提取肯定不對了
所以大家要先知道自己驅動液晶的程序是按照什么順序顯示的
然后大家制作圖像的時候一定要按照顯示順序制作就可以