打印
[51单片机]

老生常谈一个令我不解的12864液晶显示汉字问题!!!

[复制链接]
1426|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ruanlianbo|  楼主 | 2014-5-3 09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

以前都说KEIL环境下对一些汉字的显示有BUG,需要打补丁。补丁早已打过我遇到的不是这个问题,为了好说明问题我还是上传液晶部分的代码,结合代码讲述吧。
void KeyProcess(byte value)
{
        lcd_init();//初始化LCD
        P0=0xff;//先将液晶数据口拉高
        if(value==0)//不论长按键或短按键按下都执行
        {         
                 int i=0;
                 byte code table[] = {"正在采集数据"};
                 lcd_pos(1,0);//显示在第二行第一个字符开始
                 for(i;i<12;i++)
                 //while(table[i]!='\0')这里注释掉用上面的for循环确保循环次数
                 {
                         printf("i=%d",i);//串口查看循环次数
                         write_dat(table[i]);//写要显示的数据
                         //i++;
                 }
        }
         else if(value==1)
        {
                 int i=0;
                 byte code  table3[] = {"温度为:"};
                 byte code  table4[] = {"湿度为:"};
                 lcd_pos(2,0);//设置显示在第三行
                 while(table3[i]!='\0')
                 {         
                         write_dat(table3[i]);
                         i++;
                 }
                 i=0;
                 lcd_pos(3,0);
                 while(table4[i]!='\0')
                 {         
                         write_dat(table4[i]);
                         i++;
                 }
        }
         else if(value==2)
        {
                 int i=0;
                 byte code  table1[] = {"    系统关闭  "};//前后有两个空格,主要是为了使汉字显示在液晶中间,美观
                 byte code  table2[] = {"  欢迎再次使用 "};//前后一个空格
                 lcd_pos(1,0);//设置显示在第二行
                 while(table1[i]!='\0')
                 {         
                         write_dat(table1[i]);
                         i++;
                 }
                 i=0;
                 lcd_pos(2,0);//设置显示在第三行
                 while(table2[i]!='\0')
                 {         
                         write_dat(table2[i]);
                         i++;
                 }
        }
        else        //都没有按键按下
                mmi();//保持在界面初始化,这个函数在液晶上第一行显示“欢迎使用”第二行显示“环境监测系统”第三行显示“很高兴能为您服务”
}
这个服务程序是通过按下按键来切换相应的界面,液晶初始化是没有问题的,界面初始化也没问题,在条件value==2下的液晶显示汉字部分也没有问题,问题就出现在条件在value==0和条件value==1要显示的部分,只要我写入要显示的汉字超过三个就显示就会出错(出现乱码或者数据丢失),我用printf函数在串口上追踪查看,发现循环数据的次数是够的,可在液晶上显示的就是乱码或其他不是我写入的数据。我实在不解啊!!找了好久的原因都没找出来。这时也许有人会说可能你value==0和条件value==1成立的条件有问题,好,我把value==2条件下的汉字显示放到value==0和条件value==1中,按下对应的按键显示是正常的,我想更不是硬件问题,要是硬件问题就不可能界面初始化成功了。万能的论坛,各位大牛求解啊!!!

相关帖子

沙发
ningling_21| | 2014-5-3 09:46 | 只看该作者
不用每次都初始化LCD吧...
另有些LCD,带字库的模块,显示有些汉字时会有乱码出现的...

使用特权

评论回复
板凳
ruanlianbo|  楼主 | 2014-5-3 11:44 | 只看该作者
ningling_21 发表于 2014-5-3 09:46
不用每次都初始化LCD吧...
另有些LCD,带字库的模块,显示有些汉字时会有乱码出现的... ...

没有每次都初始化LCD啊,有按键按下才进入这个函数的

使用特权

评论回复
地板
sfesdm| | 2014-5-3 11:46 | 只看该作者
汉字显示需要两个字符,如果是字符和汉字结合显示,则汉字需要对齐偶数地址才能正常显示。比如你显示abc汉字,则会有乱码,比如你显示abcd汉字,则没问题,空格也算一个字符,所以,你要打空格,只能连续空两个。

使用特权

评论回复
5
ruanlianbo|  楼主 | 2014-5-3 15:55 | 只看该作者
sfesdm 发表于 2014-5-3 11:46
汉字显示需要两个字符,如果是字符和汉字结合显示,则汉字需要对齐偶数地址才能正常显示。比如你显示abc汉 ...

嗯,这个我知道,问题是我上面的“正在采集数据”没有空格,用串口查看循环次数也够,显示就是出现乱码!求解析

使用特权

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

本版积分规则

6

主题

28

帖子

0

粉丝