国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

初學(xué)者思路-實(shí)現(xiàn)獨(dú)立按鍵檢測(cè)(以STM32為例)

這篇具有很好參考價(jià)值的文章主要介紹了初學(xué)者思路-實(shí)現(xiàn)獨(dú)立按鍵檢測(cè)(以STM32為例)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

? ? ? ? 本文以初學(xué)者角度切入,詳細(xì)剖析按鍵檢測(cè)原理,實(shí)現(xiàn)按鍵短按、短按抬起、首次長(zhǎng)按、持續(xù)長(zhǎng)按次數(shù)、長(zhǎng)按抬起功能;


目錄

前言

波形圖分析

抖動(dòng)原因

為什么要消抖

如何消抖

原理圖分析

程序設(shè)計(jì)思路

代碼實(shí)踐

按鍵配置

按鍵檢測(cè)

實(shí)驗(yàn)結(jié)果

留下反思


波形圖分析

? ? ? ? 如圖為按鍵按下→釋放過(guò)程的波形圖

stm 32 檢測(cè)按鍵按下和松開(kāi),我的按鍵驅(qū)動(dòng)編年史,stm32,嵌入式硬件,單片機(jī)

可以從圖中看到,實(shí)際波形在按下與釋放時(shí)都有一段雜亂的波形,期間存在著多次高電平與低電平,這就是抖動(dòng)。

抖動(dòng)原因

????????機(jī)械原因:由于按鍵內(nèi)部構(gòu)造常為彈簧、金屬?gòu)椘冉佑|器件,當(dāng)按鍵按下或釋放時(shí),這些器件的反彈、震動(dòng)等原因?qū)е滤矔r(shí)的接觸和斷開(kāi),從而產(chǎn)生抖動(dòng);

????????電氣原因:電路噪聲、環(huán)境干擾、電容充放電等因素;

為什么要消抖

? ? ? ? 為了確保按鍵信號(hào)的穩(wěn)定性和可靠性。由于上述機(jī)械原因與電氣原因,軟件在讀取到一個(gè)有效電平時(shí),是無(wú)法百分百分辨出是真實(shí)的按鍵按下/釋放還是由于抖動(dòng)、干擾等造成的。如果不進(jìn)行消抖會(huì)導(dǎo)致在一次按鍵按下釋放過(guò)程中出現(xiàn)判斷為多次的按鍵短按與釋放,這是對(duì)系統(tǒng)功能有破壞性與不可靠性的。

如何消抖

? ? ? ? 硬件層面:添加合適電容消除機(jī)械原因(注意電容過(guò)大會(huì)影響按鍵響應(yīng)時(shí)間,過(guò)小則作用不佳)。添加上拉電阻抵抗電氣原因;

? ? ? ? 軟件層面:在一段時(shí)間內(nèi),對(duì)引腳電平進(jìn)行多次判斷,如果每次都滿足了觸發(fā)條件則認(rèn)為是有效的;


原理圖分析

stm 32 檢測(cè)按鍵按下和松開(kāi),我的按鍵驅(qū)動(dòng)編年史,stm32,嵌入式硬件,單片機(jī)stm 32 檢測(cè)按鍵按下和松開(kāi),我的按鍵驅(qū)動(dòng)編年史,stm32,嵌入式硬件,單片機(jī)stm 32 檢測(cè)按鍵按下和松開(kāi),我的按鍵驅(qū)動(dòng)編年史,stm32,嵌入式硬件,單片機(jī)

圖一為最簡(jiǎn)單的按鍵原理圖

????????優(yōu)點(diǎn):簡(jiǎn)單,降低了成本和電路設(shè)計(jì)的復(fù)雜性;

????????缺點(diǎn):沒(méi)有硬件消抖,且抗干擾能力差;

圖二為加了上拉電阻的按鍵原理圖

????????優(yōu)點(diǎn):與圖一方式比較,提高了抗干擾能力;

????????缺點(diǎn):沒(méi)有硬件消抖;

圖三為加了上拉電阻與電容的按鍵原理圖

????????優(yōu)點(diǎn):與圖一二方式比較,有了抗干擾能力與硬件消抖;

????????缺點(diǎn):提高了成本和電路設(shè)計(jì)的復(fù)雜性;


程序設(shè)計(jì)思路

? ? ? ? 當(dāng)檢測(cè)電平有按鍵按下時(shí),等待一段時(shí)間(即抖動(dòng)時(shí)間)之后,再次檢測(cè)電平是否按下,如果仍然檢測(cè)為有按鍵按下則認(rèn)為有效。檢測(cè)釋放也同理,下圖為大致流程圖,省略了釋放的消抖以便閱讀。

stm 32 檢測(cè)按鍵按下和松開(kāi),我的按鍵驅(qū)動(dòng)編年史,stm32,嵌入式硬件,單片機(jī)


代碼實(shí)踐

詳細(xì)代碼工程鏈接

按鍵配置

#include "stm32f10x.h"



#define KEY_GPIO_PORT			GPIOA				/* 按鍵引腳端口號(hào) */
#define KEY_GPIO_PIN			GPIO_Pin_0			/* 按鍵引腳編號(hào) */
#define KEY_GPIO_CLK_ENABLE()	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)	/* GPIO時(shí)鐘使能 */



/*按鍵初始化*/
void Key_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*GPIO時(shí)鐘使能*/
	KEY_GPIO_CLK_ENABLE();
	
	/*GPIO配置*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;            /* 上拉輸入 */
	
	GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;
	GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);
}

詳細(xì)代碼工程鏈接?

按鍵檢測(cè)

#include "stdio.h"



/* 按鍵檢測(cè) */
void KeyCheck(void)
{
	unsigned char tempDownCount = 0;	/* 按下計(jì)數(shù) */
	unsigned char tempUpCount = 0;		/* 釋放計(jì)數(shù) */
	unsigned char tempLongFlag = 0;		/* 長(zhǎng)按標(biāo)志 */
	unsigned int tempContinueCount = 0;	/* 持續(xù)長(zhǎng)按次數(shù) */
	
	if(0 == GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN))				/* 讀取按鍵電平有效 */
	{
		Delay_ms(20);														/* 按下階段消抖(合理范圍10~50ms) */
		if(0 == GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN))			/* 再次讀取按鍵電平仍然有效 */
		{
			printf("按鍵按下\n");
            //按鍵短按需要干嘛。。。
			
			/*檢測(cè)長(zhǎng)按*/
			while(1)
			{
				if(0 == GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN))
				{
					tempUpCount = 0;										/* 復(fù)位釋放計(jì)數(shù) */
					
					if(++tempDownCount >= 10)
					{
						tempDownCount = 0;									/* 復(fù)位按下計(jì)數(shù) */
						if(0 == tempLongFlag)
						{
							tempLongFlag = 1;
							tempContinueCount = 1;
							printf("按鍵首次長(zhǎng)按\n");
                            //按鍵首次長(zhǎng)按需要干嘛。。。
						}
						else
						{
							++tempContinueCount;
							printf("按鍵持續(xù)長(zhǎng)按次數(shù)【%d】\n", tempContinueCount);
                            //按鍵多次持續(xù)長(zhǎng)按需要干嘛。。。
						}
					}
				}
				/*檢測(cè)釋放*/
				if(1 == GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN))
				{
					if(++tempUpCount >= 2)									/* 釋放階段消抖 */
					{
						if(0 == tempLongFlag)
						{
							printf("按鍵短按抬起\n\n");
                            //按鍵短按抬起需要干嘛。。。
						}
						else
						{
							printf("按鍵長(zhǎng)按抬起\n\n");
                            //按鍵長(zhǎng)按抬起需要干嘛。。。
						}
						return;
					}
				}
					
				Delay_ms(20);												/* 時(shí)間間隔 */
			}
		}
	}
}



int main(void)
{
	Delay_Init();				/* 滴答延時(shí)初始化 */
	Usart1_Init(9600);			/* 串口初始化 */
	Key_Init();					/* 按鍵初始化 */
	
	printf("按鍵檢測(cè)測(cè)試\n");
	
	while(1)
	{
		KeyCheck();				/* 按鍵檢測(cè) */
	}
}

詳細(xì)代碼工程鏈接


實(shí)驗(yàn)結(jié)果

短按測(cè)試

stm 32 檢測(cè)按鍵按下和松開(kāi),我的按鍵驅(qū)動(dòng)編年史,stm32,嵌入式硬件,單片機(jī)

長(zhǎng)按測(cè)試

stm 32 檢測(cè)按鍵按下和松開(kāi),我的按鍵驅(qū)動(dòng)編年史,stm32,嵌入式硬件,單片機(jī)


留下反思

? ? ? ? 細(xì)心的同學(xué)應(yīng)該能發(fā)現(xiàn),雖然按鍵檢測(cè)的功能是實(shí)現(xiàn)了,但是當(dāng)后續(xù)其他功能的加入時(shí),如果按鍵一直按住不松是不是就一直在KeyCheck()里的while(1)里不出來(lái)了?這時(shí)其他功能是不是就跑不了了?那么該怎么辦呢?

????????敬請(qǐng)關(guān)注“我的按鍵驅(qū)動(dòng)編年史”專欄,里面有你想要的答案。


????????分享先到這里,希望能給大家?guī)?lái)啟發(fā)與幫助。如果對(duì)內(nèi)容存在疑問(wèn)或想法,歡迎在評(píng)論區(qū)留言,我會(huì)積極回復(fù)大家的問(wèn)題。在我的“我的按鍵驅(qū)動(dòng)編年史”專欄中,還有一些關(guān)于按鍵驅(qū)動(dòng)不同寫法的教程,歡迎一起探討、一起學(xué)習(xí)。

????????終版驅(qū)動(dòng)gitee倉(cāng)庫(kù):

XxxSwitchScan_Driver: XxxSwitchScan_Driver可以簡(jiǎn)單的看作為一個(gè)C語(yǔ)言的按鍵驅(qū)動(dòng),使用簡(jiǎn)單、靈活且解耦,以面向?qū)ο笏枷虢Y(jié)合狀態(tài)機(jī)編寫,同時(shí)適用于裸機(jī)與操作系統(tǒng)。最終實(shí)現(xiàn)響應(yīng)事件有:短按/短按抬起/長(zhǎng)按/持續(xù)長(zhǎng)按/長(zhǎng)按抬起/連擊/單邊沿觸發(fā)。一開(kāi)始僅為了實(shí)現(xiàn)按鍵驅(qū)動(dòng)。后面把按鍵結(jié)合如高低電平的傳感器、開(kāi)關(guān)量的限位等進(jìn)一步抽象為開(kāi)關(guān)量的輸入設(shè)備。由此我常會(huì)把項(xiàng)目中的開(kāi)關(guān)量的輸入設(shè)備通過(guò)該驅(qū)動(dòng)統(tǒng)一管理。https://gitee.com/wx_372d4eb42f/xxx-switch-scan_-driver文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-794471.html

到了這里,關(guān)于初學(xué)者思路-實(shí)現(xiàn)獨(dú)立按鍵檢測(cè)(以STM32為例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32初學(xué)者入門FreeRTOS操作系統(tǒng),多任務(wù)實(shí)時(shí)系統(tǒng)

    STM32初學(xué)者入門FreeRTOS操作系統(tǒng),多任務(wù)實(shí)時(shí)系統(tǒng)

    ? ? ? ? FreeRTOS(Free Real-Time Operating System)是一個(gè)開(kāi)源的嵌入式實(shí)時(shí)操作系統(tǒng),它專門設(shè)計(jì)用于在資源有限的嵌入式系統(tǒng)中運(yùn)行。FreeRTOS提供了一些用于任務(wù)管理、調(diào)度、同步和通信的功能,使開(kāi)發(fā)者能夠輕松地創(chuàng)建可靠的嵌入式系統(tǒng)。 以下是FreeRTOS的一些特點(diǎn)和功能: 輕量

    2024年02月11日
    瀏覽(27)
  • 不怕沒(méi)項(xiàng)目做!github上的STM32 優(yōu)秀開(kāi)源項(xiàng)目和初學(xué)者項(xiàng)目

    不怕沒(méi)項(xiàng)目做!github上的STM32 優(yōu)秀開(kāi)源項(xiàng)目和初學(xué)者項(xiàng)目

    TinyGo - Go語(yǔ)言編譯器,適用于微控制器、WebAssembly、命令行工具,基于LLVM。 語(yǔ)言:Go 星標(biāo)數(shù):14,267+ 描述:TinyGo帶來(lái)了Go語(yǔ)言在嵌入式系統(tǒng)的實(shí)現(xiàn),使得STM32等微控制器編程更加多樣化。 Flipper Zero Firmware - Flipper Zero的固件源碼。 語(yǔ)言:C 星標(biāo)數(shù):10,699+ 描述:為Flipper Zero多功能

    2024年03月20日
    瀏覽(108)
  • Java初學(xué)者也可以實(shí)現(xiàn)的圖書(shū)系統(tǒng)小練習(xí)

    Java初學(xué)者也可以實(shí)現(xiàn)的圖書(shū)系統(tǒng)小練習(xí)

    ? ? ? ?大家好呀,我是小戴?????? ? ? ? ?最近大家不是快期末了嘛,有沒(méi)有泡圖書(shū)館呀?今天的學(xué)習(xí)內(nèi)容跟圖書(shū)館有關(guān),沒(méi)錯(cuò),就是圖書(shū)管理系統(tǒng),但是目前所學(xué)知識(shí)水平有限,這是一個(gè)很簡(jiǎn)單的圖書(shū)系統(tǒng)小練習(xí)。不要急,我們的 目的是在于如何使用已知學(xué)過(guò)的知識(shí)進(jìn)

    2023年04月09日
    瀏覽(21)
  • 【C語(yǔ)言】代碼實(shí)現(xiàn) 掃雷 游戲及進(jìn)階功能(初學(xué)者詳解)

    【C語(yǔ)言】代碼實(shí)現(xiàn) 掃雷 游戲及進(jìn)階功能(初學(xué)者詳解)

    掃雷游戲的起源可以追溯到20世紀(jì)60年代,當(dāng)時(shí)這款游戲是由IBM開(kāi)發(fā)出來(lái)的。在80年代初,微軟公司將其收歸旗下,并將其作為Windows操作系統(tǒng)自帶的一款游戲。自此以后,掃雷成為了Windows用戶最喜歡的休閑游戲之一,也受到了全球范圍內(nèi)的玩家喜愛(ài)。 現(xiàn)在,我們使用C語(yǔ)言,來(lái)

    2024年01月20日
    瀏覽(27)
  • AIGC:初學(xué)者使用“C知道”實(shí)現(xiàn)AI人臉識(shí)別

    AIGC:初學(xué)者使用“C知道”實(shí)現(xiàn)AI人臉識(shí)別

    從前,我們依靠各種搜索引擎來(lái)獲取內(nèi)容,但隨著各類數(shù)據(jù)在互聯(lián)網(wǎng)世界的爆炸式增長(zhǎng),加上深度學(xué)習(xí)模型的廣泛發(fā)展,我們現(xiàn)在不僅可以實(shí)現(xiàn)“遇事不決問(wèn)AI”,還可以利用AI進(jìn)行創(chuàng)作,關(guān)于人工智能生成內(nèi)容(AIGC)的討論和應(yīng)用也是隨處可見(jiàn)。 本文記錄一下人工智能初學(xué)

    2024年02月11日
    瀏覽(28)
  • RSA 加密算法在C++中的實(shí)現(xiàn) 面向初學(xué)者(附代碼)

    博文的 一,二部分 為 基礎(chǔ)知識(shí) 的鋪墊。分別從 密碼學(xué),數(shù)論 兩個(gè)方面為理解RSA算法做好了準(zhǔn)備。 第三部分 是對(duì)RSA加密過(guò)程的具體介紹,主要涉及其 密鑰對(duì)(key-pair)的獲取 。前三個(gè)部分與編程實(shí)踐無(wú)關(guān),可以當(dāng)作獨(dú)立的關(guān)于RSA加密算法的介紹。 第四部分 開(kāi)始介紹在 編

    2024年01月21日
    瀏覽(93)
  • SpringBoot整合阿里云短信服務(wù)詳細(xì)過(guò)程(保證初學(xué)者也能實(shí)現(xiàn))

    SpringBoot整合阿里云短信服務(wù)詳細(xì)過(guò)程(保證初學(xué)者也能實(shí)現(xiàn))

    網(wǎng)上關(guān)于實(shí)操性的文章普遍大部分都記錄不全,要么只記錄重點(diǎn)部分,對(duì)于剛學(xué)習(xí)的小伙伴來(lái)說(shuō)看起來(lái)是比較困難的 所以,基于這一點(diǎn)。 該文章會(huì)詳細(xì)介紹使用SpringBoot整合阿里云短信服務(wù)的每一步過(guò)程,同時(shí)會(huì)將驗(yàn)證碼存放到Redis中并設(shè)置過(guò)期時(shí)間 , 盡量保證實(shí)戰(zhàn)的同時(shí)也

    2023年04月15日
    瀏覽(16)
  • 守護(hù)進(jìn)程(初學(xué)者必備)

    守護(hù)進(jìn)程(初學(xué)者必備)

    目錄 一.進(jìn)程組和會(huì)話 二.守護(hù)進(jìn)程的概念 三.守護(hù)線程的特點(diǎn) 四.守護(hù)進(jìn)程創(chuàng)建的基本步驟 1.進(jìn)程組的相關(guān)概念: 進(jìn)程除了有進(jìn)程的PID之外還有一個(gè)進(jìn)程組,進(jìn)程組是由一個(gè)進(jìn)程或者多個(gè)進(jìn)程組成。通常他們與同一作業(yè)相關(guān)聯(lián)可以收到同一終端的信號(hào) 每個(gè)進(jìn)程組有唯一的進(jìn)程

    2024年02月08日
    瀏覽(19)
  • 爬蟲(chóng),初學(xué)者指南

    爬蟲(chóng),初學(xué)者指南

    1.想目標(biāo)地址發(fā)起請(qǐng)求,攜帶heards和不攜帶heards的區(qū)別 request模塊用于測(cè)速發(fā)送數(shù)據(jù)的連通性,通過(guò)回復(fù)可以看出418,Connection:close表示未獲取到服務(wù)器的返回值,需要添加heards信息,此服務(wù)器拒絕非瀏覽器發(fā)送的請(qǐng)求。 上圖可以看出添加了頭信息headers之后成功獲取了返回值

    2024年02月07日
    瀏覽(35)
  • Groovy初學(xué)者指南

    本文已收錄至Github,推薦閱讀 ?? Java隨想錄 微信公眾號(hào):Java隨想錄 目錄 摘要 Groovy與Java的聯(lián)系和區(qū)別 Groovy的語(yǔ)法 動(dòng)態(tài)類型 元編程 處理集合的便捷方法 閉包 運(yùn)算符重載 控制流 條件語(yǔ)句 循環(huán)語(yǔ)句 字符串處理 字符串插值 多行字符串 集合與迭代 列表(List) 映射(Map) 迭代器

    2024年02月05日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包