?? key_scan.c
字號:
/*-----------------------------------
**模塊:鍵盤掃描(翻轉法)
**功能:分別對行列進行掃描得到鍵值
**備注:高四位為列,低四位為行
------------------------------------*/
#include <AD9851_CONFIG.H>
#include <intrinsics.h>
/************鍵盤變量定義***************/
uchar temp=0;
uchar key=0;
uchar key_value;
uchar key_scan(void)
{
KEY_DDR= 0xF0; //行掃描,高四位輸出0,鍵按下,則對應的值為0
KEY_PORT= 0x0F; //低四位輸入,內部電阻上拉,沒有鍵按下時為高
delay_nms(30); //延時等待穩定
temp = KEY_PIN&0x0F; //屏蔽高四位
if(temp==0x0F)
{
return 0; //當低四位全為高則無按鍵返回
}
else
{
delay_nms(30);
temp = KEY_PIN&0x0F; //延時去抖后再檢測
if(temp==0x0F)
return 0;
else
key=temp;
}
//翻轉
KEY_DDR = 0x0F; //列掃描,低四位輸出0,鍵按下,則對應的值為0
KEY_PORT = 0xF0; //高四位輸入,內部電阻上拉,沒有鍵按下時為高
delay_nms(30); //延時等待穩定
temp = KEY_PIN&0xF0; //屏蔽低四位
if(temp==0xF0)
{
return 0; //當高四位全為高則無按鍵返回
}
else //這里不再延時再掃描,因為已經確定了不是抖動才會進入本步操作。
{
key |= temp; //高低位的鍵值進入KEY
}
KEY_DDR = 0x00; /*輸出復位*/
KEY_PORT = 0xFF;
return key;
}
/*-----------------------------------
**模塊:鍵值計算
**功能:對獲得的鍵碼換算成實際值
**備注:調用key_scan()子程序
------------------------------------*/
uchar get_key()
{
unsigned char i=0;
i=key_scan();
switch (i)
{ /*將按鍵碼轉換成鍵值*/
case 0x00: return 0xc7;
case 0x77: return '1';
case 0xB7: return '4';
case 0xD7: return '7';
case 0xE7: return '*';
case 0x7B: return '2';
case 0xBB: return '5';
case 0xDB: return '8';
case 0xEB: return '0';
case 0x7D: return '3';
case 0xBD: return '6';
case 0xDD: return '9';
case 0xED: return '#';
case 0x7E: return 'A';
case 0xBE: return 'B';
case 0xDE: return 'C';
case 0xEE: return 'D';
default : return 0x21;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -