機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
點(diǎn)陣漢字顯示方法源程序(C語言)
點(diǎn)陣漢字顯示方法源程序(C語言)
 更新時(shí)間:2009-12-17 10:53:23  點(diǎn)擊數(shù):0
【字體: 字體顏色
        由于Turbo C應(yīng)用于DOS操作系統(tǒng)下,在使用Turbo C進(jìn)行程序設(shè)計(jì)時(shí),一般情況下只好使用英文進(jìn)行人機(jī)交互。要是想直接用中文界面,就需要另想他法了。
  如果使用中文DOS系統(tǒng)(如UCDOS),則可以解決在字符界面下的漢字顯示問題。也就是說,可以用printf或其他字符串函數(shù)來輸出漢字。
  但是,這樣仍然有一些不方便。必須先啟動(dòng)中文DOS系統(tǒng),再執(zhí)行Turbo C或編譯好的程序。并且在中文版DOS下運(yùn)行Tubor C時(shí),還可能出現(xiàn)一些問題。而對于圖形界面來說,這種辦法也行不通了。
  那么在圖形界面下顯示漢字的問題就迫切需要解決了。既然是圖形界面,只要把漢字當(dāng)成一幅畫,畫在顯示屏上不就可以了。關(guān)鍵在于如何取得漢字的圖形,也就是漢字的點(diǎn)陣字模呢。其實(shí)那些中文版的DOS顯示漢字的方式也就是在圖形界面下畫出漢字的,它們已經(jīng)提供了現(xiàn)成的點(diǎn)陣字庫文件。例如常用的16×16點(diǎn)陣HZK16文件,12×12點(diǎn)陣HZK12文件等等,這些文件包括了GB 2312字符集中的所有漢字,F(xiàn)在只要弄清漢字點(diǎn)陣在字庫文件中的格式,就可以按照自己的意愿去顯示漢字了。
  下面以HZK16文件為例,分析取得漢字字模的方法。
  HZK16文件是按照GB 2312-80標(biāo)準(zhǔn),也就是通常所說的國標(biāo)碼或區(qū)位碼的標(biāo)準(zhǔn)排列的。國標(biāo)碼分為 94 個(gè)區(qū)(Section),每個(gè)區(qū) 94 個(gè)位(Position),所以也稱為區(qū)位碼。其中01~09 區(qū)為符號(hào)、數(shù)字區(qū),16~87 區(qū)為漢字區(qū)。而 10~15 區(qū)、88~94 區(qū)是空白區(qū)域。
  如何取得漢字的區(qū)位碼呢?在計(jì)算機(jī)處理漢字和ASCII字符時(shí),使每個(gè)ASCII字符占用1個(gè)字節(jié),而一個(gè)漢字占用兩個(gè)字節(jié),其值稱為漢字的內(nèi)碼。其中第一個(gè)字節(jié)的值為區(qū)號(hào)加上32(20H),第二個(gè)字節(jié)的值為位號(hào)加上32(20H)。為了與ASCII字符區(qū)別開,表示漢字的兩個(gè)字節(jié)的最高位都是1,也就是兩個(gè)字節(jié)的值都又加上了128(80H)。這樣,通過漢字的內(nèi)碼,就可以計(jì)算出漢字的區(qū)位碼。
  具體算式如下:
  qh=c1-32-128=c1-160 wh=c2-32-128=c2-160
  或   
  qh=c1-0xa0 wh=c2-0xa0
  qh,wh為漢字的區(qū)號(hào)和位號(hào),c1,c2為漢字的第一字節(jié)和第二字節(jié)。
  根據(jù)區(qū)號(hào)和位號(hào)可以得到漢字字模在文件中的位置:
  location=(94*(qh-1)+(wh-1))*一個(gè)點(diǎn)陣字模的字節(jié)數(shù)。
  那么一個(gè)點(diǎn)陣字模究竟占用多少字節(jié)數(shù)呢?我們來分析一下漢字字模的具體排列方式。
  例如下圖中顯示的“漢”字,使用16×16點(diǎn)陣。字模中每一點(diǎn)使用一個(gè)二進(jìn)制位(Bit)表示,如果是1,則說明此處有點(diǎn),若是0,則說明沒有。這樣,一個(gè)16×16點(diǎn)陣的漢字總共需要16*16/8=32個(gè)字節(jié)表示。字模的表示順序?yàn)椋合葟淖蟮接,再從上到下,也就是先畫左上方?個(gè)點(diǎn),再是右上方的8個(gè)點(diǎn),然后是第二行左邊8個(gè)點(diǎn),右邊8個(gè)點(diǎn),依此類推,畫滿16×16個(gè)點(diǎn)。

   對于其它點(diǎn)陣字庫文件,則也是使用類似的方法進(jìn)行顯示。例如HZK12,但是HZK12文件的格式有些特別,如果你將它的字模當(dāng)作12*12位計(jì)算的話,根本無法正常顯示漢字。因?yàn)樽謳煸O(shè)計(jì)者為了使用的方便,字模每行的位數(shù)均補(bǔ)齊為8的整數(shù)倍,于是實(shí)際該字庫的位長度是16*12,每個(gè)字模大小為24字節(jié),雖然每行都多出了4位,但這4位都是0(不顯示),并不影響顯示效果。 還有UCDOS下的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體)這些打印字庫文件,每個(gè)字模占用24*24/8=72字節(jié),不過這類大字模漢字庫為了打印的方便,將字模都放倒了,所以在顯示時(shí)要注意把橫縱方向顛倒過來就可以了。
  這樣我們就完全清楚了如何得到漢字的點(diǎn)陣字模,這樣就可以在程序中隨意的顯示漢字了。
  如果在程序中使用的漢字?jǐn)?shù)目不多,也可以不必總是在程序里帶上幾百K的字庫文件,也許你的程序才只有幾十K。這樣可以事先將所需要顯示的漢字字模提取出來,放在另一個(gè)文件里,按照自己的順序讀取文件就可以了。
  下面的程序說明了具體顯示漢字的方法,以16×16漢字為例,使用HZK16文件。

#i nclude
#i nclude

/* x,y為顯示坐標(biāo),s為顯示字符串,colour為顏色 */
void hanzi16(int x,int y,char *s,int colour)
{
FILE *fp;
char buffer[32]; /* 32字節(jié)的字模緩沖區(qū) */
register I,j,k;
unsigned char qh,wh;
unsigned long location;
if((fp=fopen("hzk16","rb"))==NULL)
{
printf("Cant open hzk16!");
getch();
exit(0);
}
while(*s)
{
qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*32L; /* 計(jì)算漢字字模在文件中的位置 */
fseek(fp,location,SEEK_SET);
fread(buffer,32,1,fp);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j+k,y+I,colour);
s+=2;
x+=16; /* 漢字間距 */
}
fclose(fp);
}

main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");

hanzi16(246,200,"瘋狂甲蟲樂園!",BROWN);

getch();
closegraph();
}

  • 上一篇: 單片機(jī)高精度溫度控制實(shí)例
  • 下一篇: 沒有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1