目录
1、矩阵按键原理图
2、矩阵按键实现的代码说明
3、矩阵按键具体实例
4、结论与体会
矩阵按键位置需要死记,首先这是4x4的矩阵按键,共16个按键,对于跳线帽J5要连接1和2。
第一行为P30、第二行尾P31、第三行为P32、第四行为P33;
第一列为P44(P37)、第二列为P42(P36)、第三列为P35、第四列为P34;对于列引脚说明,可以看转接板原理图如下:
可以看出,P36引脚与P42相连,P44引脚与P37相连。
//定义r为行,c为列,如果r1=0,c1=0,按键则为第一行第一列,其余同理;
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;
//矩阵按键返回函数
unsigned char key_scan(){
unsigned char key_value;
r1=0;r2=r3=r4=1;
c1=c2=c3=c4=1;
if(!c1) key_value=0;
else if(!c2) key_value=1;
else if(!c3) key_value=2;
else if(!c4) key_value=3;
r2=0;r1=r3=r4=1;
c1=c2=c3=c4=1;
if(!c1) key_value=4;
else if(!c2) key_value=5;
else if(!c3) key_value=6;
else if(!c4) key_value=7;
r3=0;r1=r2=r4=1;
c1=c2=c3=c4=1;
if(!c1) key_value=8;
else if(!c2) key_value=9;
else if(!c3) key_value=10;
else if(!c4) key_value=11;
r4=0;r2=r3=r1=1;
c1=c2=c3=c4=1;
if(!c1) key_value=12;
else if(!c2) key_value=13;
else if(!c3) key_value=14;
else if(!c4) key_value=15;
return key_value;
}
对于上述按键返回函数,自己看情况选择,有时实现其它按键功能时,并不需要这个按键函数,按键函数只是帮助大家更好的理解矩阵按键,对于按键的连接方式要死记。
如表所示为按键具体位置表(4X4):如S13为(3行X3列)、S16为(4行X4列)等。
S7 | S11 | S15 | S19 |
S6 | S10 | S14 | S18 |
S5 | S9 | S13 | S17 |
S4 | S8 | S12 | S16 |
3.1 按键S13控制LED1,S16控制LED8
首先找到S13为3行3列,S16为4行4列,知道这些后在进行具体编程:
#include
//定义行和列
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;
void main(){
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
while(1){
r3=0;r1=r2=r4=1;
c1=c2=c3=c4=1;
if(!c3) P00=0;
r4=0;r1=r2=r3=1;
c1=c2=c3=c4=1;
if(!c4) P07=0;
}
}
3.2 按键S14控制流水灯依次左移,S15控制流水灯依次右移
首先找到S14为2行3列,S15为1行3列,最后编程如下:
#include
//定义行r和列c
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;
unsigned int i,j;
void delay();
void main(){
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
while(1){
r2=0;r1=r3=r4=1;
c1=c2=c3=c4=1;
if(!c3){
for(i=0;i<8;i++){
P0=~(0X80>>i);
delay();
}
}
r1=0;r2=r3=r4=1;
c1=c2=c3=c4=1;
if(!c3){
for(j=0;j<8;j++){
P0=~(0X01<
3.3 按键S8控制流水灯依次右移,按键S12控制数码管DS1第一个位置依次显示0到9
首先按键S8为4行2列,按键S12为4行3列,编程如下:
#include
//定义行r和列c
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
sbit c1=P4^4;
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;
unsigned int i,j;
void delay();
unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XFF};
void main(){
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化,关闭继电器、蜂鸣器
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //初始化,选择DS1第一个位置
while(1){
r4=0;r1=r2=r3=1;
c1=c2=c3=c4=1;
if(!c2){
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化,关闭继电器、蜂鸣器
for(i=0;i<9;i++){
P0=~(0X01<
矩阵按键其实和独立按键没有太大的差别,矩阵按键最重要的是原理图线的连接,只要掌握矩阵按键原理图,这部分都差不多了,另外要做到矩阵按键特定位置的定义,如上述代码部分,多加练习,问题不大。