單片機STC89C52學習——13 矩陣按鍵
匯總:00 單片機STC89C52學習
參考教程:普中科技
1 工作原理
1.1 矩陣按鍵的由來
使用較少IO口沐兰,控制較多按鍵1.2 矩陣按鍵掃描原理
- 逐行掃描
通過高四位輪流輸出低電平來對矩陣鍵盤進行逐行掃描,當?shù)退奈唤邮盏降臄?shù)據(jù)不全為1的時候笆凌,說明有按鍵按下,然后通過接收到的數(shù)據(jù)是哪一位為0來判斷是哪一個按鍵被按下。 - 行列掃描(通常采用)
通過高四位全部輸出低電平圈暗,低四位輸出高電平康聂。當接收到的數(shù)據(jù)啡邑,低四位不全為高電平時产徊,說明有按鍵按下嫩海,則通過接收的數(shù)據(jù)值,判斷是哪一列有按鍵按下;然后反過來,高四位輸出高電平缎脾,低四位輸出低電平拔鹰,然后根據(jù)接收到的高四位的值判斷是哪一行有按鍵按下。這樣就能夠確定是哪一個按鍵按下了涣觉。
1.3 將矩陣按鍵變?yōu)楠毩存I
如將S1痴荐、S5、S9官册、S13變?yōu)楠毩存I:
P13輸出低電平生兆,相當于獨立按鍵的GND;控制P14~P17
2 程序:矩陣按鍵——LED后四位顯示按下的矩陣按鍵
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
#define GPIO_KEY P1// 矩陣鍵盤
// #define GPIO_DIG P0// 數(shù)碼管
#define GPIO_LED P2// LED燈
u8 keyValue = 0x00;// 全局變量
// u8 code LEDSeg[] = {0x3f , 0x06 , 0x5b , 0x4f ,
// 0x66 , 0x6d , 0x7d , 0x07 ,
// 0x7f , 0x6f , 0x77 , 0x7c ,
// 0x39 , 0x5e , 0x79 , 0x71};
void delay (u16 i)
{
while (i --);
}
void keyMat()// 行列掃描
{
u8 a = 0;// keil默認就是0
GPIO_KEY = 0x0f;// 高四位低電平膝宁,低四位高電平
if (GPIO_KEY != 0x0f)// 通過低四位判斷是否按下
{
delay (1000);// 消抖
if (GPIO_KEY != 0x0f)// 再次判斷
{
GPIO_KEY = 0x0f;// 保險起見鸦难,可以再賦一次值
// keyValue = keyValue | GPIO_KEY;// 記錄低四位...不能這樣記錄
switch (GPIO_KEY)
{
case 0x07:
keyValue = 0; break;
case 0x0b:
keyValue = 1; break;
case 0x0d:
keyValue = 2; break;
case 0x0e:
keyValue = 3; break;
}
GPIO_KEY = 0xf0;
// keyValue = keyValue | GPIO_KEY;// 記錄高四位...不能這樣記錄
switch (GPIO_KEY)
{
case 0x70:
keyValue = keyValue; break;
case 0xb0:
keyValue += 4; break;
case 0xd0:
keyValue += 8; break;
case 0xe0:
keyValue += 12; break;
}
while ((a < 50) && (GPIO_KEY != 0xf0))// 松開才繼續(xù),或者超時
{
delay(1000);
a ++;
}
}
}
}
void main()
{
// LSA = 0; LSB = 0; LSC = 0;
while (1)
{
keyMat();
GPIO_LED = ~keyValue;// 在LED上顯示
}
}
效果:按下矩陣按鍵后员淫,相應的LED燈亮