S3C2440 LCD字符显示

     其实每一字符就是一幅图像,字符的大小对应于图像的大小,字符的笔画对应于图像的内容。那么如何把字符转换为图像呢?简单的方法是使用“字模提取”之类的软件,它能够把任意的字符转换为一个字节型的数组,数组元素中的每一位代表LCD上的一个像素点,当为1时,表示该位置为字符的一个笔画,需要上色,而为0时,表示不是笔画,学过12864无字库液晶的相信肯定会使用LCD字符显示。比较简单,贴两个函数仅供参考。

/**************************************************************
*	在LCD屏幕上指定坐标点写ASCII码(8X16)
*	取模方式为 阴码 逐行式 顺向 十六进制数 C51格式 (使用软件为(PCtoLCD2002))
*	参数x,y为字符左上点坐标  
*	c 为字体颜色 bk_c为字体背景色 
*	st  为1时不使用背景色 为0时使用背景色
*	pZK 为字符的数组
**************************************************************/
void Lcd_PutASCII(unsigned int x,unsigned int y,unsigned int c,unsigned int bk_c,unsigned int st,unsigned char *pZK)
{
       unsigned short int i,j;
       unsigned char mask,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 为汉字的数组
**************************************************************/
void Lcd_PutHZ(unsigned int x,unsigned int y,unsigned int c,unsigned int bk_c,unsigned int st, unsigned char *pZK )
{
       unsigned short int i,j;
       unsigned char mask,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÷832,则每个汉字在该宋体数据库中的位置为:[94×(区号-1)+(位号-1]×32ASCII码的字符调用比汉字字符要简单,只要把它乘以字模所占字节数即可找到该字符所在字库的位置,如8×16ASCII字库,ASCII码在该字库的位置为ASCII×16。如果中文字符和ASCII码混合在一样,如何区分它们呢?其实也很简单,ASCII码的最高位是0,而中文的最高位是1,因此当读取到的一个字节的最高位是0,则该字节为ASCII码,它的下一个字节与这个字节无关;当取得到的字节的最高位是1,则表示的是中文字符,并且该字节与它的下一个字节组合在一起表示完整的一个汉字。 每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。

贴出使用字库显示汉字和字符的代码

 

/**************************************************************
在LCD屏幕上指定坐标点写ASCII码
**************************************************************/
void Lcd_PutASCII(unsigned int x,unsigned int y,unsigned char ch,unsigned int c,unsigned int bk_c,unsigned int st)
{
       unsigned short int i,j;
       unsigned char *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屏幕上指定坐标点写汉字
**************************************************************/
void Lcd_PutHZ(unsigned int x,unsigned int y,unsigned short int QW,unsigned int c,unsigned int bk_c,unsigned int st)
{
       unsigned short int i,j;
       unsigned char *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;
              }                 
       }
}

//----------------------
void Lcd_printf(unsigned int x,unsigned int y,unsigned int c,unsigned int bk_c,unsigned int st,char *fmt,...)
{
       char __LCD_Printf_Buf[256];//可以显示128个汉字或字符
       va_list ap;
       unsigned char *pStr = (unsigned char *)__LCD_Printf_Buf;
       unsigned int i = 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;
       }
   
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值