学蓝桥Chapter6:矩阵键盘KBD练习
前提条件
先将CT107D的J5键帽跳到KBD那边(或者拿一根导线短路kbd一端管脚和中间那跟管脚)
矩阵键盘接线图及简要介绍
r1——r4为行,矩阵键盘扫描第n行的时候,默认会将第n行置低电平(0),其它行置为高电平(1)
c1——c4为列,矩阵键盘扫描每一行的时候,我们通过默认将列置为高电平(1),这样当列变化出现低电平(0)的时候,就能锁定到行为低电平,列为低电平的具体位置。
- 例:我按下了第2行第2列的键盘,怎么判断这个键是否按下了呢?
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
//以上为行的位定义
sbit p34=P3^4;
sbit p35=P3^5;
sbit p42=P4^2;
sbit p44=P4^4
//以上为列的位定义
//只有进行了位定义才能使用Pn^m这样的指定引脚,不然会报错。
p30=0;//让行置为低电平
p31=p32=p33=1;
p34=p35=p42=p44=1
if(p42==0){
//通过这条判断语句就能判断第2行第2列的键盘是否被按下了
}
练习
矩阵键盘4x4,按从上到下从左到右的优先顺序,当按下任一位置的键盘时候,显示对应这个键盘的数字
#include <reg52.h>
sfr P4=0xc0;//由于reg52头文件没有P4地址,所以需要自己加上P4的I/O口地址,I/O口地址可以查具体MCU型号得到。当然了,也是可以直接使用STC15的头文件,这样就不用这条语句了。
sbit a=P2^5;
sbit b=P2^6;
sbit c=P2^7;
sbit r1 = P3^0;
sbit r2 = P3^1;
sbit r3 = P3^2;
sbit r4 = P3^3;
sbit c4=P3^4;
sbit c3=P3^5;
sbit c2=P4^2;
sbit c1=P4^4;
unsigned char code dx[]={0xc0,0xf9,0xa4,0xb0,0x99,0x12,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xc1};
void delay(unsigned int t){
while(t--);
}
void selecthc573(unsigned char channel){
switch(channel){
case 4:
c=1;b=0;a=0;
break;
case 5:
c=1;b=0;a=1;
break;
case 6:
c=1;b=1;a=0;
break;
case 7:
c=1;b=1;a=1;
break;
}
}
void buzzoff(){
selecthc573(5);
P0=0x00;
}
void showkey(unsigned char key){
selecthc573(6);
P0 = 0x01;
selecthc573(7);
P0= key;
} //数码管显示按下键盘后的数值
void scankey(){
r1=0;
r2=r3=r4=1; //r1——r4为行,矩阵键盘扫描第一行的时候,默认会将第一行置低电平,其它行为高电平
c1=c2=c3=c4=1; //c1——c4为列,矩阵键盘扫描每一行的时候,我们通过默认将列置为高电平,这样当列变化出现低电平的时候,就能锁定到行为低电平,列为低电平的具体位置。
if(c1==0){
delay(1000);
while(c1==0);
key(dx[0]);
}
else if(c2==0){
delay(1000);
while(c2==0);
key(dx[1]);
}
else if(c3==0){
delay(1000);
while(c3==0);
key(dx[2]);
}
else if(c4==0){
delay(1000);
while(c4==0);
key(dx[3]);
}
//
r2=0;
r1=r3=r4=1;
c1=c2=c3=c4=1;
if(c1==0){
delay(1000);
while(c1==0);
key(dx[4]);
}
else if(c2==0){
delay(1000);
while(c2==0);
key(dx[5]);
}
else if(c3==0){
delay(1000);
while(c3==0);
key(dx[6]);
}
else if(c4==0){
delay(1000);
while(c4==0);
key(dx[7]);
}
//
r3=0;
r2=r1=r4=1;
c1=c2=c3=c4=1;
if(c1==0){
delay(1000);
while(c1==0);
key(dx[8]);
}
else if(c2==0){
delay(1000);
while(c2==0);
key(dx[9]);
}
else if(c3==0){
delay(1000);
while(c3==0);
key(dx[10]);
}
else if(c4==0){
delay(1000);
while(c4==0);
key(dx[11]);
}
//
r4=0;
r2=r3=r1=1;
c1=c2=c3=c4=1;
if(c1==0){
delay(1000);
while(c1==0);
key(dx[12]);
}
else if(c2==0){
delay(1000);
while(c2==0);
key(dx[13]);
}
else if(c3==0){
delay(1000);
while(c3==0);
key(dx[14]);
}
else if(c4==0){
delay(1000);
while(c4==0);
key(dx[15]);
}
}
void main(){
while(1){
scankey();
}
}