摘要:LCD是嵌入式常見設備,如何在LCD上顯示漢字和英文?矢量字體和點陣字體有何不同?同一個字符為何有多種編碼?GB2312、GB18030指什么?他們之間有關系嗎?嵌入式設備如何支持多國語言?從哪里獲取字庫?需要付費嗎?以上問題,本文一一道來!
一、如何在LCD上顯示字符
在LCD上如何顯示字符呢?這里我們討論的是邏輯問題,不是LCD控制器驅動。
首先,我們要對LCD有一個概念:LCD也就是一個點一個點組成的一片點而已。本質上和1個LED一樣。
1個單色LED,能顯示亮滅。
將很對LED排成一行,就可以實現(xiàn)流水燈。
將多行LED組成一片,是啥?是LED點陣。
多塊點陣,就能組成圖文屏。
如果是三色LED組成的圖文屏,就能顯示視頻動畫。
無論是COG LCD,OLED LCD,還是TFT LCD,實際上都是一個點一個點組成的矩陣,和LED組成的圖文屏一樣。
當然,制造工藝不一樣,控制顯示內容技術也不一樣,我們不討論制造技術,控制技術后續(xù)會有單獨課程討論。
顯然,要在圖文屏上顯示字符,只需將對應的LED點點亮。不同的字符應該點亮那些LED呢?
我們先逆向想,下圖LED點陣上顯示的漢字,如何將位置信息保存到代碼中,以便下次使用?
這是一個16x16的LED點陣。
每個LED的狀態(tài)僅僅是亮或滅,那么就可以使用1個bit表示其狀態(tài),1表示亮,0表示滅。
1個byte,8個bit,兩個byte就可以表示一行LED的狀態(tài)。
上圖這個德字第一行就可以這樣表示:0001 0000 0100 0000;也就是0x10,0x40;
按照此方法取得“德”字得完整顯示信息:
0001 0000 0100 0000 0x10 0x40
0001 0000 0100 0000 0x10 0x40
0010 1111 1111 1110 0x2F 0xFE
0100 0000 0100 0000 0x40 0x40
1001 0111 1111 1100 0x97 0xFC
0001 0100 1010 0100 0x14 0xA4
0010 0100 1010 0100 0x24 0xA4
0110 0111 1111 1100 0x67 0xFC
1010 0000 0000 0000 0xA0 0x00
0010 1111 1111 1110 0x2F 0xFE
0010 0000 0100 0000 0x20 0x40
0010 0000 0010 0100 0x20 0x24
0010 0101 0010 0010 0x25 0x22
0010 0101 0000 1010 0x25 0x05
0010 1001 0000 1000 0x29 0x08
0010 0000 1111 1000 0x20 0xF8
用1個數(shù)組保存,如下:
de_dot[32]={ 0x10,0x40,0x10,0x40,0x2f,0xfe,0x40,0x40, 0x97,0xfc,0x14,0xa4,0x24,0xa4,0x67,0xfc, 0xa0,0x00,0x2f,0xfe,0x20,0x40,0x20,0x24, 0x25,0x22,0x25,0x05,0x29,0x08,0x20,0xf8};
得到了這個數(shù)組,在代碼中按照取模的方式將其還原到LED點陣上,就能顯示德字。
玩過8段數(shù)碼管的朋友應該很熟悉,為了在數(shù)碼管上顯示數(shù)字,我們會在代碼中定義0~9數(shù)字的顯示掩碼(數(shù)碼管每個段亮滅的信息)。點陣上顯示漢字,無非就是LED更多了。
因此,要在LCD上顯示字符,需要先知道如何描繪字符的信息,按照取模方式,將這寫信息還原到LCD上,就能描繪出字符。
二、點陣字庫
那什么是點陣字庫呢?
上面說的“德”字的描繪信息數(shù)組就是點陣字庫。
這個德字描繪出的效果,就是點陣字體。描繪信息保存的形式,就是點陣字庫。
點陣字庫有多種形式:
1、直接將信息用數(shù)組保存到代碼中。(顯示的內容較少時通常會這樣做)
2、將點陣信息描繪到一張bmp圖片,使用時根據信息文件(FNT)從圖片中取信息。(很多游戲使用的就是這種貼圖字體,也叫bmpfont)
3、將一堆點陣信息數(shù)組打包為1個bin文件,使用算法定位字符位置。(點陣較多,按照編碼規(guī)范整合在一起)
4、按照電腦字體規(guī)范整合的字體。(比如windows的ttf字體,bdf字體)
三、取模方式
取模方式指的是單個bit位置信息組合成字節(jié)時使用的方式。
前面我們對德字取位置信息時:使用橫向取模,并且高位在前。此外還有很多不同的取模方式,常見的方式如下:
尺寸
漢字通常有這些尺寸:12x12,16x16,24x24。在cog屏128*64像素的屏上,一般用12x12的漢字點陣,可以顯示5行。
ASCII碼的點陣通常和漢字高度一樣,寬度是一半,比如,12x12的漢字配12x6的ASCII碼,16x16的漢字配16x8的ASCII碼。
四、矢量字體
矢量字體:矢量字體(Vector font)中每一個字形是通過數(shù)學曲線來描述的,它包含了字形邊界上的關鍵點,連線的導數(shù)信息等,字體的渲染引擎通過讀取這些數(shù)學矢量,然后進行一定的數(shù)學運算來進行渲染。這類字體的優(yōu)點是字體實際尺寸可以任意縮放而不變形、變色。矢量字體主要包括 Type1 、 TrueType、OpenType等幾類。
Freetype:FreeType庫是一個完全免費(開源)的、高質量的且可移植的字體引擎,它提供統(tǒng)一的接口來訪問多種字體格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。
矢量字體使用Freetype進行渲染后,最后得到的也是bitmap,畢竟,LCD就是一個一個點組成的。
理論上矢量字體可以無限放大而不失真。
但是,矢量字體渲染為較小字號的字,某些字(筆畫多)可能失真非常嚴重。
五、字符編碼
字符編碼是指一種映射規(guī)則,根據這個映射規(guī)則可以將某個字符映射成其他形式的數(shù)據以便在計算機中存儲和傳輸。
ASCII碼
ASCII ((American Standard Code for Information Interchange): 美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是最通用的信息交換標準,并等同于國際標準ISO/IEC 646。ASCII第一次以規(guī)范標準的類型發(fā)表是在1967年,最后一次更新則是在1986年,到目前為止共定義了128個字符 。
Codepage
歐美很多國家的語言在ASCII碼中沒有定義,各個國家(或組織)就使用1個字節(jié)剩下的127個值映射他們需要的字符。
國家很多,定義很多,如何決定使用哪種映射呢?
IBM、微軟等系統(tǒng)就增加了CodePage的概念:每種映射分配一個編號。這些系統(tǒng)的代碼頁編號是不完全一樣的。IBM定義的代碼叫做OEM,微軟定義的代碼叫ANSI。
六、漢字編碼
漢字字符數(shù)量很多,僅僅使用高位127個值不能表示。
因此國家標準組織定義了《信息交換用漢字編碼字符集》。有三個版本:
GB2312編碼:1981年5月1日發(fā)布的簡體中文漢字編碼國家標準。GB2312對漢字采用雙字節(jié)編碼,收錄7445個圖形字符,其中包括6763個漢字。
GBK編碼:1995年12月發(fā)布的漢字編碼國家標準,是對GB2312編碼的擴充,對漢字采用雙字節(jié)編碼。GBK字符集共收錄21003個漢字,包含國家標準GB13000-1中的全部中日韓漢字,和BIG5編碼中的所有漢字。
GB18030編碼:2000年3月17日發(fā)布的漢字編碼國家標準,是對GBK編碼的擴充,覆蓋中文、日文、朝鮮語和中國少數(shù)民族文字,其中收錄27484個漢字。GB18030字符集采用單字節(jié)、雙字節(jié)和四字節(jié)三種方式對字符編碼。兼容GBK和GB2312字符集。
漢字編碼使用分區(qū)概念,如下面分區(qū),其中的雙字節(jié)二區(qū)就是符合GB2312標準的雙字節(jié)區(qū)。
雙字節(jié)部分編碼空間結構圖
七、如何獲得字庫
在介紹如何獲得字庫之前,先說明版權問題
版權說的是字體,也就是一個字符描繪出來的效果。一個字體的形成方式通常是矢量字體或者點陣字庫。
使用工具將一種字體的矢量字庫轉換為點陣字庫,他們仍然是同一種字體,那么版權是一樣的,依然屬于矢量字體擁有者。
獲取矢量字體
在你的電腦中就有很多字體。windows下的C:WindowsFonts下保存有你電腦安裝的字體,這種字體通常是ttf標準。
這些字體一般都不是開源的,也就是不能免費商用到嵌入式設備上。開源的字體有:思源字體,可以免費商用。
八、獲取點陣字體
我們更關心的是如何獲取點陣字體。
前面說過,點陣字體有很多存在方式,那么我們就有很多獲取方式。
從很早之前的電腦漢卡上獲取點陣字庫。這種方式比較難找,在github上可以找到一些外文的點陣字庫,漢字的沒找到。
從DOS系統(tǒng)獲取漢字點陣這種點陣我用過的有HZ1616,HZ1212。這種字體的版權不是很清楚屬于誰。不過這種字庫因為很早,所以基本都是GB2312規(guī)范的,不包含生僻字。
從電腦字體中找點陣字體電腦字體常見的是TTF規(guī)范,這個規(guī)范比代表它只有矢量字體,很多電腦字體中會包含矢量字體和點陣字體。點陣字體一般是小號字。小號字用矢量字體渲染,效果不好,所有某種字體通常會帶小號的點陣字體。
用取模工具取點陣信息如果使用的字符很少,可以用《zimo3》等工具取模。
用點陣生成工具批量生成比如易木雨軟件工作室做的《字庫制作軟件.rar》,可以批量將矢量字庫轉為點陣字庫。
從開源模塊中找外文點陣比如tslib觸摸庫中就含有英文點陣
買。有一個叫高通的公司,賣點陣字庫芯片。有一個較北京中易的公司,有一套很好的點陣字庫。這套點陣字庫由于性能好,流傳廣,工作經驗豐富的工程師一般都接觸過;不過大部分公司可能都沒有獲得授權。還有其他很多做字體的公司也有點陣字庫,比如方正。
自己用編輯工具一個一個畫,然后用你的腦子將其轉為數(shù)組。
來源 | 屋脊雀
-
嵌入式
+關注
關注
5092文章
19177瀏覽量
307636 -
lcd
+關注
關注
34文章
4438瀏覽量
168374 -
嵌入式設備
+關注
關注
0文章
110瀏覽量
17031 -
顯示字符
+關注
關注
0文章
3瀏覽量
7264
原文標題:嵌入式屏幕上的漢字原來是這樣顯示的~
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論