今天学习了单片机独立按键的知识,想通过这篇文章记录一下。
独立按键电路
首先当独立按键按下时电路导通,右边GND接地时负极,左边分别连接四个引脚,每个引脚上连接了一个独立按键。这四个引脚接到单片机的CPU上,当单片机接通电源时这四个引脚默认为高电平相当于 1。当独立按键被按下时线路导通,引脚变为低电平 0。
按键的抖动
对于机械开关,按下开关,变为低电平;松开开关,则变为高电平。当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
所以要对按键进行消抖,消抖的方式有两种,第一种时硬件消抖,第二种时软件消抖,由于本人也是刚学习单片机这里只说软件消抖,就是通过延迟来消除独立按键按下或松开时产生的动。
按键控制LED亮灭
#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;
#define LED1 P2_0
void delay_us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
while(1)
{
if(P3_1==0)//如果按键被按下
{
delay_us(20);
while(P3_1==0);//按键一直被按下程序将在此循环中,松手继续向下执行
delay_us(20);
LED1=~LED1; //每次按键被按下LED1的状态发生一次反转
}
}
}
按键实现LED移位
#include <REGX52.H>
void delay_ms(u16 ten_us)
{
while(ten_us--);
}
void main()
{
u8 LEDNum=0; //设置一个变量记录按下的次数
while(1)
{
if(P3_1==0)
{
//按键的检测
delay_ms(20); //按下消抖
while(P3_1==0);
delay_ms(20); //松开消抖
if(LEDNum>=8)//按下超过八次重新开始
LEDNum = 0;
P2 = ~(0x01<<LEDNum);//变量取反
LEDNum++; //变量自增
}
if(P3_0==0)
{
delay_ms(20);
while(P3_0==0);
delay_ms(20);
if(LEDNum==0)//由于采用八位寄存器,如果小于0就会溢出
LEDNum=7;
else
LEDNum--;//变量自减
P2 = ~(0x01<<LEDNum);
}
}
}
按键使LED显示二进制
#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;
void Delayms(u16 xms)
{
unsigned char i, j;
while(xms)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
u8 LEDNum = 0;
while(1)
{
if(P3_1==0)
{
delay_us(20); //延迟消抖
while(P3_1==0);
Delay_us(20);
LEDNum++; //0000 0001 ~ 1111 1111
P2=~LEDNum;
//P2++也可以实现,上电之后P2默认位高电平 1111 1111
}
}
}