一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2111|回复: 8
收起左侧

求助:从51移植到AVR的LCD程序,写入汉字字符串的指针第一个字错乱

[复制链接]
发表于 2013-8-7 11:09 | 显示全部楼层 |阅读模式
求助:从51移植到AVR的LCD程序,写入汉字字符串的指针第一个字错乱

用STC12C5A60S2测试显示正常,移动到MEGA128后,出现如下问题:
1、LCD_PutString("没有你的");
    写入一个字符串,第一个字符是汉字,结果第一个字显示乱码,其它字符显示正常,
2、LCD_PutString("1没有你的");
    当第一个字符是半宽字符时,后面的汉字显示正常;
感觉很纳闷,俺是菜鸟,求高手指点一二,
贴上正常与不正常的图片,并贴上部分代码,

201308071442.jpg 201308071441.jpg


  x=0;
  y=5;
  LCD_0816_str("abcdefgHIJKLM");     //写字符串
  
  x=2;y=8;
  LCD_PutString("1没有你的");




/*====================指定位置写入字符串=========================//
*s:字符串
fColor:字体前景颜色
bColor:字体背景颜色
//===============================================================*/
void LCD_PutString(u8 *s)
{
u8 l=0;
u8 addr;
while(*s)
{
  if( *s < 0x80)
  {
   addr=*s++;
   addr-=0x20;
   addr-=16;
   LCD_0816(addr);   //写入半宽字母或数字或标点符号
   l++;
   
  }
  else
  {   
   LCD_1616((uchar*)s);  //写入全宽汉字或符号
   s+=2;
  // l+=2;
  }
}
}



/*====================指定位置写入16*16字符=========================//
x:横向起始坐标
y:竖向起始坐标
c[2]:汉字地址
fColor:字体前景颜色
bColor:字体背景颜色
//=============================================================*/
void LCD_1616(u8 c[2])
{
u16 i,j,k;

if(x>127)              //水平光标大于127,换行显示
{
   y+=2;
  x=0;
}

if(y>15)       //超出显示范围,直接返回
  return;
for (k=0;k<64;k++)         //64标示自建汉字库中的个数,循环查询内码
{         
    if ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1]))
  {
   for(j=0;j<2;j++)
   {         
       for(i=0;i<16;i++)
    {
       unsigned short m=codeGB_16[k].Msk[i+j*16];  
     lcd_pos();        //计算区域光标地址
     write_com(Page_Add+y1+j);     //写页地址
     write_com(LCDCol_Add+x1);      //写列起始地址   
       write_data(m);
     x++;
      }
    x-=16;
   }
  }  
}
x+=16;
}



/*****************************************************************************
函数功能:指定位置显示数字8*16程序
入口参数:    area=区域地址,
     y=页地址,
    x=列地址,
    hzk=字符地址
出口参数:
*****************************************************************************/
void LCD_0816(uchar hzk)
{
uchar  j,i;

if(x>120)              //水平光标大于127,换行显示
{
   y+=2;
  x=0;
}

if(y>15)       //超出显示范围,直接返回
  return;
hzk+=16;          //数字地址修正
for(j=0;j<2;j++)         //16行,共需写2页
{
     y+=j;
  lcd_pos();         //计算区域光标地址
  write_com(Page_Add+y1);      //写页地址
  write_com(LCDCol_Add+x1);       //写列起始地址
  
     for(i=0;i<8;i++)          //共8列     
  {   
   write_data(hzk_0816[hzk][i+j*8]);   //写数据  
   x++;
  }
  x-=8;
}
x+=8;
y--;
}

 楼主| 发表于 2013-8-7 11:31 | 显示全部楼层

晕,把工程重新复制一下,第一个字正常了,只是连续写8个字时,第4个和第8个又不正常,写8个以下就正常
发表于 2013-8-7 12:56 | 显示全部楼层
AVR相同晶振,实际速度平均是普通c51的8倍,大多液晶驱动都要加延时
发表于 2013-8-7 13:09 | 显示全部楼层
如果是keil编译的话,注意全角半角区别。写中文字最好另外在外面的文本编辑器内完成
 楼主| 发表于 2013-8-7 13:28 | 显示全部楼层
狗狗百里游 发表于 2013-8-7 12:56
AVR相同晶振,实际速度平均是普通c51的8倍,大多液晶驱动都要加延时

51用的是STC12C5A60S2,不会是延时的问题
发表于 2013-8-7 15:17 | 显示全部楼层
STC12C5A60S2 1t的速度也不错啊
发表于 2013-8-7 16:34 | 显示全部楼层
第一个字符加个空格 刚好 哈哈·~~~
 楼主| 发表于 2013-8-8 11:53 | 显示全部楼层
ayumi7 发表于 2013-8-7 16:34
第一个字符加个空格 刚好 哈哈·~~~

好主意,不过问题已经解决了,还是程序问题,
 楼主| 发表于 2013-8-8 11:58 | 显示全部楼层
狗狗百里游 发表于 2013-8-7 12:56
AVR相同晶振,实际速度平均是普通c51的8倍,大多液晶驱动都要加延时

谢谢,如果是全角和半角错误,编译应该通不过吧

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-26 09:32 , Processed in 0.188299 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表