四.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; } }}