字库编码C语言显示到单片机lcd,NETC程序:GB2312汉字编码和C程序LCD显示实现

该代码段展示了如何在LCD屏幕上以指定坐标写入汉字。通过GB2312编码处理汉字,将字模数据转换为像素点,并使用PutPixel函数在屏幕上绘制。程序考虑了颜色和区域颜色的选择,以及在动态变化下的信息叠加处理。
摘要由CSDN通过智能技术生成

四.C程序实现.

/******************************************************************************** 函数名称: Lcd_PutHZ.* 功能描述: 在LCD屏幕上指定坐标点写汉字 NETC-陈建长.* 输入参数: (unsigned int x,unsigned int y坐标),(unsigned char *pStr 单个汉字 如 “啊”),             (unsigned int c,unsigned int bk_c颜色和区域颜色),unsigned int st  区域颜色选择     st = 1 有 st = 0 无,在动态变化的情况下,如果没有区域颜色则前后信息叠加.    * 输出参数: None        * 返回参数: None*******************************************************************************/void Lcd_PutHZ(unsigned int x,unsigned int y,unsigned char *pStr,unsigned int c,unsigned int bk_c,unsigned int st){    unsigned short int i,j;       unsigned char *pZKL,*pZKR,mask,buf;    /* 缓存指针 数据 */ /*   * 在GB2312编码中对所收汉字进行了“分区”处理,94个区,每区含有94个汉字/符号 * 汉字由两个ASCII码组成,第一个减去160就是区码,第二个减去160就是位码 * 在C中处理时,如"啊"的代码是B0A0 +1,定义*pStr = "啊",则*pStr = 176(B0),*(pStr+1) = 161(A0+1) * 第一个ASC 176 - 160(0xA0) = 16 ,第二个 ASC 161 - 160(0xA0) = 1,所以区位码为:1601 * 按GB2312表顺序,从第一行开始向右每取8个点作为一个字节,如果最后不足8个点就补满8位。 * 8位逐行取模,第一点为高位.16X16汉字一行就有两个字节 X 32行  * 因字模数字式从0开始,所以 起始位为 ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32                    */  /* 左侧字模起始地址 */    pZKL = &__CHS[ ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32];   /* 右侧字模起始地址 */    pZKR = &__CHS[ ( ( ( (*pStr - 0xA0) - 1 ) * 94 + ( *(pStr+1) - 0xA0 ) - 1 ) * 32 ) + 1];       for( i = 0 ; i < 16 ; i++ )       {              /* 处理左侧显示 */              mask = 0x80;              buf = *pZKL;     *(pZKL += 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 = *pZKR;     *(pZKR += 2);              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;              }                        }}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值