其实每一字符便是一幅图画,字符的巨细对应于图画的巨细,字符的笔画对应于图画的内容。那么怎么把字符转换为图画呢?简略的办法是运用“字模提取”之类的软件,它能够把恣意的字符转换为一个字节型的数组,数组元素中的每一位代表LCD上的一个像素点,当为1时,表明该方位为字符的一个笔画,需求上色,而为0时,表明不是笔画,学过12864无字库液晶的信任必定会运用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,则表明的是中文字符,而且该字节与它的下一个字节组合在一起表明完好的一个汉字。每个汉字及符号以两个字节来表明。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。
贴出运用字库显现汉字和字符的代码
- /**************************************************************
- 在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)
- {
- case\n:
- {
- 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;
- }
- }