前面提到了独立键。可以看出,独立键与矩阵键盘是分开的。接下来,我将看4 * 4矩阵键盘。这里使用的是上一节中使用的一种,它是延迟的反跳检测。
首先附上矩阵键盘的:

使用数据矩阵键盘时,J5接头连接器上的跳线连接引脚1和2,以便将所有键的有效端口连接到I / O端口。

具体的扫描方法是:
首先,将不同的级别分配给P3 ^ 0〜P3 ^ 7的高四位和第四位。当确定按下了一个键时,检查按下了哪一行或哪一列(原始的高电平的四位之一将变为低电平),然后将高四位和第四位分配给相反的水平从以前的时间开始。再次检查以找到您按下的按钮。
示例是:将16个键S4〜S19从上到下,从左到右分别设置为1到16的不同键值。按下S4时,数码管显示1;否则,显示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之间的区别是:前者没有这两个I / O端口P3 ^ 6和P3 ^ 7,它们分别被P4 ^ 2和P4 ^ 4取代。有关详细信息,请参阅STC15F2K61S2芯片手册(其他区别大致是:它比51单片机运行更快,并且可以选择是否分频;它的中断方式比51多,有些/ O端口还有其他功能,等等。)

这里有几件事要注意:
1、编程时,main函数执行的数据处理和其他操作尽可能少,并且main函数主要用于调用其他函数。
2、如果使用的是STC15F2K61S2单片机,则需要在对P3端口的两个分配以及高四位的电平检测阶段中分别列出P4 ^ 2和P4 ^ 4,其他6 P3引脚的I / O端口一起测试,在使用P4 ^ 2和P4 ^ 4之前,有必要定义sbit位并寻址P4引脚(srf P4 = 0xC 0)。
3、 P3端口的第二个分配也应包括在第一个if语句中,因为仅在确认按下后才开始行和列扫描。行和列扫描是针对一个的。密钥被扫描,因此无法分开。
待续...
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-357429-1.html
穿白毛衣太棒
因为质检总局抢不到小米哈哈