?? kb.c
字號:
//[KB.c]鍵盤掃描識別-------------------------------------------------------*
//本文件包含: *
// (1)KB_Init:鍵盤初始化 *
// (2)KB_Scan1:單次掃描讀取鍵值 *
// (3)KB_Def:鍵值轉為定義值 *
// (4)KB_ScanN:多次掃描鍵盤消除"抖動"問題 *
//-------------------------------------------------------------------------*
//頭文件
#include "KB.h" //鍵盤掃描識別頭文件
//KB_Init:鍵盤初始化函數---------------------------------------------------*
//功 能:初始化鍵盤中斷的引腳,但未開放鍵盤中斷 *
//參 數:無 *
//返 回:無 *
//-------------------------------------------------------------------------*
void KB_Init(void)
{
KB_P = 0x00; //復位KB_P
KB_D = 0x0F; //定義7-4為輸入,3-0為輸出
KB_PE = 0xF0; //定義KB_P.7-4允許上拉或下拉
KB_PS = 0x00; //定義KB_P.7-4上拉電阻,并且下降沿產生中斷
KB_IE = 0x00; //定義KB_P.7-4輸入引腳禁止中斷
KB_IF = 0xFF; //清除鍵盤中斷標志位(寫1清)
}
//KB_Scan1:掃描讀取鍵值函數------------------------------------------------*
//功 能:掃描一次4*4鍵盤上的按鍵,讀取鍵值->*p;若無按鍵,*p為0xff *
//參 數:無 *
//返 回:掃描到的鍵值 *
//-------------------------------------------------------------------------*
INT8U KB_Scan1(void)
{
INT8U line,i,tmp;
line=0xFE; //使第一根行線為0(低電平)
for (i = 1; i <= 4; i++) //最多將掃描4根行線
{
//當前掃描的一行,輸出低電平
tmp = KB_P;
tmp |= 0X0F;
KB_P = tmp & line;
asm("NOP");
asm("NOP");
//讀取鍵盤口數據寄存器
tmp = KB_P;
//通過觀察4根列線中是否出現低電平來判斷當前行有無按鍵
tmp &= 0XF0; //僅保留列線的值
if (tmp != 0xF0) //當前行有鍵按下
{
tmp=KB_P; //讀取掃描到的鍵值
break; //退出循環不再掃描
}
else //當前行無按鍵,準備掃描下一行
line = (line << 1) | 0x01;
}
if (i == 5) //無按鍵,以后將返回0xff
tmp = 0xFF;
return (tmp);
}
//KB_ScanN:多次掃描鍵盤函數------------------------------------------------*
//功 能:多次掃描鍵盤,消除"抖動" *
//參 數:KB_count=多次掃描鍵盤的的次數 *
//返 回:多次掃描鍵盤得到的鍵值: *
// 正常按鍵--KB_value_now; 非正常按鍵(包括無按鍵)--0xFF *
//內部調用函數:KB_Scan1 *
//-------------------------------------------------------------------------*
INT8U KB_ScanN(INT8U KB_count)
{
INT8U i,KB_value_last,KB_value_now;
if (0 == KB_count || 1 == KB_count)
return KB_Scan1();
//先掃描一次得到的鍵值,便于下面比較
KB_value_now = KB_value_last = KB_Scan1();
//以下多次掃描消除誤差
for (i=0; i<KB_count-1; i++)
{
KB_value_now = KB_Scan1();
if (KB_value_now == KB_value_last)
return KB_value_now; //返回掃描的鍵值
else
KB_value_last = KB_value_now;
}
return 0xFF; //返回出錯標志
}
//KB_Def:鍵值轉為定義值函數------------------------------------------------*
//功 能:鍵值轉為定義值 *
//參 數:KB_valve=鍵值 *
//返 回:KeyPress=鍵定義值 *
//-------------------------------------------------------------------------*
//鍵盤定義表
const INT8U KB_Table[]=
{
0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
0x00
};
INT8U KB_Def(INT8U KB_valve)
{
INT8U KeyPress;
INT8U i;
INT8U j;
i = 0;
while (1)
{
j = KB_Table[i];
//與0(定義表結束標志)相比較
if (j == 0) //=0,即表中無次定義值
{
KeyPress = 0xFF; //返回0xFF
break;
}
else
{
//與鍵值相比較
if(j == KB_valve) //找到
{
KeyPress = KB_Table[i+1]; //取鍵定義值
break;
}
else
{
i += 2; //指向下一個鍵值,繼續判斷
}
}
}
return KeyPress; //返回鍵定義值
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -