|
100黑幣
請教大神。實現利用按鍵K1控制數碼管DS6顯示9~0的倒計時,按鍵每按下一次,數字減一。只顯示0,請大神幫我指指錯誤,下面是我的代碼:
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit K1 = P2^4;
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
void delay();
void main()
{
bit keybuf = 1; //按鍵值暫存,臨時保存按鍵的掃描值
bit backup = 1; //按鍵值備份,保存前一次的掃描值
unsigned char cnt = 0; //按鍵計數,記錄按鍵按下的次數
unsigned int j;
ENLED = 0; //選擇數碼管 DS6進行顯示
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1;
P2 = 0xF7; //P2.3 置 0,即 KeyOut1 輸出低電平
P0 = LedChar[j]; //顯示值
while (1)
{
keybuf = j; //把當前掃描值暫存
if (keybuf != backup) //當前值與前次值不相等說明此時按鍵有動作
{
delay(); //延時大約 10ms
if (keybuf == j) //判斷掃描值有沒有發生改變,即按鍵抖動
{
if (backup == 0) //如果前次值為 0,則說明當前是彈起動作
{
cnt++; //按鍵次數+1
j--;
if (cnt >= 9)
{ //只用 1 個數碼管顯示,所以加到 10 就清零重新開始
cnt = 0;
j = 9;
}
P0 = LedChar[j]; //計數值顯示到數碼管上
}
backup = keybuf; //更新備份為當前值,以備進行下次比較
}
}
} }
/* 軟件延時函數,延時約 10ms */
void delay()
{
unsigned int i = 1000;
while (i--);
}
|
|