【51单片机------矩阵按键学习总结】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

矩阵按键学习总结

  • 一、矩阵按键的原理及电路图分析
    • (1).**首先,按键检测为低电平时,说明按键被按下。**
  • 二、程序设计
    • 1.
  • 总结


一、矩阵按键的原理及电路图分析

矩阵按键电路图:
【51单片机------矩阵按键学习总结】_第1张图片

(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];
		}
	}	 
 }

总结

以上就是在矩阵按键学习过程中的内容,我觉得矩阵按键最主要的是看明白管脚对应的按键电路图,学会拆分矩阵按键和了解矩阵按键高低电平的原理,以及各按键低电平时的检测方式和出现的四种低电平情况

你可能感兴趣的:(矩阵按键,51单片机,矩阵,学习)