|
給樓主提個(gè)建議,將按鍵掃描和動(dòng)態(tài)顯示分別做一個(gè)模塊。采用分時(shí)的方法,在鍵盤(pán)掃描中定義一個(gè)標(biāo)志位keyflag,當(dāng)按鍵按下按下時(shí),keyflag=1;按鍵彈起來(lái)時(shí),keyflag置1,這樣就檢測(cè)標(biāo)志位就不用一行一行的掃描鍵盤(pán),消耗cpu的時(shí)間,同時(shí)也避免了按鍵掃描和動(dòng)態(tài)顯示之間的時(shí)間沖突,比如,按一下按鍵,數(shù)碼管會(huì)閃一下。一個(gè)小段程序可能體現(xiàn)不出來(lái),但如果是一個(gè)大型復(fù)雜的程序,問(wèn)題就非常重要了,所以分時(shí)的思想在單片機(jī)中非常重要。當(dāng)然也可以用中斷解決,但是單片機(jī)中斷源有限,能節(jié)約硬件資源就節(jié)約一下吧。
標(biāo)志位的狀態(tài),如果不清楚的話,可以自己寫(xiě)一下,就會(huì)明白了。
#include<reg51.h>
#define uchar unsigned char
sbit key=P3^3;
bit keyflag;
char counter=0;
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//***********延時(shí)10ms*********//
void delay()
{
uchar i,j=10;
while(j--)
{
for(i=120;i>0;i--);
}
}
//**********動(dòng)態(tài)掃描*********//
void display(void)
{
P2=0xfd;
P1=seg[counter/10];
delay();
P2=0xfe;
P1=seg[counter%10];
delay();
}
//***********按鍵掃描*********//
void keyread(void)
{
if(!key)
{
if(keyflag==0)//按鍵標(biāo)志位
{
delay();
if(!key)
{
keyflag=1;
counter++;
if(counter==100)//計(jì)滿100,清0
counter=0;
}
}
}
else
keyflag=0;
}
void main(void)
{
while( 1 )
{
keyread();
display();
}
}
|
|