找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602显示程序的显示问题,执行后发现按下1屏幕会显示两个1,怎么回事

[复制链接]
跳转到指定楼层
楼主
ID:65930 发表于 2014-11-20 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;           //这里没有读写定义是因为直接接地了,因为平时都用来写程序;
sbit en=P3^4;   //只要控制rs和en端就可以
sbit dula=P2^6;
sbit wela=P2^7;
uchar temp;int n;
int flag,nn;
void delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=10;b>0;b--);
}

void delay1(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=100;b>0;b--);
}

void write_com(uchar com)
{
        P0=com;                           //命令写入P0口,待会使能端可以读走
        rs=0;                           //写命令
        en=0;
        delay(10);
        en=1;
        delay(10);
        en=0;
       
}

void write_date(uchar date)
{
        P0=date;
        rs=1;                         //写数据
        en=0;
        delay(10);
        en=1;
        delay(10);
        en=0;
       
}
uint keyscan()
{        
P3=0xfe;
         temp=P3;
         temp=temp&0xf0;
         while(temp!=0xf0)
         {delay(5);
         temp=P3;
         temp=temp&0xf0;
         while(temp!=0xf0)
                        {
                        temp=P3;
                                switch(temp)
                                 {case 0xee:n=1;break;
                                 case 0xde:n=2;break;
                                 case 0xbe:n=3;break;
                                 case 0x7e:n=4;break;
                                 }
                                while(temp!=0xf0)
                                {temp=P3;
                                temp=temp&0xf0;
                                }

                        }
        }
        return n;
}
void init()
{
        dula=0;                                  //这里主要是防止数码管亮导致功率增大影响LCD
        wela=0;
        write_com(0x38);          //显示模式设置
        delay(20);
        write_com(0x0f);          //显示光标同时闪烁
        delay(20);
        write_com(0x06);          //正序显示,07是整屏左移
        delay(20);
        write_com(0x01);          //清零显示
        delay(20);
        write_com(0x80);
        delay(20);
       
}

void main()
{
init();
while(keyscan())
{write_date(0x30+keyscan());
while(1);
}
}

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

使用道具 举报

沙发
ID:65930 发表于 2014-11-20 18:55 | 只看该作者
如果主程序改成void main()
{
init();

write_date(0x30+1);


}
结果又对了
回复

使用道具 举报

板凳
ID:65930 发表于 2014-11-20 18:56 | 只看该作者
大家帮忙看看~
回复

使用道具 举报

地板
ID:67992 发表于 2014-11-20 23:21 | 只看该作者
本帖最后由 dgahz 于 2014-11-20 23:26 编辑
P3=0xfe;
         temp=P3;
         temp=temp&0xf0;
         while(temp!=0xf0)
         {delay(5);
         temp=P3;

while(temp!=0xf0)这一句如果temp!=0xf0成立的话,程序会不会死在这里?也就是说有按键按下,程序停在这不往下执行了,松手才往下执行,松手后再执行一切都和没按一样了,感觉松手后temp再读回P3没意义,读回的还是0xf0
回复

使用道具 举报

5#
ID:67992 发表于 2014-11-20 23:32 | 只看该作者
while(keyscan())
{write_date(0x30+keyscan());
while(1);
程序又死在这了,应该搞个大循环啊

评分

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

查看全部评分

回复

使用道具 举报

6#
ID:65930 发表于 2014-11-21 13:35 | 只看该作者
dgahz 发表于 2014-11-20 23:21
while(temp!=0xf0)这一句如果temp!=0xf0成立的话,程序会不会死在这里?也就是说有按键按下,程序停在这 ...

为什么不往下执行?这只是个条件语句,有键按下就返回对应的n值啊,怎么会卡住?这里是为了消抖。
回复

使用道具 举报

7#
ID:65930 发表于 2014-11-21 13:36 | 只看该作者
dgahz 发表于 2014-11-20 23:32
程序又死在这了,应该搞个大循环啊

这里我是故意的,只要执行一次write_date()就行了
回复

使用道具 举报

8#
ID:67992 发表于 2014-11-21 19:43 | 只看该作者
不好意思,我搞错了,把while函数体忘了,条件满足是要执行函数体的。主程序搞个大循环没发现你说的两个1.改成这样试试
void init()
{
        dula=0;                                  //这里主要是防止数码管亮导致功率增大影响LCD
        wela=0;
        write_com(0x38);          //显示模式设置
        delay(20);
        write_com(0x0c);         
        delay(20);
        write_com(0x06);          //正序显示,07是整屏左移
        delay(20);
        write_com(0x01);          //清零显示
        delay(20);
        write_com(0x80);
        delay(20);
        
}

void main()
{
        init();
        while(1)
        {
           write_com(0x80);
           write_date(0x30+keyscan());
       
        }
}
回复

使用道具 举报

9#
ID:69706 发表于 2014-11-30 19:29 | 只看该作者
学习中。。。。。。。。。
回复

使用道具 举报

10#
ID:65930 发表于 2014-12-3 15:18 | 只看该作者
dgahz 发表于 2014-11-21 19:43
不好意思,我搞错了,把while函数体忘了,条件满足是要执行函数体的。主程序搞个大循环没发现你说的两个1. ...

P3.4和P3.5与按键的P3口重复了,所以会出现乱码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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