蓝桥杯单片机开发

蓝桥杯单片机矩阵键盘

  • 于7月5日参加了学校举办的蓝桥杯单片机开发组比赛,这次的比赛非比寻常,不仅仅是推迟了三个月,因为疫情的原因,而且也不像往年一样需要到昆工的考场,这次直接在本校举行,有些学校只有一个人比赛的,当然氛围也是不错的,从早上9:00开始到下午14:00,时间是5个小时,中途还有学校提供的充饥食物,一袋牛奶和巧克力,总体来说,办得还不错。但是,我还是要说,对于这次的比赛,还是失利了,非常的伤心,可能损失了几百块,最重要的是题目不算太难,他考察的都比较简单,而且知识点也都复习到了,但是可能也是抱佛脚的缘故,结果就在矩阵键盘和中断处理上翻车了。这也提醒我们,不要抱有侥幸心理,练题必须练到面面俱到,不要盲目的去背源代码,那个可能是徒劳的,一定要理解着使用。
    好了不吹牛了,下面我就来自己总结一下矩阵键盘(细节决定成败呀,就是因为一个符号||写成了&&!),先看原理图: 在这里插入图片描述
    从图中我们可以看出,矩阵键盘是接在P3口的,按行是从P3.0-P3.4,列是从P3.5-P3.7,但是需要注意的是P3.6、P3.7分别接到了P4.2、P4.4,这个就比较坑了,我要也是在这里翻了车。下面看代码:
uchar_8 Key_Scan()
{
	uchar_8 Temp_C,Temp_R;
	Key_Value =0xF0; P44 =P42 =1;
	if(((Key_Value & 0xF0) !=0xF0) || ((P44 & P42) !=1))
	{
		Delay(10); //10ms
		if(((Key_Value & 0xF0) !=0xF0) || ((P44 & P42) !=1))
		{
			if(!P44)
			{
				Temp_C = Key_Value & 0x70;
			}
			else if(!P42)
			{
				Temp_C =Key_Value & 0xB0;
			}
			else 
				Temp_C =Key_Value & 0xF0;
			
			Key_Value =0x0F; P44 =P42 =0;
			Temp_R =Key_Value & 0x0F;
			while((Key_Value &0x0F) !=0x0F);
			return (Temp_C | Temp_R);
		}
	}
	return 0xFF;
}

uchar_8 Mtx_Key()
{
	switch(Key_Scan())//调用键盘反转扫描函数
	{
		case 0x7E: return 0; break; //1
		case 0xBE: return 1; break;
		case 0xDE: return 2; break;
		case 0xEE: return 3; break;
		case 0x7D: return 4; break; //2
		case 0xBD: return 5; break;
		case 0xDD: return 6; break;
		case 0xED: return 7; break;
		case 0x7B: return 8; break; //3
		case 0xBB: return 9; break;
		case 0xDB: return 10; break;
		case 0xEB: return 11; break;
		case 0x77: return 12; break; //4
		case 0xB7: return 13; break;
		case 0xD7: return 14; break;
		case 0xE7: return 15; break;
		default:  break;
	}
	return 0xFF;
}
  • 这个驱动程序可以看出,采用了反转扫描方式,这种方式代码量比较少,但是不太好理解。
    下面我们分析一下原理,其实也比较简单的,先给P3口低四位拉低,然后读出列值,在拉低高四位,读出行值,最后和起来就是当前键值了。
    这个就是矩阵键盘了,简单把,可是,我的两个多小时就花费在这个上了,就是if条件判断的第二条,太难受了,好了,不说了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值