独立按键
首先我们看一下按键的原理图,如图1,当J5中的2,3接在一起的时候,红线标注就是一个完整的电路图,此时只有s4、s5、s6、s7按键可以使用,也就是独立按键。例如:当我们按下s4时,电路导通,P33引脚被拉为低电平0,此时我们读取P33引脚电平的高低就能判断出哪个按键被按下。其他按键也是如此。
消抖 :
消抖的方法包括:硬件消抖和软件消抖。硬件消抖主要是通过添加滤波电路消除抖动干扰。软件消抖则是延迟时间,当检测到按键状态发生变化时,延迟5~10ms的时间,让抖动消失后,再次检测按键的状态。我们在这里主要使用软件消抖。当我们按下按键时,整个过程的波形如下图2所示。所以,当我们检测到按键状态发生变化时,加一个10ms的延迟后,再次检测按键状态,如果与上次状态相同则说明按键被按下。
矩阵按键
如图3所示,J5中的1,2连接在一起就形成4X4的矩阵按键,这里我们设从下到上依次为Y1、Y2、Y3、Y4(行),从左到右依次为X1、X2、X3、X4(列),例如:想要扫描第一列时,只要使X1为低电平0,Y1、Y2、Y3、Y4为高电平1,此时如果没有按键按下,那么这个状态会一直保持。当S7按下的时候,由于X1为低电平0,S7按下电路导通,使得Y4也为低电平0。(这里我们就可以用代码判断:Y4的电平高低,当Y4为低电平时,说明S7按下)其他按键同理。
这里我们最好使用 #include "stc15f2k60s2.h" 而不是 #include "reg52.h" ,下图我们对比一下,reg52.h中有很多端口没有声明。而stc15f2k60s2.h中则比较全面。大家有兴趣也可以自己去头文件里看一下。
代码实现 :
如使用独立按键请将矩阵按键代码屏蔽,反之亦然。
独立按键S4的功能:按下时8个数码管全亮,松开时8个数码管全灭。文章来源:https://www.toymoban.com/news/detail-735592.html
矩阵按键S4、S8、S12、S16的功能:按下S4 L1 L2亮,按下S8L3 L4亮,按下S12 L5 L6亮,按下S16 L7 L8亮,松开熄灭。文章来源地址https://www.toymoban.com/news/detail-735592.html
#include "stc15f2k60s2.h"
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
//***********独立按键****************
sbit s7 = P3^0;
sbit s6 = P3^1;
sbit s5 = P3^2;
sbit s4 = P3^3;
//***********************************
//**********矩阵按键***************
//Y为行,X为列
sbit Y1=P3^3;
sbit Y2=P3^2;
sbit Y3=P3^1;
sbit Y4=P3^0;
sbit X1=P4^4;
sbit X2=P4^2;
sbit X3=P3^5;
sbit X4=P3^4;
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay_ms(int x)
{
while(x--)
{
Delay1ms();
}
}
/* 选择通道并且输入数据 */
void slect_138_573(unsigned char channel, unsigned char dat)
{
P0 = 0x00; /* 将原来P0口中的数据清0 */
P0 = dat; /* 这里用P0而不用其他端口是因为我们操作LED、数码管、继电器、蜂鸣器都是对P0进行操作 */
switch(channel) /* 选择通道 */
{
case 4: /* 使Y4输出低电平0,也就是操作LED */
P2 = (P2 & 0x1f) | 0x80;/* (P2 & 0x1f)就是将前3位清0,再操作前3位。将0x80转为2进制1000 0000,这里只看前3位100就是Y4 */
break;
case 5: /* 使Y5输出低电平0,也就是操作继电器和蜂鸣器 */
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6: /* 使Y6输出低电平0,也就是操作8个数码管 */
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7: /* 使Y7输出低电平0,也就是操作8个数码管中的1个数码管显示值 */
P2 = (P2 & 0x1f) | 0xe0;
break;
case 0: /* 关闭所有通道 */
P2 = (P2 & 0x1f) | 0x00;
break;
}
P2 = (P2 & 0x1f) | 0x00; /* 使用后,关闭所有通道 */
}
*****************************独立按键***********************
void anjian(void)
{
if(s4==0)
{
delay_ms(10);
if(s4==0)
{
slect_138_573(4, 0x00);
while(s4==0);
slect_138_573(4, 0xff);
}
}
}
********************************************************************
//******************************矩阵按键*********************************
//void anjian(void)
//{
// Y1=0;//扫描第一行
// Y2=Y3=Y4=1;
// X1=X2=X3=X4=1;
// if(X1==0) /* s4 */
// {
// delay_ms(10);
// if(X1==0)
// {
// slect_138_573(4, 0xfc);
// while(X1==0);
// slect_138_573(4, 0xff);
// }
// }
// else if(X2==0) /* s8 */
// {
// delay_ms(10);
// if(X2==0)
// {
// slect_138_573(4, 0xf3);
// while(X2==0);
// slect_138_573(4, 0xff);
// }
// }
// else if(X3==0) /* s12 */
// {
// delay_ms(10);
// if(X3==0)
// {
// slect_138_573(4, 0xcf);
// while(X3==0);
// slect_138_573(4, 0xff);
// }
// }
// else if(X4==0) /* s16 */
// {
// delay_ms(10);
// if(X4==0)
// {
// slect_138_573(4, 0x3f);
// while(X4==0);
// slect_138_573(4, 0xff);
// }
// }
//
//
//}
//***********************************************************************
void main(void)
{
slect_138_573(0,0x00);
slect_138_573(4,0xff);
slect_138_573(5,0x00);
slect_138_573(6,0xff);
slect_138_573(7,0xff);
while(1)
{
anjian();
}
}
到了这里,关于蓝桥杯单片机比赛学习:3、独立按键与矩阵按键的基本原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!