給樓主提個建議,將按鍵掃描和動態顯示分別做一個模塊。采用分時的方法,在鍵盤掃描中定義一個標志位keyflag,當按鍵按下按下時,keyflag=1;按鍵彈起來時,keyflag置1,這樣就檢測標志位就不用一行一行的掃描鍵盤,消耗cpu的時間,同時也避免了按鍵掃描和動態顯示之間的時間沖突,比如,按一下按鍵,數碼管會閃一下。一個小段程序可能體現不出來,但如果是一個大型復雜的程序,問題就非常重要了,所以分時的思想在單片機中非常重要。當然也可以用中斷解決,但是單片機中斷源有限,能節約硬件資源就節約一下吧。
標志位的狀態,如果不清楚的話,可以自己寫一下,就會明白了。
#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};
//***********延時10ms*********//
void delay()
{
uchar i,j=10;
while(j--)
{
for(i=120;i>0;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)//按鍵標志位
{
delay();
if(!key)
{
keyflag=1;
counter++;
if(counter==100)//計滿100,清0
counter=0;
}
}
}
else
keyflag=0;
}
void main(void)
{
while( 1 )
{
keyread();
display();
}
}
|