矩阵键盘检测原理
P0 = 1111 1110;
temp = p0;
当按键0按下去时
temp口此时的值为 1110 1110;
我们检测如果此时temp的值不等于 1111 1110,说明有按键按下去了
咋检测此时temp的值,
若temp 为 1110 1110,说明按键0按下去了
若temp 为 1101 1110,说明按键0按下去了
…
举例
当按下0时,数码管全部显示0,
当按下1时,数码管全部显示1;
…
当按下F时,数码管全部显示F;
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long int
sbit LE_D = P2^6;
sbit LE_W = P2^7;
uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98,//[0-9]
0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; //[a-f 全灭]
uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20}; //[1-6]
uchar num = 16; //默认啥都没显示
uint temp;
//单排按键扫描函数,返回案件位置数
uchar keyScan(uchar n,uchar a,uchar b,uchar c,uchar d);
//全键盘扫描函数,返回按键位置数
uchar keyS();
//延时函数
void delay(uint timeY);
void main(){
//打开所有的位
LE_W = 1;
P0 = 0xFF;
LE_W = 0;
while(1){
LE_D = 1;
P0 = table_D[keyS()];//把扫描到的按键位数显示出
LE_D = 0;
}
}
uchar keyS(){
num =keyScan(0xFE,0,1,2,3); //扫描第一排按键
num =keyScan(0xFD,4,5,6,7); //扫描第二排按键
num =keyScan(0xFB,8,9,10,11); //扫描第三排按键
num =keyScan(0xF7,12,13,14,15); //扫描第四排按键
return num;
}
uchar keyScan(uchar n,uchar a,uchar b,uchar c,uchar d){
P3 = n; //先给P3赋值,决定扫描第几排按键
temp = P3; //若P3 = 1111 1110,就是扫描第一排
temp = temp & 0xF0; //此时temp = 11110000
//检查是否有按键按下去了
if(temp != 0xF0){ //若第一个按键按下去,则P3 = 11101110 此时temp = 1110000 != 0xf0;
delay(5); //延时是防止按下时按键抖动
temp = P3; //延时后重新赋值
temp = temp & 0xF0;
if(temp != 0xF0){ //5ms后还相等说明确实按下去了
switch(temp){
case 0xE0: num = a; break; //1110 1110
case 0xD0: num = b; break; //1101 1110
case 0xB0: num = c; break; //1011 1110
case 0x70: num = d; break; //0111 1110
}
}
//当有按键按下去了,我们让程序停,松开按键后才能变化数字
/* while(temp != 0xF0){
temp = P3;
temp = temp & 0xF0;
}*/
return num;
} else {
return num;
}
}
void delay(uint timeY){ //每次延时1ms
uint y;
uint z;
for(z = timeY; z > 0; z--){
for(y = 115; y > 0; y--){}
}
}