钻石会员
主题
帖子
积分13782
阅读权限50
注册时间2010-5-7
最后登录1970-1-1
在线时间 小时
|
求助:从51移植到AVR的LCD程序,写入汉字字符串的指针第一个字错乱
用STC12C5A60S2测试显示正常,移动到MEGA128后,出现如下问题:
1、LCD_PutString("没有你的");
写入一个字符串,第一个字符是汉字,结果第一个字显示乱码,其它字符显示正常,
2、LCD_PutString("1没有你的");
当第一个字符是半宽字符时,后面的汉字显示正常;
感觉很纳闷,俺是菜鸟,求高手指点一二,
贴上正常与不正常的图片,并贴上部分代码,
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--;
}
|
|