[STM32F1]

T6963C显示乱码的问题

[复制链接]
1124|13
手机看帖
扫描二维码
随时随地手机跟帖
Cjy_JDxy|  楼主 | 2020-5-28 14:03 | 显示全部楼层 |阅读模式
4.jpg
我用STM32F103驱动T6963C的屏,显示数字和汉字,可是有乱码出现,很讨厌。
程序:
//--------------------------------------------
//         指定位置向LCD写入指定字符
//
//
//--------------------------------------------
void write_lcd(uchar x,uchar y,char *cha)
{
uint place,i=0;
uchar length,c1,c2,j,k;
for(length=0;cha[length]!=0;length++);
   do
    {
      c1=cha;      //取字符串的ASCII码
      c2=cha[i+1];
      place=x*30+y;
      if(c1<=128)        //#####小于128为字符,大于128为汉字
       {
        for(k=0;k<16;++k)     //字符设置为16*8
        {
          lcddatw(place&0xff);   //写入地址低位
          lcddatw(place/256);    //写入地址高位
          lcdcmd0(0x24);          //地址设置
          lcdcmd0(0xb0);          //设置数据自动写
          lcddatw(ASC_MSK[(c1-0x20)*16+k]); /*---例如:0的ASCII码为0x30,
          在ASC_MSK中的位置为0x10*16 ---16字节字码依次写入LCD---*/
          lcdcmd0(0xb2);          //自动复位
          place=place+30;
        }
        if(y>28)            //y>28时候需要换行
          {x=x+16;y=0;}
        else                //否则,不换行,继续写下一个字符
          {y++;}
           i++;
      }
     else                   //#####c1大于128为汉字
      {
        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;            //汉字找到则跳出   
         }
        if(j<sizeof(GB_16)/sizeof(GB_16[0]))   //------如果汉字在子码表内
         {
          for(k=0;k<16;k++)     //字符设置为16*8
           {
            lcddatw(place&0xff);   //写入地址低位
            lcddatw(place/256);    //写入地址高位
            lcdcmd0(0x24);          //地址设置
            lcdcmd0(0xb0);          //地址设置
            lcddatw(GB_16[j].Msk[k*2]);
                      lcddatw(GB_16[j].Msk[k*2+1]); //16*16,每行2字节
            lcdcmd0(0xb2);             //自动复位
            place=place+30;              //下一行
           }
         }
        else             //-----没找到对应汉字则涂黑
         {
          for(k=0;k<16;k++)     //字符设置为16*8
           {
            lcddatw(place&0xff);   //写入地址低位
            lcddatw(place/256);    //写入地址高位
            lcdcmd0(0x24);          //地址设置
            lcdcmd0(0xb0);          //地址设置
            lcddatw(0xff);
                     lcddatw(0xff);
            lcdcmd0(0xb2);             //自动复位
            place=place+30;              //下一行
           }
         }
        if(y>27)      //-------换行
         {x+=16;y=0;}
        else          //--------不用换行,则下一个字
         {y+=2;}
         i+=2;
      }
    }
   while(i<length);
}

write_lcd(5,5,"123");
        write_lcd(5,15,"中文测试");

请高手给看看,哪里有问题?谢谢!

使用特权

评论回复
kingkits| | 2020-5-28 14:38 | 显示全部楼层
明显是字库数据没有读对,你可以自己手工弄几个汉字的数据,显示出来看看。

使用特权

评论回复
Cjy_JDxy|  楼主 | 2020-5-28 14:44 | 显示全部楼层
lcdcmd2(0x00,0x02,0x40); //设置文本显示区首地址
lcdcmd2(0x00,0x00,0x40); //设置文本显示区首地址
我把代码由下面的改为上面的,显示就变成这样了。
其中我把汉字注释掉了。
5.jpg

使用特权

评论回复
Cjy_JDxy|  楼主 | 2020-5-28 14:54 | 显示全部楼层
lcddatw((uchar)(place&0xff));   //?
仿真了一下,执行上面那句,显示的右上方的乱码

使用特权

评论回复
Cjy_JDxy|  楼主 | 2020-5-28 15:07 | 显示全部楼层
kingkits 发表于 2020-5-28 14:38
明显是字库数据没有读对,你可以自己手工弄几个汉字的数据,显示出来看看。 ...

谢谢!自己造字模也有乱码

使用特权

评论回复
xutong1| | 2020-5-28 16:13 | 显示全部楼层
这个T6963C好久的了, 我用PC的并口驱动过,没有出现乱码。
PC并口来驱动液晶屏。外部面包板。 用的是TUBRO C写程序。

后来用51驱动,也没有出现乱码。

使用特权

评论回复
Cjy_JDxy|  楼主 | 2020-5-28 16:23 | 显示全部楼层
xutong1 发表于 2020-5-28 16:13
这个T6963C好久的了, 我用PC的并口驱动过,没有出现乱码。
PC并口来驱动液晶屏。外部面包板。 用的是TUBRO ...

你厉害

使用特权

评论回复
kingkits| | 2020-5-28 17:11 | 显示全部楼层
你的字符没乱码,而汉字有乱码,明显是字模的位置算法有问题,如果是全字库,应该有简单的算法,而不是查询的方式

使用特权

评论回复
xafb| | 2020-5-28 18:30 | 显示全部楼层
注意时序,ARM速度很快,液晶反应不过来

使用特权

评论回复
Cjy_JDxy|  楼主 | 2020-5-28 18:44 | 显示全部楼层
谢谢各位,好了,断了一下电就好了。

使用特权

评论回复
renzheshengui| | 2020-6-8 15:00 | 显示全部楼层
需要烧写字库吧

使用特权

评论回复
wakayi| | 2020-6-8 15:00 | 显示全部楼层
字模的问题需要自己计算吗

使用特权

评论回复
Cjy_JDxy|  楼主 | 2020-6-8 15:02 | 显示全部楼层

不需要,要弄字模

使用特权

评论回复
Cjy_JDxy|  楼主 | 2020-6-8 15:03 | 显示全部楼层
wakayi 发表于 2020-6-8 15:00
字模的问题需要自己计算吗

有取模软件,显示位置要计算。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3520

帖子

19

粉丝