前面提到了独立按键,可见,独立按键是由矩阵键盘别离而来的。接下来看的是 4*4 的矩阵键盘,这儿运用的仍是上节所运用的,延时消抖检测。
先附上矩阵键盘的原理图:
详细的扫描方法为:
先把P3^0~P3^7高四位和第四位赋不一样的电平值,当确认有键按下时,检测按下的是哪一行或哪一列(本来高电平的四位中有一位会变低电平),再将高四位和第四位赋与上一次相反的电平。再检测,即可找到所按下的按键。
实例为:把S4~S19 这16个按键,从上到下、从左至右,别离设置为1~16不同的键值,当S4按下时,数码管显现为 1;当S19按下时,数码管显现为16。
其中心代码如下(数码管段码,显现函数等变量的界说,请参照前面给出的数码管的博文):
uchar temp; //用于存储 P3 口的状况
uchar key_value = 0; //键值的界说
void matrixKeyScan()
{
P3 = 0x0f; //设置P3高四位为0,第四位为1
temp = P3; //用一个变量存储P3口的状况,避免外界影响P3口,然后形成扫描有误
if(temp != 0x0f)
{
delay10ms();
if(temp!= 0x0f) //确认有键按下
{
switch(temp) //检查P3(temp)的状况
{
case 0x0e :key_value = 1; break; //按下的为榜首行
case 0x0d :key_value = 5; break;
case 0x0b :key_value = 9; break;
case 0x07 :key_value = 13;break; //按下的为第四行
}
}
P3 = 0xf0; //再将 P3 口从头赋值,高四位为1,第四位为0
temp = P3;
if(temp != 0xf0)
{
switch(temp)
{
case 0xe0 : key_value +=3 ; break; //按下的是第四列,键值key_value加3
case 0xd0 : key_value +=2 ; break;
case 0xb0 : key_value +=1 ; break;
case 0x70 : key_value +=0 ; break; //按下的是榜首列,键值key_value加0
}
}
while(P3 != 0xf0); //松手检测,由于最近的一次赋值是P3 = 0xf0
}
}
void main()
{
while(1)
{
matrixKeyScan(); //在主函数中调用矩阵键盘扫描函数
if(key_value > 9) //判别键值,并显现
{
dspbuf[1] = key_value%10;
dspbuf[0] = key_value/10;
}
else
{
dspbuf[0] = key_value;
dspbuf[1] = 10; //若键值小于10,则十位不显现,只显现个位,段码数组第10个为消影
}
display(); //数码管显现函数
}
}
注:在此咱们根据的是89C52单片机的按键扫描,可是关于蓝桥杯指定开发板渠道(CT107D)所用的单片机为STC15F2K61S2,它与STC89C52在矩阵键盘的差异的是:前者没有P3^6和P3^7这两个 I/O 口,他们别离用P4^2,P4^4替代,详细的能够就参照STC15F2K61S2芯片手册(其他的差异大致有:它的运转速度比51单片机快,作业时能够挑选是否分频;它的中止形式比51多,一些 I/O 口有其他功用等等……)。
这儿有几点需求留意:
1、在编程时,主函数尽可能少的进行一些数据处理等操作,主函数首要用来调用其他的函数。
2、若运用的是STC15F2K61S2单片机,则在给 P3 口的两次赋值和高四位的电平检测阶段,需求将P4^2,P4^4独自列出来,与其他6个P3引脚的 I/O 口一同检测,并且在运用P4^2,P4^4之前,需求进行sbit位界说,以及 P4 引脚的寻址(srf P4 = 0xC0)。
3、P3口的第2次赋值,应该也包括在榜首个 if 句子之中,由于只有当确认按下之后,才会开始行与列的扫描,行、列扫描是关于一次按键的扫描,所以不行分隔。