RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在LCD上顯示漢字和英文

嵌入式情報(bào)局 ? 來(lái)源:屋脊雀 ? 2023-11-28 10:20 ? 次閱讀

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

一、如何在LCD上顯示字符

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

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

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

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

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

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

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

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

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

顯然,要在圖文屏上顯示字符,只需將對(duì)應(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)陣上,就能顯示德字。

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

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

二、點(diǎn)陣字庫(kù)

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

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

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

19b0751e-8d2a-11ee-939d-92fbcf53809c.png

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

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í)使用的方式。

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

19d8715e-8d2a-11ee-939d-92fbcf53809c.png

尺寸

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

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

四、矢量字體

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

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

矢量字體使用Freetype進(jìn)行渲染后,最后得到的也是bitmap,畢竟,LCD就是一個(gè)一個(gè)點(diǎn)組成的。

理論上矢量字體可以無(wú)限放大而不失真。

但是,矢量字體渲染為較小字號(hào)的字,某些字(筆畫多)可能失真非常嚴(yán)重。

五、字符編碼

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

19ed568c-8d2a-11ee-939d-92fbcf53809c.png

ASCII碼

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

Codepage

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

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

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

1a0bfeca-8d2a-11ee-939d-92fbcf53809c.png

六、漢字編碼

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

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

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

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

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

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

1a21cb42-8d2a-11ee-939d-92fbcf53809c.png

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

七、如何獲得字庫(kù)

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

版權(quán)說(shuō)的是字體,也就是一個(gè)字符描繪出來(lái)的效果。一個(gè)字體的形成方式通常是矢量字體或者點(diǎn)陣字庫(kù)。

使用工具將一種字體的矢量字庫(kù)轉(zhuǎn)換為點(diǎn)陣字庫(kù),他們?nèi)匀皇峭环N字體,那么版權(quán)是一樣的,依然屬于矢量字體擁有者。

獲取矢量字體

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

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

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

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

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

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

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

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

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

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

從開(kāi)源模塊中找外文點(diǎn)陣比如tslib觸摸庫(kù)中就含有英文點(diǎn)陣

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

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

來(lái)源 | 屋脊雀


審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304793
  • lcd
    lcd
    +關(guān)注

    關(guān)注

    34

    文章

    4424

    瀏覽量

    167396
  • 嵌入式設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    16955
  • 顯示字符
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    7247

原文標(biāo)題:嵌入式屏幕上的漢字原來(lái)是這樣顯示的~

文章出處:【微信號(hào):嵌入式情報(bào)局,微信公眾號(hào):嵌入式情報(bào)局】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【眾拳】LCD彩色液晶屏顯示漢字英文、數(shù)字

    ``實(shí)驗(yàn)?zāi)康模阂浦?b class='flag-5'>LCD底層驅(qū)動(dòng)程序到工程中,在LCD彩色液晶屏顯示漢字、英文、數(shù)字取字模 2
    發(fā)表于 01-03 14:36

    STM32+OLED巧妙顯示漢字英文 精選資料分享

    STM32+OLED巧妙顯示漢字英文目標(biāo):實(shí)現(xiàn)OLED_Print函數(shù),可以在OLED屏幕顯示英文
    發(fā)表于 08-24 06:14

    LCD顯示字符或者漢字是怎么實(shí)現(xiàn)?

    lcd12864基本特性參數(shù)是什么?lcd12864具有哪些引腳功能?在LCD顯示字符或者漢字
    發(fā)表于 09-29 07:09

    請(qǐng)問(wèn)如何在ARM實(shí)驗(yàn)板實(shí)現(xiàn)LCD漢字顯示?

    請(qǐng)問(wèn)如何在ARM實(shí)驗(yàn)板實(shí)現(xiàn)LCD漢字顯示?
    發(fā)表于 10-21 07:46

    LCD1602顯示漢字

    LCD1602顯示漢字,原本只能顯示字符。
    發(fā)表于 11-09 16:17 ?22次下載

    LCD漢字編排軟件

    LCD漢字編排軟件LCD漢字編排軟件LCD漢字編排軟件LCD
    發(fā)表于 12-28 14:31 ?7次下載

    Proteus之字符式LCD顯示漢字

    Proteus之字符式LCD顯示漢字,很好的Proteus資料,快來(lái)下載不學(xué)習(xí)吧
    發(fā)表于 04-19 09:32 ?0次下載

    Proteus之漢字LCD靜態(tài)顯示

    Proteus之漢字LCD靜態(tài)顯示,很好的Proteus資料,快來(lái)下載不學(xué)習(xí)吧。
    發(fā)表于 04-19 09:32 ?0次下載

    Proteus之漢字LCD移位顯示

    Proteus之漢字LCD移位顯示,很好的Proteus資料,快來(lái)下載不學(xué)習(xí)吧。
    發(fā)表于 04-19 09:32 ?0次下載

    LCD12864 顯示漢字

    無(wú)字庫(kù)LCD12864顯示漢字,有程序,有仿真圖。
    發(fā)表于 05-05 17:40 ?78次下載

    LCD液晶顯示漢字字符集表

    LCD液晶顯示漢字字符集表
    發(fā)表于 12-23 02:02 ?0次下載

    LCD顯示漢字的兩種算法分析

    LCD顯示漢字的兩種算法分析。原有的LCD顯示漢字函數(shù)例程只能
    發(fā)表于 02-26 13:52 ?7375次閱讀

    LCD1602自定義顯示字符及漢字

    本文主要介紹了LCD1602自定義顯示字符及漢字。
    發(fā)表于 06-26 08:00 ?85次下載
    <b class='flag-5'>LCD</b>1602自定義<b class='flag-5'>顯示</b>字符及<b class='flag-5'>漢字</b>

    何在Arduino使用LCD

    電子發(fā)燒友網(wǎng)站提供《如何在Arduino使用LCD.zip》資料免費(fèi)下載
    發(fā)表于 02-01 09:25 ?1次下載
    如<b class='flag-5'>何在</b>Arduino<b class='flag-5'>上</b>使用<b class='flag-5'>LCD</b>

    STM32 ILI9341驅(qū)動(dòng)TFTLCD(十)LCD顯示漢字

    LCD顯示漢字原理和顯示字符一樣,設(shè)置區(qū)域初始點(diǎn),把漢字字模寫入顯存。
    發(fā)表于 07-27 15:57 ?3895次閱讀
    STM32 ILI9341驅(qū)動(dòng)TFTLCD(十)<b class='flag-5'>LCD</b><b class='flag-5'>顯示</b><b class='flag-5'>漢字</b>
    RM新时代网站-首页