一、矩阵按键原理

矩阵按键是一种节省I/O口的按键设计方式,通过行列扫描实现多按键检测。常见布局为4x4或4x3,将按键排列成矩阵形式,行和列分别连接到单片机的I/O口。

工作原理:如果行和列都为低电平,表示按键按下

  1. 行列扫描法

  • 逐行输出低电平,其余行高电平,读取列线状态。若某列线为低电平,表示该行该列交叉点的按键被按下。

  • 按键机械触点会导致信号抖动,需通过软件延时(通常5-20ms)或硬件滤波消除。

注意:蓝桥杯板子上J5跳线帽用于选择矩阵按键还是独立按键,如果是独立按键,判断端口是否为低电平即可

二、矩阵按键代码实现
#include <STC15F2K60S2.H>
#include <intrins.h>
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 delay(unsigned int x)
{
    while(x--);
}
// 矩阵键盘扫描S4 S5 S8 S9是否按下,按下返回键值
int ScanKeysMulti() 
{
    
    // S4: R4行 C1列
    R4=0; R1=R2=R3=1; C1=C2=C3=1;
    if(C1==0)
    {
        while(C1==0); // 等待释放
        return 4;
    }
    
    // S5: R3行 C1列
    R3=0; R1=R2=R4=1; C1=C2=C3=1;
    if(C1==0)
    {
        while(C1==0);
        return 5;
    }
    
    // S8:R4行 C2列
    R4=0; R1=R2=R3=1; C1=C2=C3=1;
    if(C2==0)
    {
        while(C2==0);
        return 8;
    }
    
    // S9: R3行 C2列
    R3=0; R1=R2=R4=1; C1=C2=C3=1;
    if(C2==0)
    {
        while(C2==0) ;
        return 9;
    }
}
void main()
{   
    int key = 0;
    while(1){
        key = ScanKeysMulti();
        delay(1000);//10ms扫描一次键值
    }
}

当前使用轮询方式扫描键值,定时器章节中再使用定时扫描

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐