/********************************************************/ /* ASCII(8*16) 及 汉字(16*16) 显示函数 */ /********************************************************/ unsigned char dprintf16(unsigned char x,unsigned char y, char *ptr,unsigned char normal) { unsigned char i,j,uLen,uRow,uCol; unsigned char c1; #ifdef HZ16 unsigned char c2; unsigned int k; #endif
uLen=0; i=0; uRow = y; uCol = x; // SetAddr(uRow,uCol); //起点定位 while (ptr[uLen]!=0) //探测字串长度 { uLen++; } while(i<uLen) { c1 = ptr; #ifdef HZ16 c2 = ptr[i+1]; //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码 if(c1 <=128) // ASCII { #endif for(j=0;j<16;j++) //写16行 { SetAddr(uRow+j,uCol); WriteComm(0xb0); // 写数据(命令) if (c1 >= 0x20) { if(normal) WriteAuto( ASC_MSK[(unsigned int)(c1-0x20)*16+j]); else WriteAuto( ASC_MSK[(unsigned int)(c1-0x20)*16+j]^0xff); } else { WriteAuto(0); } WriteComm(0xb2); //写数据结束 } if(c1 != 0x08) // 非退格 { uCol++; // 列数加1 } #ifdef HZ16 } #endif #ifdef HZ16 else // 中文 { for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) // 查找定位 { if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1]) { break; } } for(k=0;k<sizeof(GB_16[0].Msk)/2;k++) { SetAddr(uRow+k,uCol); WriteComm(0xb0); // 写数据 if(j < sizeof(GB_16)/sizeof(GB_16[0])) { if(normal) { WriteAuto(GB_16[j].Msk[k*2]); WriteAuto(GB_16[j].Msk[k*2+1]); } else { WriteAuto(GB_16[j].Msk[k*2]^0xff); WriteAuto(GB_16[j].Msk[k*2+1]^0xff); } //WriteAuto(0xff); //WriteAuto(0xff); } else // 未找到该字 { if(k < sizeof(GB_16[0].Msk)/4) { WriteAuto(0); WriteAuto(0); } else { WriteAuto(0); WriteAuto(0); } } WriteComm(0xb2); } uCol += 2; i++; }; #endif
if(uCol >= 30) // 光标后移 { uRow += 16; if(uRow < 0x80) { uCol -= 30; } else { uRow = 0; uCol = 0; } }
// SetAddr(uRow,uCol); i++; } return uLen; //返回字串长度,汉字按2字节计算 } #endif |