S3C2440 LCD字符显示
- /**************************************************************
- *在LCD屏幕上指定坐标点写ASCII码(8X16)
- *取模方式为阴码逐行式顺向十六进制数C51格式(使用软件为(PCtoLCD2002))
- *参数x,y为字符左上点坐标
- *c为字体颜色bk_c为字体背景色
- *st为1时不使用背景色为0时使用背景色
- *pZK为字符的数组
- **************************************************************/
- 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屏幕上指定坐标点写汉字(16X16)
- *取模方式为阴码逐行式顺向十六进制数C51格式(使用软件为(PCtoLCD2002))
- *参数x,y为汉字左上点坐标
- *c为字体颜色bk_c为字体背景色
- *st为1时不使用背景色为0时使用背景色
- *pZK为汉字的数组
- **************************************************************/
- 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;
- }
- }
- }
如果要在程序中显示大量的中文字符,是不是要把这些字符都取模啊?回答是肯定的,但前人已经为我们完成了这一步,做成了数据库,并且进行了编码,只要按照编码规则调用该库文件,就可以检索到相要的字符。下面就来说说编码规则:每个汉字是由两个字节表示的,前一个字节表示的区号,后一个字节表示的位号,那么汉字在汉字库中的位置为:94×(区号-1)+(位号-1)。94表示的是每个区里一共有94个汉字,减1表示的是数组是从0开始,而区号和位号是从1开始的。具体到汉字在某一数据库中的位置,还需要乘以一个汉字字模所占的字节数,即[94×(区号-1)+(位号-1)]×一个汉字字模所占字节数。如一个字模大小为16×16的宋体数据库,库里每个汉字所占的字节为16×16÷8=32,则每个汉字在该宋体数据库中的位置为:[94×(区号-1)+(位号-1)]×32。ASCII码的字符调用比汉字字符要简单,只要把它乘以字模所占字节数即可找到该字符所在字库的位置,如8×16的ASCII字库,ASCII码在该字库的位置为ASCII×16。如果中文字符和ASCII码混合在一样,如何区分它们呢?其实也很简单,ASCII码的最高位是0,而中文的最高位是1,因此当读取到的一个字节的最高位是0,则该字节为ASCII码,它的下一个字节与这个字节无关;当取得到的字节的最高位是1,则表示的是中文字符,并且该字节与它的下一个字节组合在一起表示完整的一个汉字。每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。
贴出使用字库显示汉字和字符的代码
[cpp]view plaincopy
- /**************************************************************
- 在LCD屏幕上指定坐标点写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屏幕上指定坐标点写汉字
- **************************************************************/
- 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个汉字或字符
- 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;
- }
- }
评论