蓝桥杯 — 矩阵按键

目录

 

1、矩阵按键原理图

2、矩阵按键实现的代码说明

3、矩阵按键具体实例

4、结论与体会


1、矩阵按键原理图

蓝桥杯 — 矩阵按键_第1张图片 矩阵按键原理图示

矩阵按键位置需要死记,首先这是4x4的矩阵按键,共16个按键,对于跳线帽J5要连接1和2。

第一行为P30、第二行尾P31、第三行为P32、第四行为P33;

第一列为P44(P37)、第二列为P42(P36)、第三列为P35、第四列为P34;对于列引脚说明,可以看转接板原理图如下:

蓝桥杯 — 矩阵按键_第2张图片 转接板部分原理图示

可以看出,P36引脚与P42相连,P44引脚与P37相连。

2、矩阵按键实现的代码说明

//定义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;
}

对于上述按键返回函数,自己看情况选择,有时实现其它按键功能时,并不需要这个按键函数,按键函数只是帮助大家更好的理解矩阵按键,对于按键的连接方式要死记。

3、矩阵按键具体实例

 如表所示为按键具体位置表(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<

4、结论与体会

矩阵按键其实和独立按键没有太大的差别,矩阵按键最重要的是原理图线的连接,只要掌握矩阵按键原理图,这部分都差不多了,另外要做到矩阵按键特定位置的定义,如上述代码部分,多加练习,问题不大。

你可能感兴趣的:(【蓝桥杯单片机组】)