找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3255|回复: 11
打印 上一主题 下一主题
收起左侧

LCD1602为什么会这么显示?Proteus仿真仿真好好的,单片机实物就不行了

  [复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
仿真好好的到了单片机上出现了这个问题看图
这字母一直从左到右循环,按键的话下面还会出现数字5和7.
麻烦看一下哪里有问题!!!代码在下面:
#include <reg52.h>
#include <intrins.h>                        //包含_nop_( )空函数指令的头文件
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit RS=P3^4;                                         //位变量
sbit RW=P3^5;                                        //位变量
sbit E=P3^6;
sbit YES=P2^3;
sbit ST=P3^7;
sbit START=P3^0;
void lcd_initial(void);                                                //位变量
void lcd_initial(void);                                        //LCD初始化函数
void check_busy(void);                                 //检查忙标志函数
void write_command(uchar com);                         //写命令函数
void write_data(uchar dat);                        //写数据函数
void string(uchar ad ,uchar *s);
void delay(uint);                                //延时函数
unsigned char key_scan()
{
        unsigned char key_temp0,key_temp1;
        unsigned char key_num=0;
        P2=0x0f;
        key_temp0=P2;
        if(key_temp0!=0x0f)
        {
                delay(5);
                key_temp0=P2;
                if(key_temp0!=0x0f)
                {
                        P2=0xf0;
                        key_temp1=P2;
                        if(key_temp0==0x0e)
                        {
                                switch(key_temp1)
                                {
                                        case 0xe0: key_num=4;break;
                                        case 0xd0: key_num=3;break;
                                        case 0xb0: key_num=2;break;
                                        case 0x70: key_num=1;break;
                                        default:key_num=0;break;
                                }
                        }
                        else if(key_temp0==0x0d)
                        {
                                switch(key_temp1)
                                {
                                        case 0xe0: key_num=8;break;
                                        case 0xd0: key_num=7;break;
                                        case 0xb0: key_num=6;break;
                                        case 0x70: key_num=5;break;
                                        default:key_num=0;break;
                                }
                        }
                        else if(key_temp0==0x0b)
                        {
                                switch(key_temp1)
                                {
                                        case 0xe0: key_num=12;break;
                                        case 0xd0: key_num=11;break;
                                        case 0xb0: key_num=10;break;
                                        case 0x70: key_num=9;break;
                                        default:key_num=0;break;
                                }
                        }
                        else if(key_temp0==0x07)
                        {
                                switch(key_temp1)
                                {
                                        case 0xe0: key_num=16;break;
                                        case 0xd0: key_num=15;break;
                                        case 0xb0: key_num=14;break;
                                        case 0x70: key_num=13;break;
                                        default:key_num=0;break;
                                }
                        }
                }
        }
return key_num;
}


void main(void)                         //主函数
{
        unsigned char key_num;
        lcd_initial( );                        //调用对LCD初始化函数
   do
   {
                        key_num=key_scan();
                        string(0x82,"zhijing");                //显示的第1行字符串
                  switch(key_num)
                        {
                                case 1 :string(0xC8,"1");  break;
                                case 2 :string(0xC8,"2");  break;
                                case 3 :string(0xC8,"3");  break;
                                case 4 :string(0xC8,"4");  break;
                                case 5 :string(0xC8,"5");  break;
                                case 6 :string(0xC8,"6");  break;
                                case 7 :string(0xC8,"7");  break;
                                case 8 :string(0xC8,"8");  break;
                                case 9 :string(0xC8,"9");  break;
                                case 10:string(0xC8,"0"); break;
                                case 11:string(0xC8,"."); break;
                                case 12:string(0xC8,"YES"); break;
                                case 13:string(0xC8,"YES"); break;
                                case 14:string(0xC8,"YES"); break;
                                case 15:string(0xC8,"YES"); break;
                                case 16:string(0xC8,"YES"); break;
                        }        
                        delay(100);                         //延时
                        write_command(0x01);                //写入清屏命令
                        delay(1);                        //延时
         }          while(ST==1);
                  write_command(0x01);                //写入清屏命令
                        delay(1);                        //延时
if(START==1)    //有按键按下
{           
delay(2000);
         
   {         
   string(0x80,"3614.1 cm3/s");

}
        }
delay(10000000);//延时
write_command(0x01);//写入清屏命令
delay(1);//延时
while(1);
}
void delay(uint j)                        //1ms延时子程序
{
        uchar i=250;
        for(;j>0;j--)
{
                while(--i);
                i=249;
                while(--i);
                i=250;
        }
}
void check_busy(void)                        //检查忙标志函数
{
        uchar dt;
        do
        {
                P0=0xff;
                E=0;
                RS=0;        
                RW=1;
E=1;
dt=P0;
}while(dt&0x80);
E=0;
}
void write_command(uchar com)                 //写命令函数
{
check_busy();
E=0;
RS=0;
RW=0;
out=com;
E=1;
_nop_( );
E=0;
delay(1);
}
void write_data(uchar dat)                                 //写数据函数
{
        check_busy();
        E=0;
        RS=1;
        RW=0;
        out=dat;
        E=1;
        _nop_();
        E=0;
        delay(1);        
}
void LCD_initial(void)                         //液晶显示器初始化函数
{
write_command(0x38);        //写入命令0x38:8位两行显示,5×7点阵字符
write_command(0x0C);        //写入命令0x0C:开整体显示,光标关,无黑块
write_command(0x06);        //写入命令0x06:光标右移

write_command(0x01);                         //写入命令0x01:清屏
delay(1);
}
void string(uchar ad,uchar *s)        //输出显示字符串的函数
{
write_command(ad);
while(*s>0)
{
write_data(*s++);                        //输出字符串,且指针增1
delay(50);
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2019-5-20 08:28 | 只看该作者
由于不知道你的硬件连接,我只试了1602和矩阵键盘。显示是正常的,与你的照片显示内容不一样,就是程序设置显示的内容:第一排显示zhijing,第二排显示按键值,或YES。
你的程序中的ST不知道是什么,所以没有试出当ST低电平后跳出do    while循环的现象。
回复

使用道具 举报

板凳
ID:330198 发表于 2019-5-20 09:21 | 只看该作者
硬件连线问题,你是不是没共地,或者接了可调电阻另一端没接地。
回复

使用道具 举报

地板
ID:541471 发表于 2019-5-20 09:48 | 只看该作者
HC6800-ES-V2.0 发表于 2019-5-20 08:28
由于不知道你的硬件连接,我只试了1602和矩阵键盘。显示是正常的,与你的照片显示内容不一样,就是程序设置 ...

你在实物上试得?还是仿真?
回复

使用道具 举报

5#
ID:62288 发表于 2019-5-20 09:56 | 只看该作者
焊接问题的可能性比较大,程序一般不对的话是没有显示的。
回复

使用道具 举报

6#
ID:541471 发表于 2019-5-20 10:04 | 只看该作者
zhanghyg 发表于 2019-5-20 09:21
硬件连线问题,你是不是没共地,或者接了可调电阻另一端没接地。

不是啊,都接好了,才发现电位器是100欧的,会不会是和这个有关。
回复

使用道具 举报

7#
ID:475247 发表于 2019-5-20 21:17 | 只看该作者
这个问题你要这样解。仿真与实物存最大不同就是时间问题!你要先显一个你要显示的数字或字母,设好要显示的位置,来调时间,如果调好每一个再就是第二个................
       当然也有直接的方法,下别人调好的代码,改端口烧进你的板子看看。完事就是对你的代码与别人不同处

评分

参与人数 2黑币 +16 收起 理由
shuisheng60 + 8 很给力!
jinsheng7533967 + 8 绝世好帖!

查看全部评分

回复

使用道具 举报

8#
ID:164602 发表于 2019-5-21 07:09 | 只看该作者
gggggklk 发表于 2019-5-20 09:48
你在实物上试得?还是仿真?

当然是实物了

评分

参与人数 1黑币 +8 收起 理由
yoxi + 8 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:543975 发表于 2019-5-21 17:14 | 只看该作者
楼主问题解决了吗?我也遇到差不多的问题
回复

使用道具 举报

10#
ID:472325 发表于 2019-5-22 23:37

HC6800-ES-V2.0普中的开发板差的狼!服务更差,经常将不配套的东西发给别人!没有一点商业道德!

11#
ID:371051 发表于 2019-5-23 18:37 | 只看该作者
要想实物像仿真一样显示,代码所写的管脚等都要与单片机上一致,否则会出现输出混乱
回复

使用道具 举报

12#
ID:56855 发表于 2019-5-23 21:33 | 只看该作者
注意刷新时序    刷新太快容易造成肉眼反应不过来
回复

使用道具 举报

13#
ID:684813 发表于 2020-2-13 02:43 | 只看该作者
应该是晶振问题,检查你晶振。看看程序用的啥晶振是12MHz,还是11.0592
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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