【求教】一个液晶CGRAM的读写问题

zxinqiao   2008-8-6 22:28 楼主
我的控制器是T6963,我现在文本模式下显示汉字。下面是我的一段代码:

  1. /*****************************************************************************
  2. 函数功能:将str所指的一个字的字模(32byte)写入CGRAM
  3. 参数:     str指向该字模数组的首地址

  4. /*****************************************************************************/
  5. void Write2CG( unsigned char *str )
  6. {                             

  7.      unsigned char i;
  8.      unsigned char charc;
  9.      unsigned char DatL, DatH;
  10.      unsigned char Coder = 0x80; //CGRAM中的内码
  11.      unsigned char Offset= 0x0f;
  12.      unsigned char temp1, temp2;
  13.      WriteCmd3( 0x1f,0x00,0x22); //设置CGRAM在显示缓存中的地址是 0xf800 ~ 0xffff;

  14.     temp1 = Coder>>4;
  15.     temp2 = Offset<<4;
  16.      DatH = (Offset<<4)|(Coder>>4); //CGRAM中的地址是0xF8oo ~ 0xffff;
  17.      DatL = Coder<<3;
  18.      WriteCmd3(DatL,DatH, 0x24);   //设置地址指针
  19.      for( i="0"; i<32; i++ )      //往CGRAM中写入字模。自动获取内码80h,81h,82h,83h
  20.      {
  21.           charc = *(str+i);        
  22.           WriteData( *(str+i) );
  23.           DatL++;
  24.           WriteCmd3(DatL,DatH, 0x24);

  25.      }
  26. }

  27. 我的显示这个汉字的函数是:

  28. //显示西文字符
  29. void ShowText( unsigned char column, unsigned char lin, unsigned char hzcode )
  30. {
  31.      unsigned int StartAddr;
  32.      StartAddr = lin*LineChar + column;  // LineChar = 32;   
  33.      WriteCmd3( (unsigned char)(StartAddr&0xff),(unsigned char)(StartAddr>>8),0x24);
  34.      WriteCmd2( hzcode,DataWAddrNV ); //写入代码为hzcode的字符,地址指针不变
  35. }

  36. //我的取字模的顺序是abcd

  37. // column:列, lin:行,hzcode:汉字不是拆成了四块么,hzcode是其代码,譬如0x80

  38. void ShowHZ( unsigned char column, unsigned char lin, unsigned char hzcode )
  39. {
  40.      // lin=lin*8;
  41.      ShowText(column,lin,hzcode);
  42.      ShowText(column+1,lin,hzcode+1);
  43.      ShowText(column,lin+1,hzcode+2);
  44.      ShowText(column+1,lin,hzcode+3);
  45. }


但是我显示的字符是乱码,而且不论我把汉字的字模改成什么字,显示的乱码都是一样的。郁闷,难道是当初自造的字模压根儿就没有存进去么?

谢谢大家指点。

补充说明一下:我那个lin=lin*8;被注释掉的话,连位置显示都不对。加上lin=lin*8才能正确的定位在显示屏上的位置。

但是: 在文本模式下, 显示位置 (col ,lin)和显存的位置关系不是 “显存单元地址= lin*32+col”么?

还有,在图形模式下,  显示位置(col ,lin) 和显存的位置关系也是 “显存单元地址= lin*32+col”是吧?

其中,在文本模式下,(col ,lin) 是以字符位8x8为单位,在图形模式下,(col ,lin) 是以8x1为单位。我的理解对么?

回复评论 (7)

首先试试一个任意的点是否能够正常显示,再在这个基础上弄其他程序
点赞  2008-8-6 22:33
RE:  sherlock_lai
我的显示西文字符的函数是正确的,那么,我的函数ShowHZ应该也是正确的。我觉得问题可能出在Write2CG这个函数上了。但是问题处在哪儿呢?设置好CGRAM的起始地址,然后把字模依次写入不就行了么?
点赞  2008-8-6 22:49
Re:sherlock_lai
先谢谢你提供思路。我调用了一下ShowHZ(20,4,0x11);//0x11是CGROM中“1”的代码,发现ShowHZ显示的“1 4”,
                                                                                                       3
还有一个数字2显示成了乱码。可见这个函数和我的预期也是有差距的。但是还不至于全是乱码。
这是不是说明Write2CG函数也有问题?
点赞  2008-8-6 23:02
我把ShowHZ改成了如下:

  1. void ShowHZ( unsigned char column, unsigned char lin, unsigned char hzcode )
  2. {
  3.      ShowText(column,lin,hzcode);
  4.      ShowText(column,lin+1,hzcode+1);
  5.      ShowText(column+1,lin,hzcode+2);
  6.      ShowText(column+1,lin+1,hzcode+3);
  7. }


把函数中的ShowText调换了一下调用顺序。现在我调用了一下ShowHZ(20,4,0x11);//0x11是CGROM中“1”的代码,发现ShowHZ显示的“1 3”,
                 2 4,
了。为什么一定要按照左上,左下,右上,右下的顺序显示呢?
点赞  2008-8-6 23:16
不知你后来成功了没有?我现在也遇到这样的问题,能否指教一下?
点赞  2009-2-10 14:05
考虑一下写入时候的时序还有是否写入的时候需要个延时函数?我只弄过1602液晶,发现在写入的时候延时函数的位置不对时出来的就是乱码,怎么弄都是乱码,后来把延时函数的位置调整一下就好了
点赞  2009-2-13 09:32
for( i="0"; i<32; i++ )      //往CGRAM中写入字模。自动获取内码80h,81h,82h,83h

你干吗要(i="0")?????????????????
"0"是字符串"0"的首地址
点赞  2009-2-16 09:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复