1.要求:
按下4x4矩阵按键,共阳数码管显示按键代表的数字。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2.proteus电路
2.理论:
将P3口低四位做行线,高四位做列线。先给P3口为0x0F。
<1>.判断按钮是否按下。
一直判断P3口等不等于0x0F,若不等于,则有按钮按下。
<2>.找出哪个按钮被按下。
本来低四位是 0000 ,现在给 1000,如果是第一行的按钮被按下,那么再判断c1,c2,c3,c4哪个等于 1,找出即为被按下的那个。然后第二行,第三行循环此操作。
3.代码
#include<reg51.h>
sbit c1 = P3^4;
sbit c2 = P3^5;
sbit c3 = P3^6;
sbit c4 = P3^7;
sbit wei1 = P2^0;
sbit wei2 = P2^1;
unsigned char code duan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9
void delay(unsigned char i){
unsigned char j=124;
while(i--){
while(j--) ;
}
}
void printf(unsigned char num){
P0 = duan[num%10];
wei1 = 0;
wei2 = 1;
delay(1);
P0 = 0xff;
P0 = duan[num/10];
wei1 = 1;
wei2 = 0;
delay(1);
P0 = 0xff;
}
int checkBut(){
unsigned char i,temp;
P3 = 0xfe;
for(i=0;i<4;i++){
//第一行
//r1 = 1;r2 = 0;r3 = 0; r4 = 0;
//temp = ~(P3 & 0xfe) & 0x0f;
if(c1 == 0){
temp = 1+i*4; //第i行第一列被按下
break;
}
if(c2 == 0){
temp = 2+i*4; //第i行第二列被按下
break;
}
if(c3 == 0){
temp = 3+i*4; //第i行第三列被按下
break;
}
if(c4 == 0){
temp = 4+i*4; //第i行第四列被按下
break;
}
P3 = ((P3<<1) | 0x01);
}
return temp;
}
void main(){
unsigned char temp = 0,i;
P3 = 0xf0;
while(1){
if(P3 != 0xf0){
//delay(10); //消抖
if(P3 != 0xf0){
temp = checkBut();
P3 = 0xf0;
}
}else{
printf(temp);
}
}
}
4.结果