找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3264|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

1602顯示程序的顯示問(wèn)題,執(zhí)行后發(fā)現(xiàn)按下1屏幕會(huì)顯示兩個(gè)1,怎么回事

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:65930 發(fā)表于 2014-11-20 18:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;           //這里沒(méi)有讀寫定義是因?yàn)橹苯咏拥亓,因(yàn)槠綍r(shí)都用來(lái)寫程序;
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口,待會(huì)使能端可以讀走
        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)同時(shí)閃爍
        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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

write_date(0x30+1);


}
結(jié)果又對(duì)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:65930 發(fā)表于 2014-11-20 18:56 | 只看該作者
大家?guī)兔纯磣
回復(fù)

使用道具 舉報(bào)

地板
ID:67992 發(fā)表于 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成立的話,程序會(huì)不會(huì)死在這里?也就是說(shuō)有按鍵按下,程序停在這不往下執(zhí)行了,松手才往下執(zhí)行,松手后再執(zhí)行一切都和沒(méi)按一樣了,感覺(jué)松手后temp再讀回P3沒(méi)意義,讀回的還是0xf0
回復(fù)

使用道具 舉報(bào)

5#
ID:67992 發(fā)表于 2014-11-20 23:32 | 只看該作者
while(keyscan())
{write_date(0x30+keyscan());
while(1);
程序又死在這了,應(yīng)該搞個(gè)大循環(huán)啊

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:65930 發(fā)表于 2014-11-21 13:35 | 只看該作者
dgahz 發(fā)表于 2014-11-20 23:21
while(temp!=0xf0)這一句如果temp!=0xf0成立的話,程序會(huì)不會(huì)死在這里?也就是說(shuō)有按鍵按下,程序停在這 ...

為什么不往下執(zhí)行?這只是個(gè)條件語(yǔ)句,有鍵按下就返回對(duì)應(yīng)的n值啊,怎么會(huì)卡?這里是為了消抖。
回復(fù)

使用道具 舉報(bào)

7#
ID:65930 發(fā)表于 2014-11-21 13:36 | 只看該作者
dgahz 發(fā)表于 2014-11-20 23:32
程序又死在這了,應(yīng)該搞個(gè)大循環(huán)啊

這里我是故意的,只要執(zhí)行一次write_date()就行了
回復(fù)

使用道具 舉報(bào)

8#
ID:67992 發(fā)表于 2014-11-21 19:43 | 只看該作者
不好意思,我搞錯(cuò)了,把while函數(shù)體忘了,條件滿足是要執(zhí)行函數(shù)體的。主程序搞個(gè)大循環(huán)沒(méi)發(fā)現(xiàn)你說(shuō)的兩個(gè)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ù)

使用道具 舉報(bào)

9#
ID:69706 發(fā)表于 2014-11-30 19:29 | 只看該作者
學(xué)習(xí)中。。。。。。。。。
回復(fù)

使用道具 舉報(bào)

10#
ID:65930 發(fā)表于 2014-12-3 15:18 | 只看該作者
dgahz 發(fā)表于 2014-11-21 19:43
不好意思,我搞錯(cuò)了,把while函數(shù)體忘了,條件滿足是要執(zhí)行函數(shù)體的。主程序搞個(gè)大循環(huán)沒(méi)發(fā)現(xiàn)你說(shuō)的兩個(gè)1. ...

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

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表