迷惑的单片机矩阵按键

        在我们学习单片机的过程中,矩阵按键是必不可少的模块,接下来就让小编带你走进单片机矩阵按键吧!

一、矩阵按键的扫描

        矩阵按键是由十六个按键组成,我们在判断矩阵按键的位置时,我们既用到了状态机,也使用了行列扫描法。话不多说,下面先让我们看看矩阵按键的构成吧!

        在状态机中,我们设置了四个状态,即未按按键状态、按键按下状态、按键弹起转态、屏蔽状态;我们使用的行列扫描法,其实就是根据行与列的位置来确定唯一的矩阵按键位置。

二、设计实现

1.定义使用的全局变量:

#define kbd_io P3
#define state_0 0	  //是否按下
#define state_1 1 	  //是否是抖动
#define state_2 2	  //判断是否弹起
#define kbd_maskrow 0x0f	  //屏蔽不需要的IO
 
unsigned int key_num=16;

2.具体的实现函数: 

void scankbd()
{
	static char kbd_state = 0;//用来判断处于那个状态
	unsigned char kbd_press;
	char row;
	switch(kbd_state){
		case state_0:  //是否按下  
			kbd_io=0x0f; P42=0; P44=0;
			kbd_press =kbd_io;   
			if(kbd_press != kbd_maskrow)
				kbd_state = state_1;
			//break;
		case state_1:   //是否是抖动   kbd_io-P3
			kbd_press =kbd_io;
			if(kbd_press != kbd_maskrow)
			{
				if((kbd_io&0x08)==0)  row=0;                      //P30列
				if((kbd_io&0x04)==0)  row=1;                      //P31列
				if((kbd_io&0x02)==0)  row=2;                      //P32列
				if((kbd_io&0x01)==0)  row=3;                      //P33列
				kbd_io=0xf0; P42=1;P44=1; 
				if(P44==0) key_num=row;                           //p44行
				if(P42==0) key_num=row+4;                         //p42行
				if((kbd_io&0x20)==0) key_num=row+8;               //P35行
				if((kbd_io&0x10)==0) key_num=row+12;              //p34行		
				kbd_state = state_2;
			}
			else
				kbd_state = state_0;
			break;
		case state_2:   //判断是否弹起
			kbd_io=0x0f; P42=0; P44=0;
			kbd_press =kbd_io;
			if(kbd_press == 0x0f)	kbd_state = state_0;
			break; 
		default:        //屏蔽不需要的IO
			break;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值