吴忠躺衫网络科技有限公司

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

嵌入式情報局 ? 來源:屋脊雀 ? 2023-11-28 10:20 ? 次閱讀

摘要: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ù)組就是點陣字庫。

這個德字描繪出的效果,就是點陣字體。描繪信息保存的形式,就是點陣字庫。

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

點陣字庫有多種形式:

1、直接將信息用數(shù)組保存到代碼中。(顯示的內容較少時通常會這樣做)

2、將點陣信息描繪到一張bmp圖片,使用時根據信息文件(FNT)從圖片中取信息。(很多游戲使用的就是這種貼圖字體,也叫bmpfont)

3、將一堆點陣信息數(shù)組打包為1個bin文件,使用算法定位字符位置。(點陣較多,按照編碼規(guī)范整合在一起)

4、按照電腦字體規(guī)范整合的字體。(比如windows的ttf字體,bdf字體)

三、取模方式

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

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

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

尺寸

漢字通常有這些尺寸: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ù)據以便在計算機中存儲和傳輸。

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

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。

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

六、漢字編碼

漢字字符數(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ū)。

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

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

七、如何獲得字庫

在介紹如何獲得字庫之前,先說明版權問題

版權說的是字體,也就是一個字符描繪出來的效果。一個字體的形成方式通常是矢量字體或者點陣字庫。

使用工具將一種字體的矢量字庫轉換為點陣字庫,他們仍然是同一種字體,那么版權是一樣的,依然屬于矢量字體擁有者。

獲取矢量字體

在你的電腦中就有很多字體。windows下的C:WindowsFonts下保存有你電腦安裝的字體,這種字體通常是ttf標準。

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

八、獲取點陣字體

我們更關心的是如何獲取點陣字體。

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

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

從DOS系統(tǒng)獲取漢字點陣這種點陣我用過的有HZ1616,HZ1212。這種字體的版權不是很清楚屬于誰。不過這種字庫因為很早,所以基本都是GB2312規(guī)范的,不包含生僻字。

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

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

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

從開源模塊中找外文點陣比如tslib觸摸庫中就含有英文點陣

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

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

來源 | 屋脊雀


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

    關注

    5092

    文章

    19177

    瀏覽量

    307636
  • lcd
    lcd
    +關注

    關注

    34

    文章

    4438

    瀏覽量

    168374
  • 嵌入式設備
    +關注

    關注

    0

    文章

    110

    瀏覽量

    17031
  • 顯示字符
    +關注

    關注

    0

    文章

    3

    瀏覽量

    7264

原文標題:嵌入式屏幕上的漢字原來是這樣顯示的~

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

    ``實驗目的:移植LCD底層驅動程序到工程中,在LCD彩色液晶屏顯示漢字、英文、數(shù)字取字模 2
    發(fā)表于 01-03 14:36

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

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

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

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

    請問如何在ARM實驗板實現(xiàn)LCD漢字顯示?

    請問如何在ARM實驗板實現(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資料,快來下載不學習吧
    發(fā)表于 04-19 09:32 ?0次下載

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

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

    Proteus之漢字LCD移位顯示

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

    LCD12864 顯示漢字

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

    LCD液晶顯示漢字字符集表

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

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

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

    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ā)燒友網站提供《如何在Arduino使用LCD.zip》資料免費下載
    發(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驅動TFTLCD(十)LCD顯示漢字

    LCD顯示漢字原理和顯示字符一樣,設置區(qū)域初始點,把漢字字模寫入顯存。
    發(fā)表于 07-27 15:57 ?4172次閱讀
    STM32 ILI9341驅動TFTLCD(十)<b class='flag-5'>LCD</b><b class='flag-5'>顯示</b><b class='flag-5'>漢字</b>
    喜达百家乐官网的玩法技巧和规则| 大发888注册奖金| 朝阳市| 百家乐视频下载地址| 利来国际娱乐网站| 免邮百家乐官网布桌| 789棋牌游戏| 香港百家乐官网的玩法技巧和规则| 大发888娱乐城官方lm0| 百家乐官网斗地主下载| 大发888娱乐城下载lm0| 八大胜百家乐官网娱乐城| 大发888客服电话 在线| 百家乐官网游戏方法| 太阳城代理最新网址| 百家乐官网博娱乐网提款速度快不| 大发888娱乐场下载zhidu| 手机百家乐官网游戏| 立博| 百家乐投注技巧| 百家乐官网推荐怎么看| 淘宝博百家乐的玩法技巧和规则 | 百家乐知道| 百家乐官网薯片| 大发888开户送58| 3U百家乐游戏| 网页百家乐官网| 迪士尼百家乐的玩法技巧和规则 | 大发888备用网| 24是吉还是凶| 搜索| 全讯网5532888| 巴比伦百家乐官网的玩法技巧和规则 | 线上娱乐网站| 赌博百家乐趋势把握| 百家乐官网必赢法软件| 大发888赌博网站大全| 百家乐赌场作弊| 网上百家乐官网作弊不| 威尼斯人娱乐场 送2688元礼金领取lrm64 | 大发888亚洲游戏平台|