51单片机 矩阵键盘与独立键盘综合应用
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code leddate[]={
0X3f,//0
0X06,//1
0X5B,//2
0X4f,//3
0X66,//4
0X6d,//5
0X7d,//6
0X07,//7
0X7f,//8
0X6f, //9
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71 //"F"
};
sbit wei=P2^7;
sbit duan=P2^6;
sbit s2=P3^0;
sbit s3=P3^1;
sbit s4=P3^2;
sbit s5=P3^3;
uchar jz_hang =0;
uchar jz_lie=0;
void delay(uchar z){
uchar x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--)
_nop_();
}
//矩阵键盘扫描
void JZ(){
//列行扫描
P3=0Xf0;
if((P3 & 0Xf0) != 0Xf0){
delay(5);
if((P3 & 0Xf0) != 0Xf0){
jz_lie = P3 & 0Xf0; //获取列值
P3 = 0X0f; //重新赋值给P3,此时按钮依然为闭合状态的
jz_hang = P3 & 0X0f; //获取行值
while((P3 & 0X0f) != 0X0f);
}
}
}
//独立键盘扫描
void duli(){
P3=0Xff;
if(s2 == 0){
delay(5);
if(s2 == 0){
jz_lie=0X0e;
jz_hang=0Xf0;
while(!s2);
}
}
if(s3 == 0){
delay(5);
if(s3 == 0){
jz_lie=0X0d;
jz_hang=0Xf0;
while(!s3);
}
}
if(s4 == 0){
delay(5);
if(s4 == 0){
jz_lie=0X0b;
jz_hang=0Xf0;
while(!s4);
}
}
if(s5 == 0){
delay(5);
if(s5 == 0){
jz_lie=0X07;
jz_hang=0Xf0;
while(!s5);
}
}
}
void display(){
switch(jz_hang + jz_lie){
//第一行
case 0Xee: P0=leddate[0]; break;
case 0Xde: P0=leddate[1]; break;
case 0Xbe: P0=leddate[2]; break;
case 0X7e: P0=leddate[3]; break;
//第二行
case 0Xed: P0=leddate[4]; break;
case 0Xdd: P0=leddate[5]; break;
case 0Xbd: P0=leddate[6]; break;
case 0X7d: P0=leddate[7]; break;
//第三行
case 0Xeb: P0=leddate[8]; break;
case 0Xdb: P0=leddate[9]; break;
case 0Xbb: P0=leddate[10]; break;
case 0X7b: P0=leddate[11]; break;
//第四行
case 0Xe7: P0=leddate[12]; break;
case 0Xd7: P0=leddate[13]; break;
case 0Xb7: P0=leddate[14]; break;
case 0X77: P0=leddate[15]; break;
//独立键盘
case 0Xfe: P0=leddate[1]; break;
case 0Xfd: P0=leddate[2]; break;
case 0Xfb: P0=leddate[3]; break;
case 0Xf7: P0=leddate[4]; break;
default: P0=0X40; break;
}
}
void main(){
wei=1;
P0=0X00;
wei=0;
duan=1;
while(1){
duli();
JZ();
display();
}
}