今天是第二天,进行51单片机按键控制
1.单片机核心图和独立按键图
单片机核心图
独立按键模块
上电时P3口默认是高电平,只有按下按键时才变成了低电平,可以发现这个电平转换
2.独立按键控制LED灯亮灭
【1】按键抖动
实现这个功能非常简单,我们可以通过对具体的一个灯和具体的一个按键进行控制,此时我们只需要对一个端口值进行控制,但是按键是金属按键,会出现按键抖动的现象
按键抖动(Key Bouncing)是指当一个按键被按下或释放时,由于机械接触的不稳定性,会产生多个信号,而不是单一的、清晰的信号。这种现象常见于机械开关中,特别是在老化或低质量的按键中更为常见。
当按键被按下时,理想情况下应该只产生一个电信号。然而,在实际中,接触点可能会快速地接触和断开多次,导致多个电信号被发送。这些多余的信号可能会被电路或计算机系统误解为多次按键操作,从而引起错误。
常见的按键消抖有很多种,我们这里采取延时函数来进行消抖
【2】代码实现
下面直接给出代码,这里不多赘述,通过代码去理解是最直观的方法
#include<REGX52.H>
#include<INTRINS.H>
void Delay(unsigned int x) //1ms的延时函数
{
unsigned char data i, j;
while(x)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
x--;
}
}
void main()
{
while(1)
{
if(P3_1==0)//按下按键
{
Delay(20);//消抖
while(P3_1==0);
Delay(20);
P2_0=~P2_0;//对P2_0取反,不亮变成亮
}
}
}
从而实现了按一下按键,LED亮,再按一下,LED灭
3.按键控制LED灯实现二进制
这个地方超级简单:
P2口上电时默认都是高电平,1111 1111,我们只需要每次让P2减一,就完成了二进制的转换,那我们只需要在原有代码情况下加一个P2--就行了;
#include<REGX52.H>
#include<INTRINS.H>
void Delay(unsigned int x)
{
unsigned char data i, j;
while(x)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
x--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
P2--;//P2上电后默认高电平1111 1111
}
}
}
4.按键控制
我们想要实现一个功能,按按键1LED灯右移,按按键2LED灯右移,该如何实现?
这要用到按位左移和按位右移,假定P2初始时0xFE,1111 1110,按一下变成1111 1101,再按一下变成1111 1011,这就用到了神奇的按位移动
1111 1110
1111 1101 是1111 1110<<1
1111 1011 是1111 1110<<2
.........
由此可见我们可以假设一个LedNumber,按一下P3_1让LedNumber加一,当然不能大于8,不仿大于8时让它变回0,同理,按一下P3_0让LedNumber减一,当然不能小于0,不妨等于0时让它等于7。
从而得到代码!!!!!!
#include<REGX52.H>
#include<INTRINS.H>
void Delay(unsigned int x)
{
unsigned char data i, j;
while(x)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
x--;
}
}
unsigned int LedNumber = 0;
void main()
{ P2=0xFE;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LedNumber++;
if(LedNumber > 8)
LedNumber = 0;
P2 = ~(0x01<<LedNumber);//这里我取反了,看着方便一点
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LedNumber==0)
LedNumber=7;
else
LedNumber--;
P2=~(0x01<<LedNumber);
}
}
}
5.结语
上述就是我们最对按键的一个学习,如果能够掌握这些,按键也就拿捏了,通过学习我们发现,真的不难,关键是有没有走出那一步。这是我坚持第二天更新博客,希望我能继续坚持下去。