#include "key_m.h"
//函數聲明
unsigned char Key_Map(unsigned char _key);
#if KEYVALUE_MIR_123A
unsigned char KEY_Mir_123A(unsigned char _key);
#endif
#if KEYVALUE_MIR_ABCD
unsigned char KEY_Mir_ABCD(unsigned char _key);
#endif
#if KEYVALUE_ROT_CW90
unsigned char KEY_Rot_CW90(unsigned char _key);
#endif
//------------------------------------------------
// 函數介紹: 掃描矩陣鍵盤,并返回按鍵值
// 輸入參數: mode:0不支持連續按鍵;1支持連按
// 返 回 值: 0無按鍵,其他有對應按鍵按下
// 修訂版本:V1.1
//------------------------------------------------
unsigned char KeyScan(bit mode)
{
unsigned char KeyValue = 0;
static bit key_up = 1;
char a = 0;
GPIO_KEY=0x0f;//P1.7|P1.6|P1.5|P1.4拉低
if((GPIO_KEY!=0x0f)&&key_up)//讀取按鍵是否按下
{
key_up = mode;
delay_ms(10);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0x80;break;
case(0X0b): KeyValue=0x40;break;
case(0X0d): KeyValue=0x20;break;
case(0X0e): KeyValue=0x10;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+0x08;break;
case(0Xb0): KeyValue=KeyValue+0x04;break;
case(0Xd0): KeyValue=KeyValue+0x02;break;
case(0Xe0): KeyValue=KeyValue+0x01;break;
}
}
}
else if(GPIO_KEY==0x0f)//按鍵松手檢測
{
key_up = 1;
}
//以上返回為16進制行列值(1,2,4,8)X(1,2,4,8)
KeyValue = Key_Map(KeyValue); //返回字符按鍵值
//對于按鍵的鏡像和旋轉都可以用這3個函數組合而實現
#if KEYVALUE_MIR_123A
KeyValue = KEY_Mir_123A(KeyValue);
#endif
#if KEYVALUE_MIR_ABCD
KeyValue = KEY_Mir_ABCD(KeyValue);
#endif
#if KEYVALUE_ROT_CW90
KeyValue = KEY_Rot_CW90(KeyValue);
#endif
return KeyValue;
|