標(biāo)題: 1602顯示程序的顯示問題,執(zhí)行后發(fā)現(xiàn)按下1屏幕會顯示兩個1,怎么回事 [打印本頁]

作者: sober峰    時間: 2014-11-20 18:54
標(biāo)題: 1602顯示程序的顯示問題,執(zhí)行后發(fā)現(xiàn)按下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;                         //寫數(shù)據(jù)
        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;                                  //這里主要是防止數(shù)碼管亮導(dǎo)致功率增大影響LCD
        wela=0;
        write_com(0x38);          //顯示模式設(shè)置
        delay(20);
        write_com(0x0f);          //顯示光標(biāo)同時閃爍
        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);


}
結(jié)果又對了
作者: sober峰    時間: 2014-11-20 18:56
大家?guī)兔纯磣
作者: 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成立的話,程序會不會死在這里?也就是說有按鍵按下,程序停在這不往下執(zhí)行了,松手才往下執(zhí)行,松手后再執(zhí)行一切都和沒按一樣了,感覺松手后temp再讀回P3沒意義,讀回的還是0xf0
作者: dgahz    時間: 2014-11-20 23:32
while(keyscan())
{write_date(0x30+keyscan());
while(1);
程序又死在這了,應(yīng)該搞個大循環(huán)啊
作者: sober峰    時間: 2014-11-21 13:35
dgahz 發(fā)表于 2014-11-20 23:21
while(temp!=0xf0)這一句如果temp!=0xf0成立的話,程序會不會死在這里?也就是說有按鍵按下,程序停在這 ...

為什么不往下執(zhí)行?這只是個條件語句,有鍵按下就返回對應(yīng)的n值啊,怎么會卡。窟@里是為了消抖。
作者: sober峰    時間: 2014-11-21 13:36
dgahz 發(fā)表于 2014-11-20 23:32
程序又死在這了,應(yīng)該搞個大循環(huán)啊

這里我是故意的,只要執(zhí)行一次write_date()就行了
作者: dgahz    時間: 2014-11-21 19:43
不好意思,我搞錯了,把while函數(shù)體忘了,條件滿足是要執(zhí)行函數(shù)體的。主程序搞個大循環(huán)沒發(fā)現(xiàn)你說的兩個1.改成這樣試試
void init()
{
        dula=0;                                  //這里主要是防止數(shù)碼管亮導(dǎo)致功率增大影響LCD
        wela=0;
        write_com(0x38);          //顯示模式設(shè)置
        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());
       
        }
}
作者: 風(fēng)緣    時間: 2014-11-30 19:29
學(xué)習(xí)中。。。。。。。。。
作者: sober峰    時間: 2014-12-3 15:18
dgahz 發(fā)表于 2014-11-21 19:43
不好意思,我搞錯了,把while函數(shù)體忘了,條件滿足是要執(zhí)行函數(shù)體的。主程序搞個大循環(huán)沒發(fā)現(xiàn)你說的兩個1. ...

P3.4和P3.5與按鍵的P3口重復(fù)了,所以會出現(xiàn)亂碼




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1