51单片机学习
程序员文章站
2022-06-08 20:49:57
...
暑假学习计划
2019年7月19日
独立按键
原理
-
功能:控制电路的通断。
-
关键:注意消抖。
抖动的原因:硬件层次上,当你摁下开关,内部弹簧振子还会抖动,导致在很短的时间内一会儿通路一会儿断路。 -
消抖的方法:
(1)延时
(2)N次低电平计数
(3)低通滤波
注:2,3两种暂时不会。
延时的方法有两种:
(1)硬件上:通过电容充放电的时间来延时。
坏处:当独立按键多了代表着电路的复杂性也随之上升。
(2)软件上:在按键按下后通过延时函数 **delay()**来度过抖动时间(大概在5ms~10ms)。
编程
#include <REGX52.H>
typedef unsigned int u16;
typedef unsigned char u8;
void delay10ms(void) //延时函数10ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#define k P1 //P1连接独立按键
void keypros()
{
switch(k) //switch后面可以接整型数据,没想到16进制也可以
{
case 0xfe: //第一个按钮被按下
delay10ms(); //防止抖动
if(k==0xfe) //检验是真的按下去了而不是抖动
P0=~smgduan[1]; //数码管显示1
while(k==0xfe); //在这里死循环,防止你按的时间太长,再次循环又关上了(当然,这里可以不要这个死循环,
//,因为再次循环也是显示1,这里不像灯的开闭
break;
case 0xfd: //按下第二个按钮
delay10ms();
if(k==0xfd)
P0=~smgduan[2];
while(k==0xfd); //下面懒得写了
}
}
int main()
{
while(1)
{
keypros();
}
}