实验背景介绍
- 矩阵按键控制的应用场景
矩阵按键控制的广泛应用得益于其结构简单、占用空间小且能高效利用IO资源等优点。这种控制方式在提高设备操作便利性的同时,也确保了系统资源的合理利用。广泛应用于电子产品、工业控制系统、家用电器和汽车电子等领域。 - 实验的目的和意义
本实验以4*4矩阵键盘讲解工作原理和检测方法
技术概况
- 矩阵按键控制技术的基本原理是通过行线和列线的交叉连接来识别按键的输入。矩阵按键控制系统由行线和列线组成,形成一个矩阵结构。行线作为输入线,而列线作为输出线。每个按键位于行线和列线的交叉点上,通过检测行线和列线的电信号状态来确定按键的位置。
原理构成
开发板上16个按键组合成4行4列,第一行将4个按键的一端连接在一起组成行线,以此类推四行16个按键。
- 第一列将每个按键的另一端连接在一起组成列线,以此类推四列16个按键。一共有4行4列共8根线,控制16个按键。 将这8根线连接到单片机的8个I/O口上,程序扫描键盘检测16个按键。
检测原理
- 按键的检测:独立按键;按下是否为低电平,因为独立按键一段与低电平相连。
矩阵按键:
1.行列式扫描:先置位一列为低电平,其它几列全为高电平(可确定列数),然后轮流检测一次各行是否有低电平(可确定行数),用同样的方法轮流置位各列一次低电平,再轮流检测各行是否变为低电平,检测完所有的按键,可检测出按下的是哪一个键。
2.线翻转法:使行线全部为低再去判断列,如果哪一列IO口读到低电平,再将列设置低电平,去判断行(行输出低,判断列,列输出低,判断行)。
软件设计
软件设计主要分为三个部分,按键的检测,延时函数,以及主函数执行部分。程序中为了提高程序的可读性和可移植性巧妙地使用了宏定义和类型重定义。如下所示:
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
#define key_juzheng_PORT P1 //使用宏定义矩阵按键码口
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
#define key_juzheng_PORT P1将矩阵按键的端口定义为P1
typedef unsigned int u16和typedef unsigned char u8分别将无符号整数和无符号字符重新定义为u16和u8类型
具体设计步骤
- 矩阵键盘通过行列线来识别按下的按键的设备,通常有多个按键共享同一行或列线。在这个程序中,使用了P1端口(key_juzheng_PORT)来检测按键状态。
- key_juzheng_rank_scan函数用于扫描矩阵键盘的按键并返回按下的按键键值。首先,将key_value初始化为0。然后,依次检查每一行的按键状态。对于每一行,先将对应的P1端口设置为低电平,然后检查是否有按键被按下。如果有按键被按下,根据按键所在的行和列计算出按键的键值,并将其赋值给key_value。接着等待按键松开,然后继续检查下一行。最后,返回key_value作为按下的按键键值。
u8 key_juzheng_rank_scan()
{
u8 key_value =0;
key_juzheng_PORT=0XF7; //使p13低电平,则可以根据哪一行为低电平来判断是否按下
if(key_juzheng_PORT!=0XF7) //当有按键按下
{
delay_10us(1000); //按键消除抖动
switch(key_juzheng_PORT)
{
case 0X77: key_value = 1; break;
case 0XB7: key_value = 5; break;
case 0XD7: key_value = 9; break;
case 0XE7: key_value = 13; break;
}
while(key_juzheng_PORT!=0XF7); //等待按键松开
}
3.定义了一个名为gsmg_code的数组,它包含了16个按键对应的数码管段码。
4.在主函数部分需要定义一个变量来存储扫描得到的键值。
void main()
{
u8 key =0; //定义变量保存键值
while(1)
{
key=key_juzheng_rank_scan(); //将扫描出来的键值赋值给变量key
/****控制数码管操作****/
if(key!=0);
SMG_A_DP_PORT=gsmg_code[key-1]; //将段码数据发送给端口
delay_10us(50000);
}
}
5.循环内部,调用key_juzheng_rank_scan()函数扫描矩阵键盘的按键,并将返回的键值赋给key变量。