蓝桥杯电子类单片机组模块——矩阵键盘

首先呢,大家都知道:历年的蓝桥杯单片机组都会考到按键模块;对于国赛来说,考矩阵键盘的概率远远高于独立按键,所以必须将矩阵键盘的用法吃透来。

现在来给大家介绍矩阵键盘的使用方法(基于状态机)

1、使用矩阵键盘的思路和独立按键一致,下面给大家分享一下独立按键的使用方法:https://blog.csdn.net/qq_44629819/article/details/104486419

2、要使用矩阵键盘,那么开发板上的J5跳帽必须接到KBD(矩阵键盘)。

3、矩阵键盘相关原理图如下
在这里插入图片描述

  • 跳帽使得pin2和pin1相连接,这使得按键的两端各连接不同的单片机管脚。
  • 因此:我们可以通过单片机给按键的一端A赋值高电平,另一端B赋值低电平;当按键按下的时候,按键的端A会出现低电平,此时记录键值key1;我们可以通过单片机给按键的一端B赋值高电平,另一端A赋值低电平;当按键按下的时候,按键的端B会出现低电平,此时记录键值key2;通过或运算得到最后的键值代码:KEY。
  • 同时,我们应该用状态机进行按键状态的判断,结合定时器中断的使用对按键进行定时扫描。

4、如下,附上独立按键状态机代码块。

#include "STC15F2K60S2.h"
#define  u8 unsigned char

#define NO_KEY      0xff
#define KEY_STATE0  0 
#define KEY_STATE1  1
#define KEY_STATE2  2  

unsigned char Key_Scan()
{
	static unsigned char key_state=KEY_STATE0; 
	u8 key_value=0,key_temp;
	u8 key1,key2;

	P30=0;P31=0;P32=0;P33=0;P34=1;P35=1;P42=1;P44=1;
	if(P44==0)	key1=0x70;
	if(P42==0)	key1=0xb0;
	if(P35==0)	key1=0xd0;
	if(P34==0)	key1=0xe0;
	if((P34==1)&&(P35==1)&&(P42==1)&&(P44==1))	key1=0xf0;

	P30=1;P31=1;P32=1;P33=1;P34=0;P35=0;P42=0;P44=0;
	if(P30==0)	key2=0x0e;
	if(P31==0)	key2=0x0d;
	if(P32==0)	key2=0x0b;
	if(P33==0)	key2=0x07;
	if((P30==1)&&(P31==1)&&(P32==1)&&(P33==1))	key2=0x0f;
	key_temp=key1|key2;
 
	switch(key_state)                                
	{
		case KEY_STATE0:
			if(key_temp!=NO_KEY)
			{
				key_state=KEY_STATE1;               
			}
			break;

		case KEY_STATE1:
			if(key_temp==NO_KEY)
			{
				key_state=KEY_STATE0;
			}
			else
			{
				switch(key_temp)                             
				{
					case 0x77: key_value=4;break;
					case 0x7b: key_value=5;break;
					case 0x7d: key_value=6;break;
					case 0x7e: key_value=7;break;

					case 0xb7: key_value=8;break;
					case 0xbb: key_value=9;break;
					case 0xbd: key_value=10;break;
					case 0xbe: key_value=11;break;

					case 0xd7: key_value=12;break;
					case 0xdb: key_value=13;break;
					case 0xdd: key_value=14;break;
					case 0xde: key_value=15;break;

					case 0xe7: key_value=16;break;
					case 0xeb: key_value=17;break;
					case 0xed: key_value=18;break;
					case 0xee: key_value=19;break;	
				}
				key_state=KEY_STATE2;
			}
			break;
	 
		case KEY_STATE2:
			if(key_temp==NO_KEY)
			{
				key_state=KEY_STATE0;
			}
			break;
	}
	return key_value;
}

void Timer_Init(void)
{
	AUXR |= 0x80;	
	TMOD &= 0xF0;
	TL0 = 0xCD;		
	TH0 = 0xD4;		
	TF0 = 0;		
	TR0 = 1;		
	ET0 = 1;
	EA=1; 
}	

bit key_flag;
void main(void)
{
	u8 key_val=NO_KEY;
	P2=0xa0;P0=0x00;P2=0x00; // close buzzer and relay
	P2=0x80;P0=~0x00;P2=0x00; // close led
	Timer_Init(); //1ms 

			while(1)
			{
				if(key_flag) 	//10ms
				{
					key_flag=0;
					key_val=Key_Scan();
						switch(key_val)                       
						{                                              
							case 4:	break;//任务4
							case 5:  break;//任务5
							case 6:  break;//任务6
							case 7:  break;//任务7
							
							case 8:  break;//任务8
							case 9:  break;//任务9
							case 10: break;//任务10
							case 11: break;//任务11
					
							case 12: break;//任务12
							case 13: break;//任务13
							case 14: break;//任务14
							case 15: break;//任务15
							
							case 16: break;//任务16
							case 17: break;//任务17
							case 18: break;//任务18
							case 19: break;//任务19
						}			 
				}
		}


}


void timer0() interrupt 1  using 1                   
{
	static int key_count=0;
	key_count++;
	if(key_count==10)			//10ms
	{
		key_count=0;
		key_flag=1;
	}

}

5、这只是矩阵键盘最基本的操作,关于按键的按下与松开以及长按与短按的内容,大家可以参考以下关于独立按键实现的blog。

祝大家在蓝桥杯比赛中获得优异的成绩!
——南昌大学 电子183刘昊

发布了6 篇原创文章 · 获赞 7 · 访问量 517

猜你喜欢

转载自blog.csdn.net/qq_44629819/article/details/104515908