欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

51单片机学习

程序员文章站 2022-06-08 20:49:57
...
暑假学习计划

2019年7月19日

独立按键

原理

  1. 功能:控制电路的通断。

  2. 关键:注意消抖。
    抖动的原因:硬件层次上,当你摁下开关,内部弹簧振子还会抖动,导致在很短的时间内一会儿通路一会儿断路。

  3. 消抖的方法:
    (1)延时
    (2)N次低电平计数
    (3)低通滤波
    注:2,3两种暂时不会。

延时的方法有两种:

(1)硬件上:通过电容充放电的时间来延时。
坏处:当独立按键多了代表着电路的复杂性也随之上升。

(2)软件上:在按键按下后通过延时函数 **delay()**来度过抖动时间(大概在5ms~10ms)。
51单片机学习

编程

#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();

	}
}