标题: 1602显示程序的显示问题,执行后发现按下1屏幕会显示两个1,怎么回事 [打印本页]

作者: sober峰    时间: 2014-11-20 18:54
标题: 1602显示程序的显示问题,执行后发现按下1屏幕会显示两个1,怎么回事
#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);
}
}


作者: sober峰    时间: 2014-11-20 18:55
如果主程序改成void main()
{
init();

write_date(0x30+1);


}
结果又对了
作者: sober峰    时间: 2014-11-20 18:56
大家帮忙看看~
作者: dgahz    时间: 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
作者: dgahz    时间: 2014-11-20 23:32
while(keyscan())
{write_date(0x30+keyscan());
while(1);
程序又死在这了,应该搞个大循环啊
作者: sober峰    时间: 2014-11-21 13:35
dgahz 发表于 2014-11-20 23:21
while(temp!=0xf0)这一句如果temp!=0xf0成立的话,程序会不会死在这里?也就是说有按键按下,程序停在这 ...

为什么不往下执行?这只是个条件语句,有键按下就返回对应的n值啊,怎么会卡住?这里是为了消抖。
作者: sober峰    时间: 2014-11-21 13:36
dgahz 发表于 2014-11-20 23:32
程序又死在这了,应该搞个大循环啊

这里我是故意的,只要执行一次write_date()就行了
作者: dgahz    时间: 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());
       
        }
}
作者: 风缘    时间: 2014-11-30 19:29
学习中。。。。。。。。。
作者: sober峰    时间: 2014-12-3 15:18
dgahz 发表于 2014-11-21 19:43
不好意思,我搞错了,把while函数体忘了,条件满足是要执行函数体的。主程序搞个大循环没发现你说的两个1. ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1