這里以藍橋杯的單片機板子作為參考
法一:查詢方式
只要查詢其引腳電平是否發生變化,就可以判斷按鍵是否被按下。
ScreenShot_20180705144132.png (9.36 KB, 下載次數: 40)
下載附件
按鍵原理圖
2018-7-5 14:40 上傳
其具體的實現函數為:
//按鍵掃描函數
uchar key_scan(void)
{
uchar key;
P3 &= 0x0F;
switch (P3)
{
case 0x0E:
key = 7;
break;
case 0x0D:
key = 6;
break;
case 0x0B:
key = 5;
break;
case 0x07:
key = 4;
break;
default:
key = 0x0F;
break;
}
return key;
}
void key_action(void)
{
uchar key;
key = key_scan();
if(key != 0x0F)
{
delay_ms(10);
key = key_scan();
if(key != 0x0F)
{
switch(key)
{
case 7:
led_on();
break;
case 6:
led_off();
break;
case 5:
relay_on();
break;
case 4:
relay_off();
break;
default:
break;
}
while(P3 != 0x0F);
}
}
}
法二:中斷方式
中斷方式的區別在于對改端口的引腳變化進行實時檢測,從而及時地判斷引腳是否被按下。
ScreenShot_20180705145600.png (24.26 KB, 下載次數: 28)
下載附件
2018-7-5 14:55 上傳
其具體的實現函數為:
void int0_handler(void) interrupt 1
{
static ms_count = 0;
if(++ms_count == 10) //10ms進行按鍵檢測
{
ms_count = 0;
key_flag = 1;
}
display();
}
void key_check(void)
{
uchar key = 0;
static bit key_ready = 0; //按鍵數據存儲完畢標志位
static uchar key_save = 0; //保存鍵值
static uchar key_time = 0; //記錄按鍵的次數
if(key = key_scan())
{
key_time ++;
if(key_time == KEY_LAST)
{
key_time = 0;
key_ready = 1;
key_save = key;
}
}
else if(!(key_scan()) && (key_ready == 1)) //wait for key up
{
key_ready = 0;
key_action(key_save);
}
}
具體工程情況詳見附件。
7.int_control_display.zip
(35.55 KB, 下載次數: 7)
2018-7-5 14:55 上傳
點擊文件名下載附件
中斷方式實現按鍵查詢 下載積分: 黑幣 -5
3.key.zip
(29.64 KB, 下載次數: 5)
2018-7-5 14:49 上傳
點擊文件名下載附件
查詢方式實現按鍵檢測 下載積分: 黑幣 -5
|