隨著液晶顯示技術的發展和應用,越來越多的開發人員希望在自己開發的儀器中使用液晶屏幕來顯示漢字,通常的漢字顯示方式是:先根據所需要的漢字提取漢字點陣(譬如16x16點陣,24x24點陣等),將點陣文件存入ROM中,形成新的漢字編碼;然后在使用時則先根據新的漢字編碼組成語句,再由MCU根據新的編碼提取相應的點陣進行漢字顯示。就像我們之前在學習單片機的LCD外設時,要在LCD上顯示一個漢字,先把一個漢字用字模軟件轉換成對應的點陣數據,然后把該點陣數據用一個數據保存在單片機的ROM中,在LCD顯示的時候直接調用該數組,如此就能在LCD上顯示出該漢字了。 在這種顯示方式中,如果使用的漢字數量較大或語句較多時,利用漢字的新編碼組成語句將是一件繁瑣而枯燥的工作。如果有新的漢字加入,那么漢字庫的維護也成問題。而我們日常生活的一些手持工具上,如手機、平板等,他們可以任意輸入漢字,不僅靈活性大,而且檢索速度快。這其中的主要原因就是在這些設備中固化了硬件漢字庫。也就是說事先直接把幾乎所有的漢字都存進了硬件存儲器中,需要使用哪一個漢字就在漢字庫中調用哪一個。不再是需要用到哪一個漢字才去字模軟件轉換一下對應的點陣數據。而半導體技術的發展,使得大容量flash rom的價格大大下降,從而使用硬件漢字庫的存儲器設備的成本大大下降。因此,越來越多的技術開發人員開始關注起硬件漢字庫,希望能在自己開發的設備中設計并使用硬件漢字庫,達到加快產品開發速度,降低軟件成本的目的。
由于英文書寫系統都是由26個基本字母組成,利用26個字母可組合出不同的單詞,所以用ASCII碼表就能表達整個英文書寫系統。而中文書寫系統中的漢字是獨立的方塊,若參考單詞拆解成字母的表示方式,漢字可以拆解成部首、筆畫來表示,但這樣會非常復雜(可參考五筆輸入法編碼),所以中文編碼直接對方塊字進行編碼,一個漢字使用一個號碼。
由于漢字非常多,常用字就有6000多個,如果像ASCII編碼表那樣只使用1個字節最多只能表示256個漢字,所以我們使用2個字節來編碼,2個字節即16位,最多能表示65535個漢字,基本夠用了,所以1個漢字在內存空間中占用2個字節。
在PC機的文本文件中,漢字是以機內碼的形式存儲的,每個漢字占用2個字節長度,為了和ASCII碼區別,范圍從十六進制的0A1H開始(小于80H的為ASCII碼);將機內碼每個字節的最高位屏蔽掉,再以十六進制的形式顯示出來,則為國標碼;將機內碼的每個字節各減去0A0H再以十進制顯示出來,即為該漢字的區位碼。例如“國”字的機內碼、國標碼、區位碼如下表:
常用的漢字內碼系統有GB2312、GB13000、GBK、BIG5(繁體)等幾種,其中GB2312支持的漢字僅六千多個,很多時候不夠用,而GBK內碼不僅完全兼容GB2312,還支持了繁體字,總漢字數有2萬多個,完全能滿足我們一般的應用要求。
漢字在液晶上的顯示原理與前面顯示字符的是一樣的。漢字在液晶上的顯示其實就是一些點的顯示與不顯示,這就相當于我們的筆一樣,有筆經過的地方就畫出來,沒經過的地方就不畫。所以要顯示漢字,我們首先要知道漢字的點陣數據,這些數據可以由專門的軟件來生成。只要知道了一個漢字點陣的生成方法,那么我們在程序里面就可以把這個點陣數據解析成一個漢字。
知道顯示一個漢字了,就可以推及整個漢字庫了。漢字在各種文件里面的存儲不是以點陣數據的形式存儲的(否則那就占用的空間太大了),而是以內碼的形式存儲的,就是GB2312/GBK/BIG5等這幾種中的一種,每個漢字對應著一個內碼,在知道了內碼之后再去漢字庫里面查找這個漢字的點陣數據,然后在液晶上顯示出來。這個過程我們是看不到了,但是計算機是要去執行的。
單片機要顯示漢字也與此類似:
漢字內碼(GBK/GB2312)——>查找點陣庫——>解析——>顯示。
所以只要我們有了整個漢字庫的點陣數據,就可以把電腦上的文本信息在單片機上顯示出來了。這里我們要解決的最大問題就是制作一個與漢字內碼對的上號的漢字點陣庫。而且要方便單片機的查找。
每個GBK碼由2個字節組成,第一個字節為0X81-0XFE(區),第二個字節分為2部分(位),一是0X40-0X7E,二是0X80-0XFE。其中與GB2312相同的區域,字完全相同。
我們把第一個字節代表的意義稱為“區”,那么GBK里面總共有126個區(0XFE-0X81+1),每個區內有190個漢字(0XFE-0X80+0X7E-0X40+2),總共就有126190=23940個漢字。
我們的點陣庫只要按照這個編碼規則從0X8140開始,逐一建立,每個區的點陣大小為每個漢字所用的字節數190.這樣,我們就可以得到在這個字庫里面定位漢字的方法:
當GBKL<0X7F時:Hp=((GBKH-0X81)190 + GBKL-0X40)(size2);
當GBKL>0X80時:Hp=((GBKH-0X81)190 + GBKL-0X41)(size2);
其中GBKH, GBKL分別代表GBK的第一個字節和第二個字節(也就是高位和地位),size代表漢字字體的大?。ū热?6字體、12字體等),Hp則為對應漢字點陣數據在字庫里面的起始位置(假設是從0開始存放)。
這樣我們只要得到了漢字的GBK碼,就可以顯示這個漢字了。從而實現漢字在液晶上的顯示。
0.打開軟件“彩色LCD屏點陣字庫”,選擇“創建全漢字庫”一欄
1.選擇中文GBK
2.選擇自己要的點陣大小
3.選擇橫向取模
4.選擇字節高位在前、低位在后
5.點擊“創建字庫”并保存文件(后綴名為.bin)
字符串顯示函數需要輸入參數為字符的GBK編碼,而我們直接輸入的中文字符也行,這是因為編譯器會自動轉化這些中文字符成相應的GBK編碼。
為什么轉成GBK編碼而不轉UTF-8編碼呢?這跟開發環境配置有關,在MDK中查看編碼配置,編譯環境會把文件中的字符串轉成這里配置的編碼,然后存儲到STM32的程序空間中,所以這里的設定要與自己的的字庫編碼格式一樣,以防止亂碼。