我的控制器是T6963,我现在文本模式下显示汉字。下面是我的一段代码:
- /*****************************************************************************
- 函数功能:将str所指的一个字的字模(32byte)写入CGRAM
- 参数: str指向该字模数组的首地址
- /*****************************************************************************/
- void Write2CG( unsigned char *str )
- {
- unsigned char i;
- unsigned char charc;
- unsigned char DatL, DatH;
- unsigned char Coder = 0x80; //CGRAM中的内码
- unsigned char Offset= 0x0f;
- unsigned char temp1, temp2;
- WriteCmd3( 0x1f,0x00,0x22); //设置CGRAM在显示缓存中的地址是 0xf800 ~ 0xffff;
- temp1 = Coder>>4;
- temp2 = Offset<<4;
- DatH = (Offset<<4)|(Coder>>4); //CGRAM中的地址是0xF8oo ~ 0xffff;
- DatL = Coder<<3;
- WriteCmd3(DatL,DatH, 0x24); //设置地址指针
- for( i="0"; i<32; i++ ) //往CGRAM中写入字模。自动获取内码80h,81h,82h,83h
- {
- charc = *(str+i);
- WriteData( *(str+i) );
- DatL++;
- WriteCmd3(DatL,DatH, 0x24);
- }
- }
- 我的显示这个汉字的函数是:
- //显示西文字符
- void ShowText( unsigned char column, unsigned char lin, unsigned char hzcode )
- {
- unsigned int StartAddr;
- StartAddr = lin*LineChar + column; // LineChar = 32;
- WriteCmd3( (unsigned char)(StartAddr&0xff),(unsigned char)(StartAddr>>8),0x24);
- WriteCmd2( hzcode,DataWAddrNV ); //写入代码为hzcode的字符,地址指针不变
- }
- //我的取字模的顺序是abcd
- // column:列, lin:行,hzcode:汉字不是拆成了四块么,hzcode是其代码,譬如0x80
- void ShowHZ( unsigned char column, unsigned char lin, unsigned char hzcode )
- {
- // lin=lin*8;
- ShowText(column,lin,hzcode);
- ShowText(column+1,lin,hzcode+1);
- ShowText(column,lin+1,hzcode+2);
- ShowText(column+1,lin,hzcode+3);
- }
但是我显示的字符是乱码,而且不论我把汉字的字模改成什么字,显示的乱码都是一样的。郁闷,难道是当初自造的字模压根儿就没有存进去么?
谢谢大家指点。
补充说明一下:我那个lin=lin*8;被注释掉的话,连位置显示都不对。加上lin=lin*8才能正确的定位在显示屏上的位置。
但是: 在文本模式下, 显示位置 (col ,lin)和显存的位置关系不是 “显存单元地址= lin*32+col”么?
还有,在图形模式下, 显示位置(col ,lin) 和显存的位置关系也是 “显存单元地址= lin*32+col”是吧?
其中,在文本模式下,(col ,lin) 是以字符位8x8为单位,在图形模式下,(col ,lin) 是以8x1为单位。我的理解对么?