?? keyscan.c
字號:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:鍵盤掃描子程序 **
//**<功能>:當有外部中斷0時調用此函數,使用列掃描的方式獲取鍵碼,鍵碼由2位數字組成。高位為行號 **
//** 低位為列號。 **
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************頭文件及宏定義************************** *
//* *
//*************************************************************************************************
#include <at89x51.h>
#define SCANPORT P1 //4×4鍵盤掃描端口,低4位是行線,高4位是列線。
//采用逐列掃描的方法,無按鍵時,低4位輸出1,高4位輸出0。
//當有按鍵時,高4位輸出掃描電位,低4位輸入掃描結果。
//*************************************************************************************************
//* *
//* ********************************全局變量****************************** *
//* *
//*************************************************************************************************
unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F}; //列線掃描電壓,分為第1,2,3,4根列線
//為低電平,其他為高電平。
//*************************************************************************************************
//* *
//* ********************************函數實現****************************** *
//* *
//*************************************************************************************************
unsigned char ucKeyScan()
{
unsigned char ucTemp=0; //掃描狀態暫存。
unsigned char ucRow=0,ucLine=0; //行號,列號。
EX0=0; //在鍵掃描處理時,關閉外部中斷0,防抖動。
for(ucLine=0;ucLine<4;ucLine++) //列掃描
{
SCANPORT=uca_LineScan[ucLine]; //輸出掃描電位。
ucTemp=SCANPORT&0x0F; //輸入掃描電位,并屏蔽高4位。
if(ucTemp!=0x0F)
{ //判斷該列是否有按鍵按下。
switch(ucTemp)
{
case 0x0E: ucRow=10;break; //如果有,則判斷行號。
case 0x0D: ucRow=20;break;
case 0x0B: ucRow=30;break;
case 0x07: ucRow=40;break;
default: ucRow=50;break;
}
break;
}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復鍵掃描處理前初始狀態>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SCANPORT=0x0F; //恢復P2口
EX0=1; //恢復按鍵中斷。
return ucRow+ucLine+1; //返回按鍵編碼。格式為2位數,高位為行號,低位為列號。
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -