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