S3C2440 LCD字符顯示
- /**************************************************************
- *在LCD屏幕上指定坐標(biāo)點(diǎn)寫ASCII碼(8X16)
- *取模方式為陰碼逐行式順向十六進(jìn)制數(shù)C51格式(使用軟件為(PCtoLCD2002))
- *參數(shù)x,y為字符左上點(diǎn)坐標(biāo)
- *c為字體顏色bk_c為字體背景色
- *st為1時(shí)不使用背景色為0時(shí)使用背景色
- *pZK為字符的數(shù)組
- **************************************************************/
- voidLcd_PutASCII(unsignedintx,unsignedinty,unsignedintc,unsignedintbk_c,unsignedintst,unsignedchar*pZK)
- {
- unsignedshortinti,j;
- unsignedcharmask,buf;
- for(i=0;i<16;i++)
- {
- mask=0x80;
- buf=pZK[i];
- for(j=0;j<8;j++)
- {
- if(buf&mask)
- {
- PutPixel(x+j,y+i,c);
- }
- else
- {
- if(!st)
- {
- PutPixel(x+j,y+i,bk_c);
- }
- }
- mask=mask>>1;
- }
- }
- }
- /**************************************************************
- *在LCD屏幕上指定坐標(biāo)點(diǎn)寫漢字(16X16)
- *取模方式為陰碼逐行式順向十六進(jìn)制數(shù)C51格式(使用軟件為(PCtoLCD2002))
- *參數(shù)x,y為漢字左上點(diǎn)坐標(biāo)
- *c為字體顏色bk_c為字體背景色
- *st為1時(shí)不使用背景色為0時(shí)使用背景色
- *pZK為漢字的數(shù)組
- **************************************************************/
- voidLcd_PutHZ(unsignedintx,unsignedinty,unsignedintc,unsignedintbk_c,unsignedintst,unsignedchar*pZK)
- {
- unsignedshortinti,j;
- unsignedcharmask,buf;
- for(i=0;i<16;i++)
- {
- //左
- mask=0x80;
- buf=pZK[i*2];
- for(j=0;j<8;j++)
- {
- if(buf&mask)
- {
- PutPixel(x+j,y+i,c);
- }
- else
- {
- if(!st)
- {
- PutPixel(x+j,y+i,bk_c);
- }
- }
- mask=mask>>1;
- }
- //右
- mask=0x80;
- buf=pZK[i*2+1];
- for(j=0;j<8;j++)
- {
- if(buf&mask)
- {
- PutPixel(x+j+8,y+i,c);
- }
- else
- {
- if(!st)
- {
- PutPixel(x+j+8,y+i,bk_c);
- }
- }
- mask=mask>>1;
- }
- }
- }
如果要在程序中顯示大量的中文字符,是不是要把這些字符都取模啊?回答是肯定的,但前人已經(jīng)為我們完成了這一步,做成了數(shù)據(jù)庫(kù),并且進(jìn)行了編碼,只要按照編碼規(guī)則調(diào)用該庫(kù)文件,就可以檢索到相要的字符。下面就來說說編碼規(guī)則:每個(gè)漢字是由兩個(gè)字節(jié)表示的,前一個(gè)字節(jié)表示的區(qū)號(hào),后一個(gè)字節(jié)表示的位號(hào),那么漢字在漢字庫(kù)中的位置為:94×(區(qū)號(hào)-1)+(位號(hào)-1)。94表示的是每個(gè)區(qū)里一共有94個(gè)漢字,減1表示的是數(shù)組是從0開始,而區(qū)號(hào)和位號(hào)是從1開始的。具體到漢字在某一數(shù)據(jù)庫(kù)中的位置,還需要乘以一個(gè)漢字字模所占的字節(jié)數(shù),即[94×(區(qū)號(hào)-1)+(位號(hào)-1)]×一個(gè)漢字字模所占字節(jié)數(shù)。如一個(gè)字模大小為16×16的宋體數(shù)據(jù)庫(kù),庫(kù)里每個(gè)漢字所占的字節(jié)為16×16÷8=32,則每個(gè)漢字在該宋體數(shù)據(jù)庫(kù)中的位置為:[94×(區(qū)號(hào)-1)+(位號(hào)-1)]×32。ASCII碼的字符調(diào)用比漢字字符要簡(jiǎn)單,只要把它乘以字模所占字節(jié)數(shù)即可找到該字符所在字庫(kù)的位置,如8×16的ASCII字庫(kù),ASCII碼在該字庫(kù)的位置為ASCII×16。如果中文字符和ASCII碼混合在一樣,如何區(qū)分它們呢?其實(shí)也很簡(jiǎn)單,ASCII碼的最高位是0,而中文的最高位是1,因此當(dāng)讀取到的一個(gè)字節(jié)的最高位是0,則該字節(jié)為ASCII碼,它的下一個(gè)字節(jié)與這個(gè)字節(jié)無(wú)關(guān);當(dāng)取得到的字節(jié)的最高位是1,則表示的是中文字符,并且該字節(jié)與它的下一個(gè)字節(jié)組合在一起表示完整的一個(gè)漢字。每個(gè)漢字及符號(hào)以兩個(gè)字節(jié)來表示。第一個(gè)字節(jié)稱為“高位字節(jié)”(也稱“區(qū)字節(jié))”,第二個(gè)字節(jié)稱為“低位字節(jié)”(也稱“位字節(jié)”)。
貼出使用字庫(kù)顯示漢字和字符的代碼
- /**************************************************************
- 在LCD屏幕上指定坐標(biāo)點(diǎn)寫ASCII碼
- **************************************************************/
- voidLcd_PutASCII(unsignedintx,unsignedinty,unsignedcharch,unsignedintc,unsignedintbk_c,unsignedintst)
- {
- unsignedshortinti,j;
- unsignedchar*pZK,mask,buf;
- pZK=&__VGA[ch*16];
- for(i=0;i<16;i++)
- {
- mask=0x80;
- buf=pZK[i];
- for(j=0;j<8;j++)
- {
- if(buf&mask)
- {
- PutPixel(x+j,y+i,c);
- }
- else
- {
- if(!st)
- {
- PutPixel(x+j,y+i,bk_c);
- }
- }
- mask=mask>>1;
- }
- }
- }
- /**************************************************************
- 在LCD屏幕上指定坐標(biāo)點(diǎn)寫漢字
- **************************************************************/
- voidLcd_PutHZ(unsignedintx,unsignedinty,unsignedshortintQW,unsignedintc,unsignedintbk_c,unsignedintst)
- {
- unsignedshortinti,j;
- unsignedchar*pZK,mask,buf;
- pZK=&__CHS[(((QW>>8)-1)*94+(QW&0x00FF)-1)*32];
- for(i=0;i<16;i++)
- {
- //左
- mask=0x80;
- buf=pZK[i*2];
- for(j=0;j<8;j++)
- {
- if(buf&mask)
- {
- PutPixel(x+j,y+i,c);
- }
- else
- {
- if(!st)
- {
- PutPixel(x+j,y+i,bk_c);
- }
- }
- mask=mask>>1;
- }
- //右
- mask=0x80;
- buf=pZK[i*2+1];
- for(j=0;j<8;j++)
- {
- if(buf&mask)
- {
- PutPixel(x+j+8,y+i,c);
- }
- else
- {
- if(!st)
- {
- PutPixel(x+j+8,y+i,bk_c);
- }
- }
- mask=mask>>1;
- }
- }
- }
- //----------------------
- voidLcd_printf(unsignedintx,unsignedinty,unsignedintc,unsignedintbk_c,unsignedintst,char*fmt,...)
- {
- char__LCD_Printf_Buf[256];//可以顯示128個(gè)漢字或字符
- va_listap;
- unsignedchar*pStr=(unsignedchar*)__LCD_Printf_Buf;
- unsignedinti=0;
- va_start(ap,fmt);
- vsprintf(__LCD_Printf_Buf,fmt,ap);
- va_end(ap);
- while(*pStr!=0)
- {
- switch(*pStr)
- {
- casen:
- {
- break;
- }
- default:
- {
- if(*pStr>0xA0&*(pStr+1)>0xA0)//中文輸出
- {
- Lcd_PutHZ(x,y,(*pStr-0xA0)*0x0100+*(pStr+1)-0xA0,c,bk_c,st);
- pStr++;
- i++;
- x+=16;
- }
- else//英文輸出
- {
- Lcd_PutASCII(x,y,*pStr,c,bk_c,st);
- x+=8;
- }
- break;
- }
- }
- pStr++;
- i++;
- if(i>256)break;
- }
- }
評(píng)論