提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、矩阵按键的原理及电路图分析
矩阵按键电路图:
(1).首先,按键检测为低电平时,说明按键被按下。
通过矩阵按键电路图可总结出:
S1按键对应管脚1和5,S5按键对应管脚2和5,
S9按键对应管脚3和5,S13按键对应管脚4和5.
这样,当我们给管脚5一个低电平,管脚1,2,3,4都为高电平时,检测S1,S5,S9,S13是否为低电平,低电平说明按键被按下。
同样的,我们可以按照这种方式去检测剩余按键。即当JP3管脚12345678分别对应电平为1111 0000时,设计程序检测按键是否被按下,每个按键按下都对应一个静态数码管的一个数值。(也就是说 引脚5为低电平时,去检测1,5,9,13按键是否为低电平。引脚6为低电平时,去检测2,6,9,14按键是否为低电平。引脚7为低电平时,去检测3,7,11,15按键是否为电平。引脚8为低电平时,去检测4,8,12,16按键是否为低电平。低电平说明按键按下,可以看作是16个按键,依次设计程序检测按键)
二、程序设计
1.
代码如下(示例):
/********************** 矩阵按键 ******************/
#include "reg51.h"
// 定义宏KEY_GIO\SMG_JT
#define KEY_GIO P0
#define SMG_JT P2
// 定义别名变量unsigned char和unsigned int类型u8和u16
typedef unsigned char u8;
typedef unsigned int u16;
// 定义静态数码管数组显示1-0 1-6
u8 SMG_JT_SZ[16] = {0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08, 0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40};
// 定义延时函数
void Delay_10us(u16 t)
{
while(t--);
}
// 矩阵按键扫描函数
u8 Key_GIO_HANSHU (void)
{
u8 Display_Key_Values = 0; // 定义显示键值变量
while(1)
{
// 1111 0111 引脚赋值下检测按键(0111 0111/1011 0111/1101 0111/1110 0111四种情况)
KEY_GIO = 0xf7; //定义按键变量并且第一列赋值为0,用于检测判断s1是否按下
if(KEY_GIO != 0xf7) // 判断第一列是否按下
{
Delay_10us(1000);
if(KEY_GIO != 0xf0)
{
switch(KEY_GIO)
{
case 0x77: Display_Key_Values = 1; break;
case 0xb7: Display_Key_Values = 5; break;
case 0xd7: Display_Key_Values = 9; break;
case 0xe7: Display_Key_Values = 13; break;
}
}
}
// 1111 1011 引脚赋值下检测按键(0111 1011/1011 1011/1101 1011/1110 1011四种情况)
KEY_GIO = 0xfb;
if(KEY_GIO != 0xfb)
{
Delay_10us(1000);
if(KEY_GIO != 0xfb)
{
switch(KEY_GIO)
{
case 0x7b: Display_Key_Values = 2; break;
case 0xbb: Display_Key_Values = 6; break;
case 0xdb: Display_Key_Values = 10; break;
case 0xeb: Display_Key_Values = 14; break;
}
}
}
// 1111 1101 引脚赋值下检测按键(0111 1101/1011 1101/1101 1101/1110 1101四种情况)
KEY_GIO = 0Xfd;
if(KEY_GIO != 0xfd)
{
Delay_10us(1000);
if(KEY_GIO != 0xfd)
{
switch(KEY_GIO)
{
case 0x7d: Display_Key_Values = 3; break;
case 0xbd: Display_Key_Values = 7; break;
case 0xdd: Display_Key_Values = 11; break;
case 0xed: Display_Key_Values = 15; break;
}
}
}
// 1111 1110 引脚赋值下检测按键(0111 1110/1011 1110/1101 1110/1110 1110四种情况)
KEY_GIO = 0xfe;
if(KEY_GIO != 0xfe)
{
Delay_10us(1000);
if(KEY_GIO != 0xfe)
{
switch(KEY_GIO)
{
case 0x7e: Display_Key_Values = 4; break;
case 0xbe: Display_Key_Values = 8; break;
case 0xde: Display_Key_Values = 12; break;
case 0xee: Display_Key_Values = 16; break;
}
}
}
return Display_Key_Values; // 返回Display_Key_Values的值向主调函数
}
}
// 主函数主程序
void main()
{
u8 Key = 0;
while(1)
{
Key = Key_GIO_HANSHU ();
if(Key != 0)
{
SMG_JT = SMG_JT_SZ[Key - 1];
}
}
}
总结
以上就是在矩阵按键学习过程中的内容,我觉得矩阵按键最主要的是看明白管脚对应的按键电路图,学会拆分矩阵按键和了解矩阵按键高低电平的原理,以及各按键低电平时的检测方式和出现的四种低电平情况。