一、独立按键的介绍
1.1 独立按键的基本原理
相当于一种电子开关,按下时开关接通,松开时开关断开。
开关功能:独立按键内部通常包含一个有弹性的金属片,当按键被按下时,金属片与触点接触,电路连通;当按键松开时,金属片恢复原状,电路断开。
电平变化:在51单片机系统中,独立按键通常一端接地(GND),另一端连接到单片机的I/O口上。当按键未按下时,I/O口通过内部上拉电阻保持高电平;当按键按下时,I/O口与地相连,变为低电平。
1.2 按键的消抖处理
抖动现象:由于按键内部机械触点的弹性作用,在按键按下和松开的瞬间会伴随一连串的抖动。这种抖动会导致单片机在短时间内多次检测到电平变化,从而产生误操作。
- 消抖方法:为了消除抖动的影响,需要对按键进行消抖处理。消抖方法主要有两种:硬件消抖和软件消抖。
- 硬件消抖:通过滤波电路或其他电路实现消抖功能,但这种方法会增加电路的复杂性和成本。
- 软件消抖:在程序中通过延时函数来实现消抖。当检测到按键电平变化后,延时一段时间(通常为10ms左右)再次检测电平状态。如果电平状态仍然未变,则认为按键已经稳定按下或松开。
二、原理
总共有四个独立按键,它们公共的一端都接到了GND电源的负极,另一端引出了四个编号是连接到单片机板子中的MCU的IO口上。
单片机上电的时候所有的IO口默认都是高电平,按键没有按下的时候这个IO口保证的是高电平,按下的话这个IO口就变成了低电平。寄存器会检测IO口的电平,然后再读回来新的状态到寄存器当中。
开发板独立按键的位置如下图所示:
三、独立按键控制LED亮灭
3.1 代码示例
按下K1或者K2点亮D1
objectivec
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0 || P3_0==0) //按下按键K1或K2
{
P2_0=0; //D1点亮
}
else
{
P2_0=1; //D1熄灭
}
}
}
要实现其他独立按键控制别的LED灯也是相同的道理,主要就是if语句的使用。明白按下按键P3对应的某I/O口由1变为0。
3.2 实验现象
独立按键控制led亮灭
四、独立按键控制LED状态
4.1 代码示例
按下按键D1不亮,松开才亮
objectivec
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0) //按下K1
{
Delay(20); //延时消抖
while(P3_1==0); //松手检测,如果未松手则一直循环
Delay(20); //松手消抖
P2_0=~P2_0; //取反,与上次状态相反
}
}
}
4.2 实验现象
独立按键控制led
五、独立按键控制LED显示二进制
5.1 代码示例
用K1控制8个LED,显示二进制,每按下一次K1按键就加1。
objectivec
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDnum=0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
P2=~LEDnum;
}
}
}
5.2 实验现象
独立按键控制led显示二进制
六、独立按键控制LED移位
6.1 代码示例
用K1和K2控制LED灯,K1实现右移,K2实现左移。
objectivec
#include <REGX52.H>
unsigned char LEDnum;
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
P2=~0x01;
while(1)
{
Delay(20);
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
if(LEDnum>=8)
LEDnum=0;
P2=~(0x01<<LEDnum);
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDnum==0)
LEDnum=7;
else
LEDnum--;
P2=~(0x01<<LEDnum);
}
}
}
6.2 实验现象
独立按键控制led移位