免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1186 | 回复: 0

NETC程序:GB2312汉字编码和C程序LCD显示实现 [复制链接]

论坛徽章:
0
发表于 2011-12-22 08:51 |显示全部楼层
    GB2312或GB 2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。
    NETC发布最近编写的GB2312字库编码和C语言程序在单片机,嵌入式LCD显示中实现!
    一.取模工具: 取模工具.rar   
    二.GB2312表: GB2312表.pdf   
    三.GB2312字库: GB2312.rar   
    按GB2312表顺序,从第一行开始向右每取8个点作为一个字节,如果最后不足8个点就补满8位。8位逐行取模,第一点为高位.
    四.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;
              }                
       }
}
 
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP