




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上2010-12-06 17:12:46分類:點陣字庫的原理(引文)所有的漢字或者英文都是下面的原理,由左至右,每8個點占用一個字節(jié),最后不足8個字節(jié)的占用一個字節(jié),而且從最高位向最低位排列。生成的字庫說明:(以1212例子)一個漢字占用字節(jié)數(shù):128=14也就是占用了212=24個字節(jié)。編碼排序A0A0A0FE A1A0A2FE依次排列。以1212字庫的“我”為例:“我”的編碼為CED2,所以在漢字排在CEH-AOH=2EH區(qū)的D2H-A0H=32H個。所以在1212字庫的起始位置就是FE-A0*2EH+32H*24=開始的24個字節(jié)就是我的點陣模。其他的類推即可。英
2、文點陣也是如此推理。在DOS程序中使用點陣字庫的方法 首先需要理解的是點陣字庫是一個數(shù)據(jù)文件,在這個數(shù)據(jù)文件里面保存了所有文字的點陣數(shù)據(jù).至于什么是點陣,我想我不講大家都知道 的,使用過文曲星之類的辭典吧,那個的上面顯示的漢子就能夠明顯的看出點陣的痕跡.在 PC 機(jī)上也是如此,文字也是由點陣來組成了,不同的是,PC機(jī)的顯示分辨率更高,高到了我們?nèi)庋蹮o法區(qū)分的地步,因此點陣的痕跡也就不那么明顯了. 點陣、矩陣、位圖這三個概念在本質(zhì)上是有聯(lián)系的,從某種程度上來講,這三個就是同義詞.點陣從本質(zhì)上講就是單色位圖,他使用一個比特來表示一個點,如果這 個比特為0,表示某個位置沒有點,如果為1表示某個位置有
3、點.矩陣和位圖有著密不可分的聯(lián)系,矩陣其實是位圖的數(shù)學(xué)抽象,是一個二維的陣列.位圖就是這種 二維的陣列,這個陣列中的 (x,y) 位置上的數(shù)據(jù)代表的就是對原始圖形進(jìn)行采樣量化后的顏色值.但是,另一方面,我們要面對的問題是,計算機(jī)中數(shù)據(jù)的存放都是一維的,線性的.因此,我們需要 將二維的性化到一維里面去.通常的做法就是將二維數(shù)據(jù)按行順序的存放,這樣就線性化到了一維. 那么點陣字的數(shù)據(jù)存放細(xì)節(jié)到底是怎么樣的呢.其實也十分的簡單,舉個例子最能說明問題.比如說 16*16 的點陣,也就是說每一行有16個點,由于一個點使用一個比特來表示,如果這個比特的值為1,則表示這個位置有點,如果這個比特的值為0,則表
4、示這個位置沒 有點,那么一行也就需要16個比特,而8個比特就是一個字節(jié),也就是說,這個點陣中,一行的數(shù)據(jù)需要兩個字節(jié)來存放.第一行的前八個點的數(shù)據(jù)存放在點陣數(shù) 據(jù)的第一個字節(jié)里面,第一行的后面八個點的數(shù)據(jù)存放在點陣數(shù)據(jù)的第二個字節(jié)里面,第二行的前八個點的數(shù)據(jù)存放在點陣數(shù)據(jù)的第三個字節(jié)里面,然后后 面的就以此類推了.這樣我們可以計算出存放一個點陣總共需要32個字節(jié).看看下面這個圖形化的例子: | |1| | | | | | | | | | |1| | | | | | |1|1| |1|1|1|1|1|1|1|1|1| | | | | | |1| | | | | | | | |1| | | | |
5、1| | | | | |1| | | | | |1| | | | | |1|1| | | |1| | | | | |1| | | | | | |1| | | |1| | | | |1| | | | | | | | | |1| | |1| | | |1| | | | | | | | |1| | | |1| | |1| | | | | | | | |1| | | | | |1| |1| | | | | | |1|1|1| | | | | | |1| | | | | | | | | |1| | | | | |1| |1| | | | | | | | |1| | | | |1| | | |1| | |
6、 | | | | |1| | | |1| | | | | |1| | | | | | |1| | |1| | | | | | |1|1|1| | | | | | |1| | | | | | | | |1| | | | | | | | | | | | | | | | | | | | 可以看出這是一個漢字的點陣,當(dāng)然文本的方式效果不是很好.根據(jù)上面的原則,我們可以寫出這個點陣的點陣數(shù) 據(jù):0x40,0x08,0x37,0xfc,0x10,0x08, 當(dāng)然寫這個確實很麻煩所以我不再繼續(xù)下去.我這樣做,也只是為了向你說明,在點陣字庫中,每一個點陣的數(shù)據(jù)就是按照這種方式存放的. 當(dāng)然也存在著不規(guī)則的點陣
7、,這里說的不規(guī)則,指的是點陣的寬度不是8的倍數(shù),比如 12*12 的點陣,那么這樣的點陣數(shù)據(jù)又是如何存放的呢?其實也很簡單,每一行的前面8個點存放在一個字節(jié)里面,每一行的剩下的4點就使用一個字節(jié)來存放,也就是說 剩下的4個點將占用一個字節(jié)的高4位,而這個字節(jié)的低4位沒有使用,全部都默認(rèn)的為零.這樣做當(dāng)然顯得有點浪費,不過卻能夠便于我們進(jìn)行存放和尋址.對于 其他不規(guī)則的點陣,也是按照這個原則進(jìn)行處理的.這樣我們可以得出一個 m*n 的點陣所占用的字節(jié)數(shù)為 (m+7)/8*n. 在明白了以上所講的以后,我們可以寫出一個顯示一個任意大小的點陣字模的函數(shù),這個函數(shù)的功能是輸出一個寬度為w,高度為h的字
8、模到屏幕的 (x,y) 坐標(biāo)出,文字的顏色為 color,文字的點陣數(shù)據(jù)為 pdata 所指: /*輸出字模的函數(shù)*/ void _draw_model(char *pdata, int w, int h, int x, int y, int color) int i; /* 控制行 */ int j; /* 控制一行中的8個點 */ int k; /* 一行中的第幾個8個點了 */ int nc; /* 到點陣數(shù)據(jù)的第幾個字節(jié)了 */ int cols; /* 控制列 */ BYTE static mask8=128, 64, 32, 16, 8, 4, 2, 1; /* 位屏蔽字 */ w
9、 = (w + 7) / 8 * 8; /* 重新計算w */ nc = 0; for (i=0; i cols = 0; for (k=0; k for (j=0; j_hz_buf_size * (ch0 - 1) * 94 + ch1 - 1); fseek(fp, offset, SEEK_SET); /* 進(jìn)行尋址 */ fread(fontbuf, 1, (w + 7) / 8 * h, fp); /* 讀入點陣數(shù)據(jù) */ _draw_model(fontbuf, w, h, x, y, color); /* 繪制字模 */ 以上介紹完了中文點陣字庫的原理,當(dāng)然還有英文點陣字庫了.
10、英文點陣字庫中單個點陣字模數(shù)據(jù)的存放方式與中文是一模一樣的,也就是對我們所寫的 _draw_model 函數(shù)同樣可以使用到英文字庫中.唯一不同的是對點陣字庫的尋址上.英文使用的就是 ASCII 碼,其碼值是0到127,尋址公式為: 英文點陣數(shù)據(jù)在英文點陣字庫中的偏移 = 英文的ASCII碼 * 一個英文字模占用的字節(jié)數(shù) 可以看到,區(qū)分中英文的關(guān)鍵就是,一個字符是 ASCII 碼還是擴(kuò)展 ASCII 碼,如果是 ASCII 碼,其范圍是0到127,這樣是使用的英文字庫,如果是擴(kuò)展 ASCII 碼,則與其后的另一個擴(kuò)展 ASCII 碼組成漢字內(nèi)碼,使用中文字庫進(jìn)行顯示.只要正確區(qū)分 ASCII 碼
11、的類型并進(jìn)行分別的處理,也就能實現(xiàn)中英文字符串的混合輸出了.點陣字庫和矢量字庫的差別 我們都只知道,各種字符在屏 幕上都是以一些點來表示的,因此也叫點陣.最早的字庫就是直接把這些點存儲起來,就是點陣字庫.常見的漢字點陣字庫有 16x16, 24x24 等.點陣字庫也有很多種,主要區(qū)別在于其中存儲編碼的方式不同.點陣字庫的最大缺點就是它是固定分辨率的,也就是每種字庫都有固定的大小尺寸,在原始尺寸 下使用,效果很好,但如果將其放大或縮小使用,效果就很糟糕了,就會出現(xiàn)我們通常說的鋸齒現(xiàn)象.因為需要的字體大小組合有無數(shù)種,我們也不可能為每種大小 都定義一個點陣字庫.于是就出現(xiàn)了矢量字庫. 矢量字庫 矢
12、量字庫是把每個字符的筆劃分解成各種直線和曲線,然后記下這些直線和曲線的參數(shù),在顯示的時候,再根據(jù)具體的尺寸大小,畫出這些線條,就還原了原來的字 符.它的好處就是可以隨意放大縮小而不失真.而且所需存儲量和字符大小無關(guān).矢量字庫有很多種,區(qū)別在于他們采用的不同數(shù)學(xué)模型來描述組成字符的線條.常 見的矢量字庫有 Type1字庫和Truetype字庫. 在點陣字庫中,每個字符由一個位圖表示(如圖2.5所示),并把它用一個稱為字符掩膜的矩陣來表示,其中的每個元素都是一位二進(jìn)制數(shù),如果該位為1表示字 符的筆畫經(jīng)過此位,該像素置為字符顏色;如果該位為0,表示字符的筆畫不經(jīng)過此位,該像素置為背景顏色.點陣字符的
13、顯示分為兩步:首先從字庫中將它的位圖 檢索出來,然后將檢索到的位圖寫到幀中. 在實際應(yīng)用中,同一個字符有多種字體(如宋體、楷體等),每種字體又有多種大小型號,因此字庫的存儲空間十分龐大.為了減少存儲空間,一般采用壓縮技術(shù). 矢量字符記錄字符的筆畫信息而不是整個位圖,具有存儲空間小,美觀、變換方便等優(yōu)點.例如:在AutoCAD中使用圖形實體-形(Shape)-來定義矢 量字符,其中,采用了直線和圓弧作為基本的筆畫來對矢量字符進(jìn)行描述. 對于字符的旋轉(zhuǎn)、放大、縮小等幾何變換,點陣字符需要對其位圖中的每個象素進(jìn)行變換,而矢量字符則只需要對其幾何圖素進(jìn)行變換就可以了,例如:對直線筆畫 的兩個端點進(jìn)行變
14、換,對圓弧的起點、終點、半徑和圓心進(jìn)行變換等等. 矢量字符的顯示也分為兩步.首先從字庫中將它的字符信息.然后取出端點坐標(biāo),對其進(jìn)行適當(dāng)?shù)膸缀巫儞Q,再根據(jù)各端點的標(biāo)志顯示出字符. 輪廓字形法是當(dāng)今國際上最流行的一種字符表示方法,其壓縮比大,且能保證字符質(zhì)量.輪廓字形法采用直線、B樣條/Bezier曲線的集合來描述一個字符的 輪廓線.輪廓線構(gòu)成一個或若干個封閉的平面區(qū)域.輪廓線定義加上一些指示橫寬、豎寬、基點、基線等等控制信息就構(gòu)成了字符的壓縮數(shù)據(jù).如何使用Windows的系統(tǒng)字庫生成點陣字庫? 我的程序現(xiàn)在只能預(yù)覽一個漢字的不同字體的點陣表達(dá). 界面很簡單: 一個輸出點陣大小的選擇列表(8x8,
15、16x16,24x24等),一個系統(tǒng)中已有的字體名稱列表,一個預(yù)覽按鈕,一塊畫圖顯示區(qū)域. 得到字體列表的方法:(作者稱這一段是用來取回系統(tǒng)的字體,然后添加到下拉框中) /取字體名稱列表的回調(diào)函數(shù),使用前要聲明一下該方法 int CALLBACK MyEnumFtProc(ENUMLOGFONTEX* lpelf,NEWTEXTMETRICEX* lpntm,DWORD nFontType,long lParam) CFontPeekerDlg* pWnd=(CFontPeekerDlg*) lParam; if(pWnd) if( pWnd-m_combo_sfont.Findring(0,
16、 lpelf-elfLogFont.lfFaceName) m_combo_sfont.AddString(lpelf-elfLogFont.lfFaceName); return 1; return 0; /說明:CFontPeekerDlg 是我的dialog的類名, m_combo_sfont是列表名稱下拉combobox關(guān)聯(lián)的control變量 /調(diào)用的地方 (*問題1:下面那個&lf怎么得到呢) :EnumFontFamiliesEx(HDC) dc,&lf, (FONTENUMPROC)MyEnumFontProc,(LPARAM) this,0); m_combo_sfont.S
17、etCurSel(0); 字體預(yù)覽: 如果點陣大小選擇16,顯示的時候就畫出16x16個方格.自定義一個類CMyStatic繼承自CStatic,用來畫圖.在CMyStatic的OnPaint()函數(shù)中計算并顯示. 取得字體: 常用的方法:用CreateFont創(chuàng)建字體,把字TextOut再用GetPixel()取點存入數(shù)組. 缺點:必須把字TextOut出來,能在屏幕上看見,不爽. 我的方法,用這個函數(shù):GetGlyphOutline(),可以得到一個字的輪廓矢量或者位圖.可以不用textout到屏幕,直接取得字模信息 函數(shù)原型如下: DWORD GetGlyphOutline( HDC h
18、dc, /畫圖設(shè)備句柄 UINT uChar, /將要讀取的字符/漢字 UINT uFormat, /返回數(shù)據(jù)的格式(字的外形輪廓還是字的位圖) LPGLYPHMETR lpgm, / GLYPHMETRICS結(jié)構(gòu)地址,輸出參數(shù) DWORD cbBuffer, /輸出數(shù)據(jù)緩沖區(qū)的大小 LPVOID lpvBuffer, /輸出數(shù)據(jù)緩沖區(qū)的地址 COT MAT2 *lpmat2 /轉(zhuǎn)置矩陣的地址 ); 說明: uChar字符需要判斷是否是漢字還是英文字符.中文占2個字節(jié)長度. lpgm是輸出函數(shù),調(diào)用GetGlyphOutline()是無須給lpgm 賦值. lpmat2如果不需要轉(zhuǎn)置,將 eM
19、11.value=1; eM22.value=1; 即可. cbBuffer緩沖區(qū)的大小,可以先通過調(diào)用GetGlyphOutline(lpgm, 0, NULL, mat); 來取得,然后動態(tài)分配lpvBuffer,再一次調(diào)用GetGlyphOutline,將信息存到lpvBuffer. 使用完畢后再釋放lpvBuffer. 程序示例:(*問題2:用這段程序,我獲取的字符點陣總都是一樣的,不管什么字) 前面部分省略 GLYPHMETRICS glyph; MAT2 m2; memset(&m2, 0, sizeof(MAT2); m2.eM11.value = 1; m2.eM22.valu
20、e = 1; /取得buffer的大小 DWORD cbBuf = dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph, 0L, NULL, &m2); BYTE* pBuf=NULL; /返回GDI_ERROR表示失敗. if( cbBuf != GDI_ERROR ) pBuf = new BYTEcbBuf; /輸出位圖GGO_BITMAP 的信息.輸出信息4字節(jié)(DWORD)對齊 dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph, cbBuf, pBuf, &m2); else if(m_pFont!=N
21、ULL) delete m_pFont; return; 編程中遇到問題: 一開始,GetGlyphOutline總是返回-1,getLastError顯示是無法完成的功能,后來發(fā)現(xiàn)是因為調(diào)用之前沒有給hdc設(shè)置Font. 后來能取得pBuf信息后,又開始郁悶,因為不太明白bitmap的結(jié)果是按什么排列的.后來跟蹤漢字一來調(diào)試(這個字簡單),注意到了 glyph.gmBlackBoxX 其實就是輸出位圖的寬度,glyph.gmBlackBoxY就是高度.如果gmBlackBoxX=15,glyph.gmBlackBoxY=2,表 示輸出的pBuf中有這些信息:位圖有2行信息,每一行使用15 b
22、it來存儲信息. 例如:我讀取一:glyph.gmBlackBoxX = 0x0e,glyph.gmBlackBoxY=0x2; pBuf長度cbBuf=8 字節(jié) pBuf信息: 00 08 00 00 ff fc 00 00 字符寬度 0x0e=14 則 第一行信息為: 0000 0000 0000 100 (只取到前14位) 第二行根據(jù)4字節(jié)對齊的規(guī)則,從0xff開始 1111 1111 1111 110 看出一字了嗎?呵呵 直到他的存儲之后就可以動手解析輸出的信息了. 我定義了一個宏#define BIT(n) (1(n) 用來比較每一個位信息時使用 后來又遇到了一個問題,就是小頭和大頭
23、的問題了.在我的機(jī)器上是little endian的形式,如果我用 unsigned long *lptr = (unsigned long*)pBuf; /j from 0 to 15 if( *lptr & BIT(j) ) /這時候如果想用j來表示寫1的位數(shù),就錯了 因為從字節(jié)數(shù)組中轉(zhuǎn)化成unsigned long型的時候,數(shù)值已經(jīng)經(jīng)過轉(zhuǎn)化了,像上例中,實際上是0x0800 在同BIT(j)比較. 不多說了,比較之前轉(zhuǎn)化一下就可以了if( htonl(*lptr) & BIT(j) )Unicode中文點陣字庫的生成與使用 點陣字庫包含兩部分信息.首先是點陣字庫文件頭信息,它包含點陣字庫
24、文字的字號、多少位表示一個像素,英文字母與符號的size、起始和結(jié)束 unicode編碼、在文件中的起始偏移,漢字的size、起始和結(jié)束unicode編碼、在文件中的起始偏移.然后是真實的點陣數(shù)據(jù),即一段段二進(jìn)制 串,每一串表示一個字母、符號或漢字的點陣信息. 要生成點陣字庫必須有文字圖形的來源,我的方法是使用ttf字體.ttf字體的顯示采用的是SDL_ttf庫,這是開源圖形庫SDL的一個擴(kuò)展庫,它使用的是libfreetype以讀取和繪制ttf字體. 它提供了一個函數(shù),通過傳入一個Unicode編碼便能輸出相應(yīng)的文字的帶有alpha通道的位圖.那么我們可以掃描這個位圖以得到相應(yīng)文字的點陣信息
25、. 由于帶有alpha通道,我們可以在點陣信息中也加入權(quán)值,使得點陣字庫也有反走樣效果.我采用兩位來表示一個點,這樣會有三級灰度(還有一個表示透 明). 點陣字庫的顯示首先需要將文件頭信息讀取出來,然后根據(jù)unicode編碼判斷在哪個區(qū)間內(nèi),然后用unicode編碼減去此區(qū)間的起始unicode編 碼,算出相對偏移,并加上此區(qū)間的文件起始偏移得到文件的絕對偏移,然后讀出相應(yīng)位數(shù)的數(shù)據(jù),最后通過掃描這段二進(jìn)制串,在屏幕的相應(yīng)位置輸出點陣字型. 顯示點陣字體需要頻繁讀取文件,因此最好做一個固定大小的緩存,采用LRU置換算法維護(hù)此緩存,以減少磁盤讀取.標(biāo)準(zhǔn)點陣字庫芯片標(biāo)準(zhǔn)點陣字庫的特點: 1.內(nèi)涵全
26、國信標(biāo)委授權(quán)的標(biāo)準(zhǔn)點陣字型數(shù)據(jù)、 2.支持國標(biāo)字符集GB2312(6,763漢字),GB18030(27,484漢字). 3.支持多種點陣字型,包括1112點,1516點,2424點,3232點. 4.免除了字庫燒錄和測試工序,并節(jié)省了2%以上的燒錄損耗. 5.價格相當(dāng)于空白價格標(biāo)準(zhǔn)點陣字庫芯片的種類和應(yīng)用51單片機(jī)的1314點陣縮碼漢卡 我們歷時數(shù)載,開發(fā)成511314點陣縮碼漢卡,適用于目前國內(nèi)外應(yīng)用最為廣泛的MCSX-51及其兼容系列單片機(jī). 與此同時,還開發(fā)了1314點陣漢字字模.1314點陣字模,可完全與目前通用的1616點陣漢字字模媲美,其在單片機(jī)和嵌入式系統(tǒng)的漢字顯示應(yīng)用中也具有
27、明顯的經(jīng)濟(jì)價值和實用意義. 1.單片機(jī)目前的漢字顯示 信息交流的最主要方式之一即文字交流,但由于我國方塊漢字?jǐn)?shù)量繁多,構(gòu)形迥異,使?jié)h字顯示一直是我國計算機(jī)普及的障礙.隨著計算機(jī)技術(shù)的迅速發(fā)展,PC機(jī) 的漢字顯示已不成問題.但對于成本低、體積小、應(yīng)用靈活且用量極為巨大的單片機(jī)而言,因其結(jié)構(gòu)簡單,硬件資源十分有限,其漢字顯示仍面對著捉襟見肘,力不 從心的窘境. 目前單片機(jī)的漢字顯示有三種基本方法. 采用標(biāo)準(zhǔn)字庫法.即將國標(biāo)漢字庫固人ROM中,將單片機(jī)的硬件和軟件進(jìn)行特別擴(kuò)展后以顯示漢字.眾所周知,即使是1616點陣標(biāo)準(zhǔn)字庫,也須占用200KB以上的單元, 而就目前主流5l系列單片機(jī)而言,最大尋址范
28、圍僅64KB,即使程序區(qū)與數(shù)據(jù)區(qū)合起來也僅128KB內(nèi)存.因此,若不加特別的擴(kuò)展設(shè)計,不要說檢字程序和 用戶空間,僅字庫都裝不下.這種方法雖然可以方便地使用現(xiàn)成標(biāo)準(zhǔn)字庫,但卻需占用大量的硬件和軟件資源,增加很大一部分成本和設(shè)計難度,所以不經(jīng)常使用. 字模直接固化法.即將所顯示的漢字,依先后順序?qū)⑵渥帜R灰粡臉?biāo)準(zhǔn)字庫中提取后,重新固化,予以顯示.此法雖為簡捷,但只適于顯示少量漢字,且字模的制取繁瑣,軟件的修改維護(hù)都很困難. 帶索引小字庫法.即將欲顯示文件中的漢字字模,從標(biāo)準(zhǔn)字庫中逐一提取固化,制成小型字庫,并按其在小字庫中的位置制成索引表,顯示時從索引表查出其新的 字模取碼地址,取碼顯示.此方法
29、雖比較靈活,可顯示較多的漢字,但仍然局限于只能顯示固定文件內(nèi)容,且字模制取同樣麻煩. 一種較新的單片機(jī)漢字動態(tài)編碼與(見單片機(jī)與嵌入式系統(tǒng)應(yīng)用雜志年第1期和第9期),實際上也是一種動態(tài)的小字庫法,只是字庫的制取,索引的編寫及文件的改碼皆由PC機(jī)自動完成,免去了繁瑣的人工處理. 由上可見,目前單片機(jī)各種漢字顯示方案均不理想.標(biāo)準(zhǔn)字庫法,單片機(jī)不堪重負(fù);而其它方法最大且又無法克服的缺點是,所顯示文字皆有局限.顯示內(nèi)容也皆須 專業(yè)人員設(shè)計而定,用戶難于更改.這便極大地限制了單片機(jī)在各個領(lǐng)域的開拓和應(yīng)用.究其原因,皆為單片機(jī)本身無漢卡,而這也正是我們致力于51漢卡開 發(fā)的初衷. 2.1314點陣漢字字
30、模 為墊定5l漢卡的字型基礎(chǔ),首先開發(fā)成了l314點陣漢字字模.在目前通用的漢字字模中,最簡單的是1616點陣字模.在微型中, 也偶見有1212點陣字模,但實用中不多見.字模點陣數(shù)直接決定著每一漢字所占單元內(nèi)存值,能否在保證字模準(zhǔn)確、美觀的基礎(chǔ)上,尋找一種較少的點陣字模 呢?這便是我們最初的想法.于是我們經(jīng)過反復(fù)選擇比較,終于在國內(nèi)首個推出了1314點陣字模.此設(shè)計,一是基于我國漢字為方塊字,故其行、列值需相 近;二是漢字多有對稱1生,故其列值宜奇不宜偶.設(shè)計實際表明,若行、列值很少,則難保證字模的準(zhǔn)確性和美觀性.? 1314點陣字模,是以我國現(xiàn)行簡化字為準(zhǔn),并在此基礎(chǔ)上設(shè)計而成.與目前通用的
31、漢字16l6點陣字模相比,其準(zhǔn)確性和美觀性并不遜色.然而其單字所 占內(nèi)存卻由32個單元降至26個單元;另外使得每個單字顯示由原來的256個像素降至l82個像素,使顯示成本和空間均減少近三分之一.100200點 陣字屏,可顯示16l6點陣漢字72個,而l314點陣漢字便可顯示l05個,且顯示效果并無太大差異.這無疑對單片機(jī)和嵌入式系統(tǒng)漢字顯示產(chǎn)品的開發(fā)和應(yīng)用,具有明顯的經(jīng)濟(jì)價值和實用意義. 3.1314點陣縮碼漢卡 51漢卡依據(jù)我國的漢字特點和單片機(jī)的快速構(gòu)字功能,在1314點陣字?;A(chǔ)上,以縮碼形式開發(fā)而成單片機(jī)漢卡的開發(fā),應(yīng)以目前通用的主流單片機(jī)為 研發(fā)對象,還應(yīng)在囊括國標(biāo)一、二級漢字及常用
32、字符的前提下,使內(nèi)存占用必須降至主流單片機(jī)可尋址范圍內(nèi),且需留有足夠的檢字程序和用戶應(yīng)用空間.另外,字 模設(shè)計必須準(zhǔn)確、美觀.字模提取速度也必須滿足實用要求.51漢卡的開發(fā)正是依據(jù)原則,并達(dá)到了以上各項要求. 顧名思義,51漢卡,即以MCS-51系列及其兼容單片機(jī)為研發(fā)對象.以51系列為代表的8位單片機(jī),在過去、現(xiàn)在以及可以予見的將來,都將是嵌入式系統(tǒng)低端應(yīng)用的主流機(jī)型.此乃業(yè)界專家的共識. 51漢卡囊括了GB2312-80國標(biāo)字庫的全部一、二級漢字,并增補(bǔ)漢字86個;同時包括了大、小英文字母、阿拉伯?dāng)?shù)字等160個常用字符和不 到4KB的構(gòu)字程序,卻僅總共占用了不足66KB的內(nèi)存.每字平均約占
33、9.8個單元,相對于1616點陣每字占32單兀內(nèi)存而言,尚不到其三分之一.這 對于具有相互獨立的64KB程序區(qū)和64KB數(shù)據(jù)區(qū)的51系列單片機(jī)而言,若適當(dāng)配置內(nèi)存,可為檢字程序和用戶留出90%以上的程序空間及相當(dāng)數(shù)量的數(shù)據(jù) 空間,對于一般用戶的應(yīng)用,都將綽綽有余. 另外,為使51漢卡更便于使用和進(jìn)一步節(jié)省內(nèi)存,在上述基礎(chǔ)上又開發(fā)成一套簡化版本,刪去了部分較偏僻的二級漢字.簡化版本包括約個漢字,共占用內(nèi)存58KB.實際上,按有關(guān)權(quán)威部門的統(tǒng)計,一般文本99%的文字是由個字寫成的,因此使用簡化版本,并配以簡單的造字程序,一般亦可滿足我們的使用要求. 51漢卡所用字模,即我們開發(fā)的完全可與1616點
34、陣字模媲美的I314點陣漢字字模.字模提取速度是我們最為關(guān)心的問題之一.經(jīng)測試及實際使用表明,51漢卡的提模速度完全可滿足單片機(jī)漢字顯示的實用要求. 我們使用公 司MCS-51經(jīng)典系列87C51單片機(jī)在24MHz頻率下測試,平均字模提取速度為2.1ms/字.因人的視覺暫留時間為0.1s,無論理論還是實際使 用都表明,50字字模提取并顯示,并無遲滯和待機(jī)之感.即使在1?2MHz頻率下,20字取模,即點即出,在一般拼音檢字和少量漢字顯示中,完全可滿足使 用要求.隨著單片機(jī)技術(shù)的迅速發(fā)展,目前,公司、公司、philips公司、我國臺灣華邦等公司生產(chǎn)的MCS-51兼容單片機(jī)時鐘頻率可達(dá)33MHz,增強(qiáng)
35、型可達(dá)40MHz,以至達(dá)60MHz;現(xiàn)市售的C89LE系列單片機(jī),最高頻率可達(dá)90MHz.這些都完全能與MCS-51芯片兼容,對于更高需求的場合,更新升級也十分簡便.另外,在單片機(jī)和嵌入式系統(tǒng)中,文字顯示速度要求并不高,只要滿足換屏?xí)r的視覺要求即可.其漢字顯示字?jǐn)?shù),一般也不太多.如用,12864點陣,才顯示32個字;19264點陣才顯48個字;即使使用l314點陣字模,滿屏也才56個漢字. 4.51漢卡設(shè)計依據(jù)及說明 51漢卡設(shè)計依據(jù)是,我國漢字雖然數(shù)量繁多,字型各異,但其中復(fù)合結(jié)構(gòu)者占大部分,并素有偏旁取義,正字取音之說.如寸字與不同偏旁可組成 村、付、討、守、過等字.因此51漢卡除單結(jié)構(gòu)字
36、基本以全碼設(shè)計外,復(fù)臺結(jié)構(gòu)字多用相應(yīng)的單體字及其偏旁,以結(jié)構(gòu)代碼寫成.利用單 片機(jī)快速的單元積木式構(gòu)字程序,便可迅速生成字模代碼.這既保證了提碼速度,又節(jié)省了大量的漢卡內(nèi)存. 有關(guān)51漢卡的幾點說明如下: 凡漢字庫中簡、繁體字都有的用簡體.如後以后代,馀以余代等; 新華字典未收入字,多未收入,如酏、鼽等字,但婧、弳等字仍收入; 對于多體字,一般以常用字代,如摺以折代,鏇以旋,代等,但吒不以咤代,讎不以仇代等; 對通常已由其它字取代的字,都以這些字代替,如崠以東代,肛以船代等; 二級漢字中,不單獨構(gòu)成漢字的偏旁未收入; 依據(jù)名篇名著,生活用語等,增補(bǔ)漢字86個; 收編大、小寫英文字母、阿拉伯?dāng)?shù)字
37、、標(biāo)點符號等各種常用字符160個. 5.51單片機(jī)漢卡應(yīng)用舉例 利用51單片機(jī)漢卡,將使51系列單片機(jī)的漢字顯示輕而易舉,并可大為降低成本、體積和設(shè)計開發(fā)的難度,為單片機(jī)在生產(chǎn)控制、信息通信、文化教育和日常生活等領(lǐng)域,特別是計算機(jī)終端和手持產(chǎn)品的開發(fā)提供極大的便利和支持.? 我們現(xiàn)已初步開發(fā)成51漢卡的區(qū)位碼輸入法和拼音輸入法,檢字程序,并利用51漢卡成功地開發(fā)了帶有廉價單片機(jī)控制器的LED漢字顯示屏.這不僅大幅度降低了成本費用.而且用戶可以通過單片機(jī)控制器,隨心所欲地改變顯示內(nèi)容. 51硬件設(shè)計-87C51、12MHz. 程序一1片EPROM?27C512. 數(shù)據(jù)存儲器一1片EPROM?27
38、C512;1片28C64A;1片6116. 控制器顯示屏一LCD?HY一19264B(深圳秋田視佳實業(yè)有限公司).選24016點陣. 本系統(tǒng)用標(biāo)準(zhǔn)小鍵盤檢字,一次可予選4000字;控制器LCD滿屏顯示l314點陣漢字56個;LED屏滿屏顯示漢字19個. 地址分配及用途如表l所列. 5.2程序設(shè)計框圖 程序設(shè)計流程如圖1所示.本系統(tǒng)采用12MHz晶振,若LCD取滿屏56字,換屏?xí)r有約0.1s的延時,這對人的實際視覺并無大影響.標(biāo)準(zhǔn)點陣漢字字庫芯片 1 概述 GT23L24M1W是一款內(nèi)含24X24點陣的漢字庫,支持GB18030國標(biāo)漢字(含有國家信標(biāo)委合法授 權(quán))及ASCII字符.排列格式為橫置橫排.用戶通過字符內(nèi)碼,利用本手冊提供的方法計算出該字符點陣 在芯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣州電氣工程師求職信簡歷
- 血管活性藥物的臨床應(yīng)用
- 行政辦公知識培訓(xùn)
- 醫(yī)療器械操作與維護(hù)試題卷
- 古詩里的故事情感讀后感
- 航空公司述職報告
- 危險化學(xué)品安全生產(chǎn)管理
- 航空航天材料應(yīng)用知識重點
- 關(guān)于產(chǎn)品推廣策略討論的會議紀(jì)要
- 第三方醫(yī)學(xué)實驗室相關(guān)行業(yè)投資規(guī)劃報告范本
- 醫(yī)院財務(wù)知識培訓(xùn)
- 綠植花卉租賃合同
- 2025年內(nèi)蒙古建筑職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案1套
- 部編人教版小學(xué)一年級道德與法制教案全冊
- 眼視光行業(yè)現(xiàn)狀及展望
- 幼兒園學(xué)前班春季家長會演講稿
- 2024年云南省高等職業(yè)技術(shù)教育招生考試數(shù)學(xué)試題
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫含答案
- 2025年時事政治考題及參考答案(350題)
- JBT 11699-2013 高處作業(yè)吊籃安裝、拆卸、使用技術(shù)規(guī)程
評論
0/150
提交評論