按鍵的檢測與去抖動

RanchoLiang發表於2020-11-16

吳軍老師說,銷售的主要工作 = 賣出產品 + 把錢收回來。
一次完整的按鍵事件 = 按下 + 彈起。
為了避免因為按鍵抖動產生的誤判斷,當檢測到鍵值為0時,先延時“讓子彈飛一會”,如果再次檢測到鍵值為0,說明是真的有按鍵按下了,那就幹活——數碼管顯示對應數字。同時打卡——讓 flag=1,說明真的有按下並且幹活了。當鬆開按鍵之後,檢測到鍵健為1,那就不幹活,同時看一下flag的值是0還是1,如果是1,那說明有幹活並打卡了,那就把flag恢復為0,為下一次幹活做準備。

在這裡插入圖片描述
程式碼如下:

#include <reg51.h>

#define uchar unsigned char

sbit K1 = P0^0;

uchar SingleLED[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar i;

void display(void);
void delay10ms(void);

//一次完整的按鍵事件及去抖動
//完整的按鍵事件 = 按下 + 彈起
//程式碼邏輯: 按下 + 去抖 + 執行任務 + 去抖 + 彈起
//定一個標記位,用來記錄按鍵是按下,還是彈起。
void main()
{
	uchar flag = 0;		//預設為0,表示沒有按下
	while (1)
	{
		if(K1 == 0)	
		{
			delay10ms();
			if(K1 == 0)		//延時後,還是低電平,說明是真的發生了按下事件
			{
				if(flag == 0)
				{
					display();
					flag = 1;
				}						
			}
		}
		else
		{
			delay10ms();
			if(flag == 1) 	//說明產生了一次彈起事件
			{
				flag = 0;				
			}
	
		}
	}
	
}

void display(void)
{
	i = i +1;
	if(i == 15)
	{
		i = 0;
	}
	P1 = SingleLED[i];
}

void delay10ms(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=1; c>0; c--)
        for(b=38; b>0; b--)
            for(a=130; a>0; a--);
}

相關文章