模块化编程
在之前的文章中,我们建立工程的时候都是添加一个main.c文件
一般来说main.c里面主要是编写主程序执行的文件,我们可以将其他函数写在另其他文件中,将其封装成一个功能
例如我们要封装一个专门用来延时的文件,可以这样做
然后我们再讲数码管的功能封装
再回到main.c中
这样main.c中看起来就很简洁,想使用功能时就可以直接使用封装好的功能。
矩阵键盘
在A7中矩阵键盘的原理图是这样的
将A7的矩阵键盘接线到P1端口组,就和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(矩阵键盘)的封装
测试矩阵键盘功能:如果S5被按下则LED被熄灭;S6被按下则LED被点亮。