模块化编程

在之前的文章中,我们建立工程的时候都是添加一个main.c文件

一般来说main.c里面主要是编写主程序执行的文件,我们可以将其他函数写在另其他文件中,将其封装成一个功能

例如我们要封装一个专门用来延时的文件,可以这样做
添加Delay.c文件
添加Delay.h文件


然后我们再讲数码管的功能封装


再回到main.c中

这样main.c中看起来就很简洁,想使用功能时就可以直接使用封装好的功能。

矩阵键盘

在A7中矩阵键盘的原理图是这样的
A7原理图
将A7的矩阵键盘接线到P1端口组,就和A2一样的了。
A2原理图
可以看到,共有16个按键,每个按键都连接这两个IO口。

可以观察到,前四个IO口连接着这个矩阵键盘的行;后四个IO口连接着矩阵键盘的列

我们可以使用列扫描法。

先将P1端口组全部置成1(P1 = 0xFF)

再将P1_3置成0(P1_3 = 0)

这样如果有第一列的按键被按下,那么就会有第二个IO口被置成0。

以S5被按下为例

刚开始P1端口组的状态是1111 0111

当S1被按下时,没有任何变化

当S5被按下时,由于S5两端的的状态是1和0(P1_6 = 1,P1_3 = 0),有电势差,所以有电流通过

P1_3 相当于地,当P1_6接上P1_3时,相当于P1_6接地了,P1_6的电压也就直接被拉低变成0了。

即在扫描第一列时,检测到P1_6 == 0,则S5被按下

    unsigned char MatrixKey()
{
    unsigned char KeyNumber=0;
    
    P1=0xFF;
    P1_3=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
    

    return KeyNumber;
}

其中,while是为了检测松手,如果按下没有松手,则程序会一直卡死在while中不会检测到按键被按下

第一个Delay是为了消抖,当按键被按下时,短时间内按键的电平不稳定,需要延时20ms以防止误判

第二个Delay也是为了消抖,防止按键松开时的电平不稳定

通过相同的方式去检测其他列,就可以完成对整个矩阵键盘的扫描了。

unsigned char MatrixKey()
{
    unsigned char KeyNumber=0;
    
    P1=0xFF;
    P1_3=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
    
    P1=0xFF;
    P1_2=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
    
    P1=0xFF;
    P1_1=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
    
    P1=0xFF;
    P1_0=0;
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
    if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
    if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
    if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
    
    return KeyNumber;
}

打开Keil5新建project,完成对Delay的封装和对MatrixKey(矩阵键盘)的封装

矩阵键盘的.h文件
矩阵键盘的.c

main.c测试程序

测试矩阵键盘功能:如果S5被按下则LED被熄灭;S6被按下则LED被点亮。

最后修改:2025 年 01 月 09 日