<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          嵌入式的漢字原來是這樣顯示的?

          共 4396字,需瀏覽 9分鐘

           ·

          2021-10-17 09:22

          關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容

          來源:屋脊雀


          摘要:LCD是嵌入式常見設(shè)備,如何在LCD上顯示漢字和英文?矢量字體和點(diǎn)陣字體有何不同?同一個(gè)字符為何有多種編碼?GB2312、GB18030指什么?他們之間有關(guān)系嗎?嵌入式設(shè)備如何支持多國語言?從哪里獲取字庫?需要付費(fèi)嗎?以上問題,本文一一道來!

          一、如何在LCD上顯示字符

          在LCD上如何顯示字符呢?這里我們討論的是邏輯問題,不是LCD控制器驅(qū)動(dòng)。

          首先,我們要對LCD有一個(gè)概念:LCD也就是一個(gè)點(diǎn)一個(gè)點(diǎn)組成的一片點(diǎn)而已。本質(zhì)上和1個(gè)LED一樣。

          1個(gè)單色LED,能顯示亮滅。

          將很對LED排成一行,就可以實(shí)現(xiàn)流水燈。

          將多行LED組成一片,是啥?是LED點(diǎn)陣。

          多塊點(diǎn)陣,就能組成圖文屏。

          如果是三色LED組成的圖文屏,就能顯示視頻動(dòng)畫。

          無論是COG LCDOLED LCD,還是TFT LCD,實(shí)際上都是一個(gè)點(diǎn)一個(gè)點(diǎn)組成的矩陣,和LED組成的圖文屏一樣。

          當(dāng)然,制造工藝不一樣,控制顯示內(nèi)容技術(shù)也不一樣,我們不討論制造技術(shù),控制技術(shù)后續(xù)會(huì)有單獨(dú)課程討論。

          顯然,要在圖文屏上顯示字符,只需將對應(yīng)的LED點(diǎn)點(diǎn)亮。不同的字符應(yīng)該點(diǎn)亮那些LED呢?

          我們先逆向想,下圖LED點(diǎn)陣上顯示的漢字,如何將位置信息保存到代碼中,以便下次使用?

          這是一個(gè)16x16的LED點(diǎn)陣。

          每個(gè)LED的狀態(tài)僅僅是亮或滅,那么就可以使用1個(gè)bit表示其狀態(tài),1表示亮,0表示滅。

          1個(gè)byte,8個(gè)bit,兩個(gè)byte就可以表示一行LED的狀態(tài)。

          上圖這個(gè)德字第一行就可以這樣表示: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個(gè)數(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};

          得到了這個(gè)數(shù)組,在代碼中按照取模的方式將其還原到LED點(diǎn)陣上,就能顯示德字。

          玩過8段數(shù)碼管的朋友應(yīng)該很熟悉,為了在數(shù)碼管上顯示數(shù)字,我們會(huì)在代碼中定義0~9數(shù)字的顯示掩碼(數(shù)碼管每個(gè)段亮滅的信息)。?點(diǎn)陣上顯示漢字,無非就是LED更多了。

          因此,要在LCD上顯示字符,需要先知道如何描繪字符的信息,按照取模方式,將這寫信息還原到LCD上,就能描繪出字符。

          二、點(diǎn)陣字庫

          那什么是點(diǎn)陣字庫呢?

          上面說的“”字的描繪信息數(shù)組就是點(diǎn)陣字庫。

          這個(gè)德字描繪出的效果,就是點(diǎn)陣字體。描繪信息保存的形式,就是點(diǎn)陣字庫。

          點(diǎn)陣字庫有多種形式:

          • 1、直接將信息用數(shù)組保存到代碼中。(顯示的內(nèi)容較少時(shí)通常會(huì)這樣做)
          • 2、將點(diǎn)陣信息描繪到一張bmp圖片,使用時(shí)根據(jù)信息文件(FNT)從圖片中取信息。(很多游戲使用的就是這種貼圖字體,也叫bmpfont)
          • 3、將一堆點(diǎn)陣信息數(shù)組打包為1個(gè)bin文件,使用算法定位字符位置。(點(diǎn)陣較多,按照編碼規(guī)范整合在一起)
          • 4、按照電腦字體規(guī)范整合的字體。(比如windows的ttf字體,bdf字體)

          三、取模方式

          取模方式指的是單個(gè)bit位置信息組合成字節(jié)時(shí)使用的方式。

          前面我們對德字取位置信息時(shí):使用橫向取模,并且高位在前。此外還有很多不同的取模方式,常見的方式如下:

          尺寸

          漢字通常有這些尺寸:12x12,16x16,24x24。在cog屏128*64像素的屏上,一般用12x12的漢字點(diǎn)陣,可以顯示5行。

          ASCII碼的點(diǎn)陣通常和漢字高度一樣,寬度是一半,比如,12x12的漢字配12x6的ASCII碼,16x16的漢字配16x8的ASCII碼。

          四、矢量字體

          矢量字體:矢量字體(Vector font)中每一個(gè)字形是通過數(shù)學(xué)曲線來描述的,它包含了字形邊界上的關(guān)鍵點(diǎn),連線的導(dǎo)數(shù)信息等,字體的渲染引擎通過讀取這些數(shù)學(xué)矢量,然后進(jìn)行一定的數(shù)學(xué)運(yùn)算來進(jìn)行渲染。這類字體的優(yōu)點(diǎn)是字體實(shí)際尺寸可以任意縮放而不變形、變色。矢量字體主要包括 Type1 、 TrueType、OpenType等幾類。

          Freetype:FreeType庫是一個(gè)完全免費(fèi)(開源)的、高質(zhì)量的且可移植的字體引擎,它提供統(tǒng)一的接口來訪問多種字體格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。

          • 矢量字體使用Freetype進(jìn)行渲染后,最后得到的也是bitmap,畢竟,LCD就是一個(gè)一個(gè)點(diǎn)組成的。
          • 理論上矢量字體可以無限放大而不失真。
          • 但是,矢量字體渲染為較小字號的字,某些字(筆畫多)可能失真非常嚴(yán)重。

          五、字符編碼

          字符編碼是指一種映射規(guī)則,根據(jù)這個(gè)映射規(guī)則可以將某個(gè)字符映射成其他形式的數(shù)據(jù)以便在計(jì)算機(jī)中存儲(chǔ)和傳輸。

          ASCII碼

          ASCII ((American Standard Code for Information Interchange): 美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是最通用的信息交換標(biāo)準(zhǔn),并等同于國際標(biāo)準(zhǔn)ISO/IEC 646。ASCII第一次以規(guī)范標(biāo)準(zhǔn)的類型發(fā)表是在1967年,最后一次更新則是在1986年,到目前為止共定義了128個(gè)字符 。

          Codepage

          歐美很多國家的語言在ASCII碼中沒有定義,各個(gè)國家(或組織)就使用1個(gè)字節(jié)剩下的127個(gè)值映射他們需要的字符。

          國家很多,定義很多,如何決定使用哪種映射呢?

          IBM、微軟等系統(tǒng)就增加了CodePage的概念:每種映射分配一個(gè)編號。這些系統(tǒng)的代碼頁編號是不完全一樣的。IBM定義的代碼叫做OEM,微軟定義的代碼叫ANSI。

          六、漢字編碼

          漢字字符數(shù)量很多,僅僅使用高位127個(gè)值不能表示

          因此國家標(biāo)準(zhǔn)組織定義了《信息交換用漢字編碼字符集》。有三個(gè)版本:

          GB2312編碼:1981年5月1日發(fā)布的簡體中文漢字編碼國家標(biāo)準(zhǔn)。GB2312對漢字采用雙字節(jié)編碼,收錄7445個(gè)圖形字符,其中包括6763個(gè)漢字。

          GBK編碼:1995年12月發(fā)布的漢字編碼國家標(biāo)準(zhǔn),是對GB2312編碼的擴(kuò)充,對漢字采用雙字節(jié)編碼。GBK字符集共收錄21003個(gè)漢字,包含國家標(biāo)準(zhǔn)GB13000-1中的全部中日韓漢字,和BIG5編碼中的所有漢字。

          GB18030編碼:2000年3月17日發(fā)布的漢字編碼國家標(biāo)準(zhǔn),是對GBK編碼的擴(kuò)充,覆蓋中文、日文、朝鮮語和中國少數(shù)民族文字,其中收錄27484個(gè)漢字。GB18030字符集采用單字節(jié)、雙字節(jié)和四字節(jié)三種方式對字符編碼。兼容GBK和GB2312字符集。

          漢字編碼使用分區(qū)概念,如下面分區(qū),其中的雙字節(jié)二區(qū)就是符合GB2312標(biāo)準(zhǔn)的雙字節(jié)區(qū)。

          雙字節(jié)部分編碼空間結(jié)構(gòu)圖

          七、如何獲得字庫

          在介紹如何獲得字庫之前,先說明版權(quán)問題

          • 版權(quán)說的是字體,也就是一個(gè)字符描繪出來的效果。一個(gè)字體的形成方式通常是矢量字體或者點(diǎn)陣字庫。
          • 使用工具將一種字體的矢量字庫轉(zhuǎn)換為點(diǎn)陣字庫,他們?nèi)匀皇峭环N字體,那么版權(quán)是一樣的,依然屬于矢量字體擁有者。

          獲取矢量字體

          在你的電腦中就有很多字體。windows下的C:\Windows\Fonts下保存有你電腦安裝的字體,這種字體通常是ttf標(biāo)準(zhǔn)。

          這些字體一般都不是開源的,也就是不能免費(fèi)商用到嵌入式設(shè)備上。開源的字體有:思源字體,可以免費(fèi)商用。

          八、獲取點(diǎn)陣字體

          我們更關(guān)心的是如何獲取點(diǎn)陣字體。

          前面說過,點(diǎn)陣字體有很多存在方式,那么我們就有很多獲取方式。

          1. 從很早之前的電腦漢卡上獲取點(diǎn)陣字庫。這種方式比較難找,在github上可以找到一些外文的點(diǎn)陣字庫,漢字的沒找到。

          2. 從DOS系統(tǒng)獲取漢字點(diǎn)陣這種點(diǎn)陣我用過的有HZ1616,HZ1212。這種字體的版權(quán)不是很清楚屬于誰。不過這種字庫因?yàn)楹茉?,所以基本都是GB2312規(guī)范的,不包含生僻字。

          3. 從電腦字體中找點(diǎn)陣字體電腦字體常見的是TTF規(guī)范,這個(gè)規(guī)范比代表它只有矢量字體,很多電腦字體中會(huì)包含矢量字體和點(diǎn)陣字體。點(diǎn)陣字體一般是小號字。小號字用矢量字體渲染,效果不好,所有某種字體通常會(huì)帶小號的點(diǎn)陣字體。

          4. 取模工具取點(diǎn)陣信息 如果使用的字符很少,可以用《zimo3》等工具取模。

          5. 點(diǎn)陣生成工具批量生成 比如易木雨軟件工作室做的《字庫制作軟件.rar》,可以批量將矢量字庫轉(zhuǎn)為點(diǎn)陣字庫。

          6. 開源模塊中找外文點(diǎn)陣 比如tslib觸摸庫中就含有英文點(diǎn)陣

          7. 。有一個(gè)叫高通的公司,賣點(diǎn)陣字庫芯片。有一個(gè)較北京中易的公司,有一套很好的點(diǎn)陣字庫。這套點(diǎn)陣字庫由于性能好,流傳廣,工作經(jīng)驗(yàn)豐富的工程師一般都接觸過;不過大部分公司可能都沒有獲得授權(quán)。還有其他很多做字體的公司也有點(diǎn)陣字庫,比如方正。

          8. 自己用編輯工具一個(gè)一個(gè)畫,然后用你的腦子將其轉(zhuǎn)為數(shù)組。

          來源 | 屋脊雀 http://www.wujique.com/

          本文來源網(wǎng)絡(luò)版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進(jìn)行刪除。

          ???????????????? ?END ?????????????????

          關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。

          歡迎關(guān)注我的視頻號:


          點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

          瀏覽 37
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲欧美日韩激情 | 蜜乳一区二区 | 国产精品久久久免费 | 午夜精品久久久久久久99老熟妇 | 青青操视频在线观看 |