矩陣鍵盤掃描原理詳解
根據原理圖
鍵盤掃描方法是:行線P10~P13爲輸出線,列線P14~P17爲輸入線。一開始單片機將行線(P10~P13)全部輸出低電平,此時讀入列線數據,若列線全爲高電平則沒有鍵按下,當列線有出現低電平時調用延時程序以此來去除按鍵抖動。延時完成後再判斷是否有低電平,如果此時讀入列線數據還是有低電平,則說明確實有鍵按下。最後一步確定鍵值。現在我們以第二行的S5鍵爲例,若按下S5後我們應該怎麼得到這個鍵值呢?當判斷確實有鍵按下之後,行線輪流輸出低電平,根據讀入列線的數據可以確定鍵值。首先,單片機將P10輸出爲低電平,其它P11~P13輸出高電平,此時讀取列線的數據全爲高電平,說明沒有在第一行有鍵按下;其次,單片機將P11輸出低電平,其它P10、P12、P13仍爲高電平,此時再來讀取列線數據,發現列線讀到的數據有低電平,數值爲1011(0x0B),如果我們的鍵盤佈局已經確定,那麼0x0B就代表S5的值了。轉到S5鍵功能處理子程序就可以達到目的。
/*
功能:矩陣鍵盤掃面,按鍵顯示鍵值程序
作者:siriuszxn
*/
#include "reg51.h"
#define KEYPORT = P1
unsigned char i;
unsigned char Keynum;
unsigned char Line; //行
unsigned char Mask;
unsigned char Col; //列
unsigned char ScanCode;
unsigned char code psegs_table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽極數碼管0-F
void delay_ms(unsigned int t) //ms延時程序
{
unsigned char i;
unsigned int x;
x=t;
while(x--)
{
for(i=0;i<113;i++);
}
}
/* 鍵盤掃描程序 */
void keyscan()
{
while (1) //循環掃描鍵盤
{
P1 = 0xff; //開始
Line = 1;
Mask = 0x01;
for(i = 0; i < 4; i++)
{
P1 = ~Mask;
ScanCode = P1 & 0xf0;
if (ScanCode != 0xf0)
{
delay_ms(5);
}
ScanCode = P1 & 0xf0;
switch(ScanCode)
{
case 0xe0:Col=1;break;
case 0xd0:Col=2;break;
case 0xb0:Col=3;break;
case 0x70:Col=4;break;
default :Col=0;break;
}
if (Col > 0)
{
//根據行列計算鍵值
Keynum = (Line - 1) * 4 + Col;
//通過P0口接數碼管顯示
P0 = psegs_table[Keynum-1];
while(1)
{
ScanCode = P1 & 0xf0;
if(ScanCode == 0xf0)
{
break;
}
}
Mask <<= 1;
Line++;
}
}
}
}
void main()
{
while(1)
{
keyscan();
}
}
---------------------
作者:zxnsirius
來源:CSDN
原文:https://blog.csdn.net/zxnsirius/article/details/51088946
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!