實物2操作:stc8a8k按鍵使用

ooolmf發表於2020-11-20

1、硬體連線。
下載器連線;
LED連線;
按鍵已經PCB裡面連線好;
2、按鍵原理
實物1操作:stc8a微控制器和普通51/52微控制器的異同以及下載步驟(點亮一盞LED為例)
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
為什麼識別按鍵按下之後還需要再識別一次呢。實際上為了消抖,那到底什麼是消抖。根據硬體按鍵原理圖可以知道,開發板上的按鍵是直接連線到IO口上的,那麼如果在按鍵按下的時候,會發生多次迴圈響應。51微控制器的處理速度足夠整個while迴圈裡面的程式在一瞬間來回執行若干次了,那麼如果直接檢測按鍵的話,會出現很不穩定的情況。比如說按鍵控制數碼管上的數字依次加一,按一次就加一次。如果不進行消抖處理的話,那麼在你按下去的一瞬間,數字已經加了很多次了。所以在這裡用了軟體延時的消抖,避免重複檢測的情況。有人可能心想,為什麼不弄一個硬體消抖的電路呢,那當然可以,加一個電容就可以了,也稱之為電容按鍵,一般來說,stm32的開發板上都採用的電容按鍵,也就是硬體消抖,那樣根本無需再用軟體延時消抖了。

3、程式:
先定義引腳。
然後進行程式設計。注意去抖動。
程式設計的時候,可以給每個按鍵設定一個變數作為旗幟,當安下去的時候,旗幟=1進行翻轉,後面可以查詢到哪一個按鍵按下去。
4、例程。
4個按鍵,實現不同的LED閃爍模式。

#include<stc8a8k.h>

sbit key0=P3^4;
sbit key1=P3^5;
sbit key2=P3^6;
sbit key3=P3^7;
sbit LED0=P0^0;
sbit LED1=P0^1;

void delay1ms(unsigned int tms)
{
	unsigned int ix=0,iy=0;
	for(ix=tms;ix>0;ix--)
		for(iy=0;iy<1350;iy++);
}

void main()
{
	unsigned char key0flag=0,key1flag=0,key2flag=0,key3flag=0;
	while(1)
	{
		//判斷按鍵按下,去抖動,然後讓對應的按鍵的旗幟舉起來切換
		if(key0==0)
		{
			delay1ms(15);
			if(key0==0)
			{
				key0flag=1;
				key1flag=0;
				key2flag=0;
				key3flag=0;			
			}
		}
		
		else 	if(key1==0)
		{
			delay1ms(15);
			if(key1==0)
			{
				key0flag=0;
				key1flag=1;
				key2flag=0;
				key3flag=0;			
			}
		}
		
			else 	if(key2==0)
		{
			delay1ms(15);
			if(key2==0)
			{
				key0flag=0;
				key1flag=0;
				key2flag=1;
				key3flag=0;			
			}
		}
		
			else 	if(key3==0)
		{
			delay1ms(15);
			if(key3==0)
			{
				key0flag=0;
				key1flag=0;
				key2flag=0;
				key3flag=1;			
			}
		}
		
		//根據旗幟進行判斷執行不同的LED工作模式
		if(key0flag==1)
		{
			LED0=0;LED1=0;
		}
		else 	if(key1flag==1)
		{
			LED0=0;LED1=1;
		}
		else 	if(key2flag==1)
		{
			LED0=1;LED1=0;
		}
		else 	if(key3flag==1)
		{
			LED0=1;LED1=1;
		}
			
	}
}

相關文章