[求助] T6963C显示乱码的问题

chenbingjy   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,"中文测试");

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

 

为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复评论 (2)

5.jpg lcdcmd2(0x00,0x02,0x40); //设置文本显示区首地址

 

lcdcmd2(0x00,0x00,0x40); //设置文本显示区首地址
我把代码由下面的改为上面的,显示就变成这样了。
其中我把汉字注释掉了。
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
点赞  2020-5-28 14:44

lcddatw((uchar)(place&0xff));   //?
仿真了一下,执行上面那句,显示的右上方的乱码,那几个点

为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
点赞  2020-5-28 14:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复