燒錄進單片機后,按下按鍵無法加減時間,led燈正常閃爍。功能要求如下:用定時器實現準確的延時,延時到后點亮或熄滅一盞燈,然 后通過兩個按鍵(增、 減) 改變延時長短。比如:剛開始的時候點
亮 1s 后熄滅 1s,當按下“增”按鍵后,點亮 1.5s,然后熄滅 1.5s, 再點亮 1.5s,如此循環。當按下“減”按鍵后,點亮 0.5s,然后 熄滅 0.5s, 再點亮 0.5s,如此循環。
以下是單片機代碼,不知道是否合理,出現了按下按鍵,時間無法加和減
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit LED = P0^0;
unsigned int i =1000 ; //定時1s
void delay();
void main()
{
bit keybuf1 = 1; //按鍵值暫存,臨時保存按鍵的掃描值
bit keybuf2 = 1;
bit backup = 1; //按鍵值備份,保存前一次的掃描值
unsigned int i =1000 ; //定時1s
ENLED = 0; //選擇LED進行顯示
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD=0X01;
TH0=0XFC;//賦初值使定時時間為1ms
TL0=0X18;
EA=1; //打開總中斷
ET0=1;//打開定時器中斷
TR0=1;//打開定時器
P2 = 0xF7; //P2.3置0,即KeyOut1輸出低電平
LED = 0;
while (1)
{
keybuf1 = KEY1; //把當前掃描值暫存
if (keybuf1 != backup) //當前值與前次值不相等說明此時按鍵有動作
{
delay(); //延時大約10ms
if (keybuf1 == KEY1) //判斷掃描值有沒有發生改變,即按鍵抖動
{
if (backup == 0) //如果前次值為0,則說明當前是彈起動作
{
i = i+500; //
}
backup = keybuf1; //更新備份為當前值,以備進行下次比較
}
}
keybuf2 = KEY2; //把當前掃描值暫存
if (keybuf2 != backup) //當前值與前次值不相等說明此時按鍵有動作
{
delay(); //延時大約10ms
if (keybuf2 == KEY2) //判斷掃描值有沒有發生改變,即按鍵抖動
{
if (backup == 0) //如果前次值為0,則說明當前是彈起動作
{
i = i-500; //
}
backup = keybuf2; //更新備份為當前值,以備進行下次比較
}
}
}
}
/* 軟件延時函數,延時約10ms */
void delay()
{
unsigned int i = 1000;
while (i--);
}
/******中斷子程序*******/
void timer0() interrupt 1
{
static int cnt;
TH0=0XFC; //重新賦初值
TL0=0X18;
cnt++;
if(cnt >= i)
{
cnt = 0;
LED = ~LED;
}
}
|