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

STM32 -- 實(shí)現(xiàn)按鍵的長(zhǎng)按與短按檢測(cè)(其他單片機(jī)可移植)

這篇具有很好參考價(jià)值的文章主要介紹了STM32 -- 實(shí)現(xiàn)按鍵的長(zhǎng)按與短按檢測(cè)(其他單片機(jī)可移植)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

資源獲取

一 前言

二 思路

?三 實(shí)現(xiàn)代碼

1.主要代碼

四 完整代碼

Key.h

Key.c

該改進(jìn)版本(1ms太繁瑣了,我改成了25ms檢測(cè)一次)?

?1.定時(shí)器部分

2.按鍵檢測(cè)部分

?五、參考


資源獲取

歡迎關(guān)注微信公眾號(hào)--星之援工作室 發(fā)送關(guān)鍵字(長(zhǎng)短按檢測(cè))

stm32按鍵長(zhǎng)按短按,學(xué)習(xí)心得,單片機(jī),嵌入式硬件,stm32,c語(yǔ)言

一 前言

今天在逛博客的時(shí)候,偶然看到了一篇關(guān)于按鍵檢測(cè)的文章,興趣使然自己嘗試了一番,寫了一些代碼去驗(yàn)證自己的思路,通過(guò)驗(yàn)證完美實(shí)現(xiàn)了長(zhǎng)按和短按檢測(cè),后續(xù)有時(shí)間的我也會(huì)更新一下連按檢測(cè)等

二 思路

首先說(shuō)一下我使用的思路,第一就是使用我們的單片機(jī)的定時(shí)器去做一個(gè)輪詢判斷,首先建立一個(gè)1ms反轉(zhuǎn)一次的定時(shí)器,定時(shí)器的選擇根據(jù)自己手上有的單片機(jī)去配置一下就行,我用到是STM32F103C8T6,這款芯片有三個(gè)通用定時(shí)器,我選擇的是使用TIM4去進(jìn)行一個(gè)按鍵的檢測(cè),定時(shí)器以每1ms檢測(cè)一次按鍵事件的方式,判斷是否按下或長(zhǎng)按按鍵,連續(xù)按下定時(shí)器會(huì)進(jìn)行一個(gè)計(jì)數(shù),檢測(cè)一直按下就將計(jì)時(shí)器每輪詢一次就加一,從而計(jì)算出按鍵按下的時(shí)間


?三 實(shí)現(xiàn)代碼

1.主要代碼

注意:??我在后面沒(méi)有放Time定時(shí)器的配置函數(shù),但是我之前發(fā)過(guò)配置文件,大家可以直接使用

文章連接 :STM32學(xué)習(xí)記錄 -- 通用定時(shí)器的配置(TIM2-TIM5)

需要注意,如果有同學(xué)使用STM32F103C8T6配置,需要屏蔽TIM5,因?yàn)镾TM32F103C8T6沒(méi)有TIM5噢

這段主要檢測(cè)按鍵的哪一個(gè)被按下了

/*********************************************************************************
 * @Function	:  按鍵處理函數(shù)
 * @Input		:  Gmode:0,不支持連續(xù)按;1,支持連續(xù)按;
 * @Output		:  None
 * @Return		:  0,沒(méi)有任何按鍵按下
 *							 1,KEY1按下
 *						   2,KEY2按下
 *							 3,KEY3按下
 * @Others		:  注意此函數(shù)有響應(yīng)優(yōu)先級(jí),KEY0>KEY1>KEY2>KEY3!!
 * @Date			:  2022-07-23
 **********************************************************************************/
u8 KEY_Scan(u8 mode)
{
	static u8 key_up = 1; // 按鍵按松開(kāi)標(biāo)志
	if (mode)
		key_up = 1; // 支持連按
	if (key_up && (KEY1 == KEY_ON || KEY2 == KEY_ON || KEY3 == KEY_ON || KEY4 == KEY_ON))
	{
		key_up = 0;
		if (KEY1 == KEY_ON)
			return KEY1_PRES;
		else if (KEY2 == KEY_ON)
			return KEY2_PRES;
		else if (KEY3 == KEY_ON)
			return KEY3_PRES;
		else if (KEY4 == KEY_ON)
			return KEY4_PRES;
	}
	else if (KEY1 == KEY_OFF && KEY2 == KEY_OFF && KEY3 == KEY_OFF && KEY4 == KEY_OFF)
		key_up = 1;
	return 0; // 無(wú)按鍵按下
}

這段代碼主要是放在定時(shí)器里面做一個(gè)輪詢判斷,其中key_old,主要是保存上一次按下的按鍵值,方便我們進(jìn)行判斷,這里面的time_4 就是我們的計(jì)時(shí)器,我們通過(guò)判斷time_4的值做一個(gè)長(zhǎng)按和短按的檢測(cè),Key_Scan_Time是我自己定義的一個(gè)短按時(shí)長(zhǎng)限制,我設(shè)置的是30

// 檢測(cè)按鍵是否按下
static u16 time_4
static U8 key_old = 0;
u8 Check_Key_ON_OFF()
{
	u8 key;
	key = KEY_Scan(1);
	// 與上一次的鍵值比較 如果不相等,表明有鍵值的變化,開(kāi)始計(jì)時(shí)
	if (key != 0 && time_4 == 0)
	{
		key_old = key;
		time_4 = 1;
	}
	if (key != 0 && time_4 >= 1 && time_4 <= 100) // 100ms
	{
		time_4++; // 時(shí)間記錄器
	}
	if (key == 0 && time_4 > 0 && time_4 < Key_Scan_Time) // 短按
	{
		switch (key_old)
		{
		case KEY1_PRES:
			printf("Key1_Short\n");
			break;
		case KEY2_PRES:
			printf("Key2_Short\n");
			break;
		case KEY3_PRES:
			break;
		case KEY4_PRES:
			break;
		default:
			break;
		}
		time_4 = 0;
	}
	else if (key == 0 && time_4 >= Key_Scan_Time) // 長(zhǎng)按
	{
		switch (key_old)
		{
		case KEY1_PRES:
			printf("Key1_Long\n");
			break;
		case KEY2_PRES:
			printf("Key2_Long\n");
			break;
		case KEY3_PRES:
			break;
		case KEY4_PRES:
			break;
		default:
			break;
		}
		time_4 = 0;
	}

	return 1;
}

最后我只需要在定時(shí)器中斷中放入?Check_Key_ON_OFF()函數(shù),即可實(shí)現(xiàn)功能

/*********************************************************************************
 * @Function	:  TIMER4定時(shí)器中斷服務(wù)
 * @Input		:  None
 * @Output		:	 None
 * @Return		:  None
 * @Others		:	 None
 * @Date			:  2022-08-30
 **********************************************************************************/
#if GENERAL_TIM4
void TIM4_IRQHandler(void) // TIM4中斷
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) // 檢查TIM3更新中斷發(fā)生與否
	{
		Check_Key_ON_OFF();
	
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 清除TIMx更新中斷標(biāo)志
	}
}
#endif

四 完整代碼

Key.h

#ifndef __KEY_H
#define __KEY_H

#include "stm32f10x.h"

//  引腳定義
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_PIN GPIO_Pin_0

#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_PIN GPIO_Pin_13

#define KEY3_GPIO_CLK RCC_APB2Periph_GPIOB
#define KEY3_GPIO_PORT GPIOB
#define KEY3_GPIO_PIN GPIO_Pin_14

#define KEY4_GPIO_CLK RCC_APB2Periph_GPIOB
#define KEY4_GPIO_PORT GPIOB
#define KEY4_GPIO_PIN GPIO_Pin_15

#define KEY1 GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN) // 讀取按鍵0
#define KEY2 GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_GPIO_PIN) // 讀取按鍵1
#define KEY3 GPIO_ReadInputDataBit(KEY3_GPIO_PORT, KEY3_GPIO_PIN) // 讀取按鍵2
#define KEY4 GPIO_ReadInputDataBit(KEY4_GPIO_PORT, KEY4_GPIO_PIN) // 讀取按鍵2

#define KEY1_PRES 1      // KEY1按下
#define KEY2_PRES 2      // KEY2按下
#define KEY3_PRES 3      // KEY3按下
#define KEY4_PRES 4      // KEY3按下
#define Key_Scan_Time 30 // 短按時(shí)長(zhǎng)時(shí)間判斷

/** 按鍵按下標(biāo)置宏
 *  按鍵按下為高電平,設(shè)置 KEY_ON=1, KEY_OFF=0
 *  若按鍵按下為低電平,把宏設(shè)置成KEY_ON=0 ,KEY_OFF=1 即可
 */
#define KEY_ON 1
#define KEY_OFF 0
/*********************************************************************************
 * @Function	:  初始化控制LED的IO
 * @Input		:  None
 * @Output		:  None
 * @Return		:  None
 * @Others		:  None
 * @Date			:  2022-07-23
 **********************************************************************************/
void Key_GPIO_Config(void);
/*********************************************************************************
 * @Function	:  檢測(cè)是否有按鍵按下
 * @Input		:  GPIOx:x 可以是 A,B,C,D或者 E
 *						:  GPIO_Pin:待讀取的端口位
 * @Output		:  None
 * @Return		:  KEY_OFF(沒(méi)按下按鍵)、KEY_ON(按下按鍵)
 * @Others		:  None
 * @Date			:  2022-07-23
 **********************************************************************************/
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/*********************************************************************************
 * @Function	:  按鍵處理函數(shù)
 * @Input		:  Gmode:0,不支持連續(xù)按;1,支持連續(xù)按;
 * @Output		:  None
 * @Return		:  0,沒(méi)有任何按鍵按下
 *							 1,KEY1按下
 *						   2,KEY2按下
 *							 3,KEY3按下
 * @Others		:  注意此函數(shù)有響應(yīng)優(yōu)先級(jí),KEY0>KEY1>KEY2>KEY3!!
 * @Date			:  2022-07-23
 **********************************************************************************/
u8 KEY_Scan(u8 mode);
/*********************************************************************************
 * @Function	:  STM32程序軟件復(fù)位
 * @Input		:  None
 *						:  None
 * @Output		:  None
 * @Return		:  None
 * @Others		:  None
 * @Date			:  2022-08-23
 **********************************************************************************/
void Sys_Restart(void);
#endif /* __KEY_H */

Key.c

#include "key.h"
#include "delay.h"
// 協(xié)議文件
/*********************************************************************************
 * @Function	:  初始化控制LED的IO
 * @Input		:  None
 * @Output		:  None
 * @Return		:  None
 * @Others		:  None
 * @Date			:  2022-07-23
 **********************************************************************************/
void Key_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	/*開(kāi)啟按鍵端口的時(shí)鐘*/
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK | KEY2_GPIO_CLK | KEY3_GPIO_CLK, ENABLE);

	// 選擇按鍵的引腳
	GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
	// 設(shè)置按鍵的引腳為浮空輸入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	// 使用結(jié)構(gòu)體初始化按鍵
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);

	// 選擇按鍵的引腳
	GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
	// 設(shè)置按鍵的引腳為浮空輸入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	// 使用結(jié)構(gòu)體初始化按鍵
	GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);

	// 選擇按鍵的引腳
	GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN;
	// 設(shè)置按鍵的引腳為浮空輸入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	// 使用結(jié)構(gòu)體初始化按鍵
	GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure);

	// 選擇按鍵的引腳
	GPIO_InitStructure.GPIO_Pin = KEY4_GPIO_PIN;
	// 設(shè)置按鍵的引腳為浮空輸入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	// 使用結(jié)構(gòu)體初始化按鍵
	GPIO_Init(KEY4_GPIO_PORT, &GPIO_InitStructure);

	GPIO_ResetBits(KEY1_GPIO_PORT, KEY1_GPIO_PIN);
	GPIO_ResetBits(KEY2_GPIO_PORT, KEY2_GPIO_PIN);
	GPIO_ResetBits(KEY3_GPIO_PORT, KEY3_GPIO_PIN);
	GPIO_ResetBits(KEY4_GPIO_PORT, KEY4_GPIO_PIN);
}
/*********************************************************************************
 * @Function	:  檢測(cè)是否有按鍵按下
 * @Input		:  GPIOx:x 可以是 A,B,C,D或者 E
 *						:  GPIO_Pin:待讀取的端口位
 * @Output		:  None
 * @Return		:  KEY_OFF(沒(méi)按下按鍵)、KEY_ON(按下按鍵)
 * @Others		:  None
 * @Date			:  2022-07-23
 **********************************************************************************/
u8 Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
	/*檢測(cè)是否有按鍵按下 */
	if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
	{
		/*等待按鍵釋放 */
		while (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
			;
		return KEY_ON;
	}
	else
		return KEY_OFF;
}
/*********************************************************************************
 * @Function	:  按鍵處理函數(shù)
 * @Input		:  Gmode:0,不支持連續(xù)按;1,支持連續(xù)按;
 * @Output		:  None
 * @Return		:  0,沒(méi)有任何按鍵按下
 *							 1,KEY1按下
 *						   2,KEY2按下
 *							 3,KEY3按下
 * @Others		:  注意此函數(shù)有響應(yīng)優(yōu)先級(jí),KEY0>KEY1>KEY2>KEY3!!
 * @Date			:  2022-07-23
 **********************************************************************************/
u8 KEY_Scan(u8 mode)
{
	static u8 key_up = 1; // 按鍵按松開(kāi)標(biāo)志
	if (mode)
		key_up = 1; // 支持連按
	if (key_up && (KEY1 == KEY_ON || KEY2 == KEY_ON || KEY3 == KEY_ON || KEY4 == KEY_ON))
	{
		delay_ms(10); // 去抖動(dòng)
		key_up = 0;
		if (KEY1 == KEY_ON)
			return KEY1_PRES;
		else if (KEY2 == KEY_ON)
			return KEY2_PRES;
		else if (KEY3 == KEY_ON)
			return KEY3_PRES;
		else if (KEY4 == KEY_ON)
			return KEY4_PRES;
	}
	else if (KEY1 == KEY_OFF && KEY2 == KEY_OFF && KEY3 == KEY_OFF && KEY4 == KEY_OFF)
		key_up = 1;
	return 0; // 無(wú)按鍵按下
}

/*********************************************************************************
 * @Function	:  STM32程序軟件復(fù)位
 * @Input		:  None
 *						:  None
 * @Output		:  None
 * @Return		:  None
 * @Others		:  None
 * @Date			:  2022-08-23
 **********************************************************************************/
void Sys_Restart(void)
{
	__set_FAULTMASK(1);
	NVIC_SystemReset();
}
// 檢測(cè)按鍵是否按下
static u16 time_4
static u8 key_old = 0;
u8 Check_Key_ON_OFF()
{
	u8 key;
	key = KEY_Scan(1);
	// 與上一次的鍵值比較 如果不相等,表明有鍵值的變化,開(kāi)始計(jì)時(shí)
	if (key != 0 && time_4 == 0)
	{
		key_old = key;
		time_4 = 1;
	}
	if (key != 0 && time_4 >= 1 && time_4 <= 100) // 100ms
	{
		time_4++; // 時(shí)間記錄器
	}
	if (key == 0 && time_4 > 0 && time_4 < Key_Scan_Time) // 短按
	{
		switch (key_old)
		{
		case KEY1_PRES:
			printf("Key1_Short\n");
			break;
		case KEY2_PRES:
			printf("Key2_Short\n");
			break;
		case KEY3_PRES:
			break;
		case KEY4_PRES:
			break;
		default:
			break;
		}
		time_4 = 0;
	}
	else if (key == 0 && time_4 >= Key_Scan_Time) // 長(zhǎng)按
	{
		switch (key_old)
		{
		case KEY1_PRES:
			printf("Key1_Long\n");
			break;
		case KEY2_PRES:
			printf("Key2_Long\n");
			break;
		case KEY3_PRES:
			break;
		case KEY4_PRES:
			break;
		default:
			break;
		}
		time_4 = 0;
	}

	return 1;
}
/*********************************************END OF FILE**********************/

串口效果如下

stm32按鍵長(zhǎng)按短按,學(xué)習(xí)心得,單片機(jī),嵌入式硬件,stm32,c語(yǔ)言

該改進(jìn)版本(1ms太繁瑣了,我改成了25ms檢測(cè)一次)?

主要代碼如下

?1.定時(shí)器部分

#if GENERAL_TIM4
void TIM4_IRQHandler(void) // TIM4中斷
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) // 檢查TIM3更新中斷發(fā)生與否
	{
		time_4++;
		if (time_4 % 25 == 0)
		{
			Check_Key_ON_OFF();
			time_4 = 0;
		}

		TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 清除TIMx更新中斷標(biāo)志
	}
}
#endif

2.按鍵檢測(cè)部分

Key_Scan_Time 檢測(cè)次數(shù)我設(shè)置的為 10

// 檢測(cè)按鍵是否按下
static U8 num_on = 0;
static U8 key_old = 0;
int Check_Key_ON_OFF()
{
	U8 key;
	key = KEY_Scan(1);
	// 與上一次的鍵值比較 如果不相等,表明有鍵值的變化,開(kāi)始計(jì)時(shí)
	if (key != 0 && num_on == 0)
	{
		key_old = key;
		num_on = 1;
	}
	if (key != 0 && num_on >= 1 && num_on <= Key_Scan_Time) // 25*10ms
	{
		num_on++; // 時(shí)間記錄器
	}
	if (key == 0 && num_on > 0 && num_on < Key_Scan_Time) // 短按
	{
		switch (key_old)
		{
		case KEY1_PRES:
			printf("Key1_Short\n");
			break;
		case KEY2_PRES:
			printf("Key2_Short\n");
			break;
		case KEY3_PRES:
			break;
		case KEY4_PRES:
			break;
		default:
			break;
		}
		num_on = 0;
	}
	else if (key == 0 && num_on >= Key_Scan_Time) // 長(zhǎng)按
	{
		switch (key_old)
		{
		case KEY1_PRES:
			printf("Key1_Long\n");
			break;
		case KEY2_PRES:
			printf("Key2_Long\n");
			break;
		case KEY3_PRES:
			break;
		case KEY4_PRES:
			break;
		default:
			break;
		}
		num_on = 0;
	}

	return 1;
}

?五、參考

【stm32單片機(jī)基礎(chǔ)】按鍵狀態(tài)機(jī)實(shí)現(xiàn)長(zhǎng)按和短按https://blog.csdn.net/qq_34142812/article/details/119721386?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%AE%9E%E7%8E%B0%E9%95%BF%E7%9F%AD%E6%8C%89&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-5-119721386.nonecase&spm=1018.2226.3001.4450


完整代碼請(qǐng)關(guān)注衛(wèi)星公眾號(hào)進(jìn)行獲取和咨詢文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-523047.html


到了這里,關(guān)于STM32 -- 實(shí)現(xiàn)按鍵的長(zhǎng)按與短按檢測(cè)(其他單片機(jī)可移植)的文章就介紹完了。如果您還想了解更多內(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獨(dú)立按鍵實(shí)現(xiàn)單擊雙擊長(zhǎng)按功能

    目錄 前言 一、按鍵功能定義 二、使用步驟 1.按鍵初始化 2.按鍵掃描函數(shù)(重點(diǎn)) 總結(jié) 在使用STM32或其他單片機(jī)開(kāi)發(fā)項(xiàng)目時(shí),經(jīng)常需要用到獨(dú)立按鍵進(jìn)行控制。 通常一個(gè)獨(dú)立按鍵需要使用一個(gè)IO口,如果項(xiàng)目需要按鍵實(shí)現(xiàn)多個(gè)功能,往往需要使用到多個(gè)按鍵,需要使用到多個(gè)

    2023年04月17日
    瀏覽(90)
  • STM32系列——用最簡(jiǎn)單的方法學(xué)會(huì)按鍵長(zhǎng)按

    STM32系列——用最簡(jiǎn)單的方法學(xué)會(huì)按鍵長(zhǎng)按

    目錄 前言 1. 按鍵長(zhǎng)按原理 2. Cubmx配置 3. keil5編寫代碼 本教程基于stm32f103c8t6最小系統(tǒng)板,hal庫(kù)開(kāi)發(fā)。 操作簡(jiǎn)單,講解直接清楚,旨在讓大家少走彎路。 (1)要用1個(gè)定時(shí)器,設(shè)置好定時(shí)器周期并打開(kāi)定時(shí)器中斷。 (2)每隔一段時(shí)間進(jìn)入定時(shí)器中斷回調(diào)函數(shù)判斷按鍵是否按下

    2024年02月15日
    瀏覽(27)
  • STM32獨(dú)立按鍵掃描,支持同時(shí)按下、長(zhǎng)按、快速鍵值

    STM32獨(dú)立按鍵掃描,支持同時(shí)按下、長(zhǎng)按、快速鍵值

    有個(gè)項(xiàng)目在實(shí)際應(yīng)用中,采用8個(gè)獨(dú)立按鍵,每個(gè)按鍵都賦予不同功能,實(shí)際使用過(guò)程中很多時(shí)候都是需要比較特殊的按鍵操作,例如:長(zhǎng)按10s按鍵、長(zhǎng)按5s按鍵,或者長(zhǎng)按需要有快速按鍵值的反饋,這個(gè)情況就類似,我們需要快速增加一個(gè)設(shè)定值時(shí),按住加號(hào)+按鍵不松手,這

    2024年02月12日
    瀏覽(17)
  • 初學(xué)者思路-實(shí)現(xiàn)獨(dú)立按鍵檢測(cè)(以STM32為例)

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

    ? ? ? ? 本文以初學(xué)者角度切入,詳細(xì)剖析按鍵檢測(cè)原理,實(shí)現(xiàn)按鍵短按、短按抬起、首次長(zhǎng)按、持續(xù)長(zhǎng)按次數(shù)、長(zhǎng)按抬起功能; 目錄 前言 波形圖分析 抖動(dòng)原因 為什么要消抖 如何消抖 原理圖分析 程序設(shè)計(jì)思路 代碼實(shí)踐 按鍵配置 按鍵檢測(cè) 實(shí)驗(yàn)結(jié)果 留下反思 ? ? ? ? 如

    2024年01月16日
    瀏覽(23)
  • 短按開(kāi)機(jī)/長(zhǎng)按關(guān)機(jī)的電路和代碼實(shí)現(xiàn)思路

    短按開(kāi)機(jī)/長(zhǎng)按關(guān)機(jī)的電路和代碼實(shí)現(xiàn)思路

    在我們實(shí)際的項(xiàng)目中,我們做的設(shè)備或者自己的DIY一個(gè)東西的時(shí)候,經(jīng)常要實(shí)現(xiàn)的一個(gè)功能是:通過(guò)一個(gè)按鍵實(shí)現(xiàn)短按開(kāi)機(jī),長(zhǎng)按關(guān)機(jī)。下面我就給大家簡(jiǎn)單介紹一下其中一種的實(shí)現(xiàn)方法,包含電路和代碼的實(shí)現(xiàn) 首先是電路圖: 先給大家介紹一下上面幾個(gè)網(wǎng)絡(luò)標(biāo)號(hào)的意義:

    2024年02月12日
    瀏覽(126)
  • 正點(diǎn)原子STM32F103精英版+HAL庫(kù)實(shí)現(xiàn)4×4矩陣按鍵檢測(cè)

    正點(diǎn)原子STM32F103精英版+HAL庫(kù)實(shí)現(xiàn)4×4矩陣按鍵檢測(cè)

    首先聲明,本人小白一枚,所做的工作都是借鑒網(wǎng)上的大佬+自己摸索,但是都是親測(cè)實(shí)際有效的。 因?yàn)樗枰墓δ荛_(kāi)發(fā)板自帶按鍵不夠用,所以購(gòu)買了4×4矩陣按鍵,當(dāng)時(shí)購(gòu)買的時(shí)候以為一個(gè)按鍵對(duì)應(yīng)一個(gè)IO口,后來(lái)發(fā)現(xiàn)不是這樣的,會(huì)浪費(fèi)太多的IO口,4×4矩陣鍵盤用8個(gè)

    2024年02月06日
    瀏覽(78)
  • rpc項(xiàng)目中的長(zhǎng)連接與短連接的思考

    rpc項(xiàng)目中的長(zhǎng)連接與短連接的思考

    對(duì)于rpc項(xiàng)目,在接受大佬指導(dǎo)的時(shí)候曾問(wèn)過(guò)對(duì)于長(zhǎng)連接和短連接是處理處理的,在面試的時(shí)候也被問(wèn)起 socket 是長(zhǎng)連接還是短連接,發(fā)現(xiàn)自己沒(méi)有好好思考過(guò)這個(gè)問(wèn)題,因此好好總結(jié)一下。 前置知識(shí)點(diǎn):rpc基礎(chǔ),tcp基礎(chǔ) 類似于http的長(zhǎng)連接和短連接的概念,rpc項(xiàng)目中的短連接

    2024年02月08日
    瀏覽(24)
  • 單個(gè)按鈕實(shí)現(xiàn)長(zhǎng)按開(kāi)關(guān)機(jī),短按可以當(dāng)普通按鈕控制單片機(jī)

    單個(gè)按鈕實(shí)現(xiàn)長(zhǎng)按開(kāi)關(guān)機(jī),短按可以當(dāng)普通按鈕控制單片機(jī)

    在看郭天祥老師的課程時(shí)學(xué)到的電路,之后發(fā)現(xiàn)這種控制原理很流行。 核心思路有兩個(gè): 1、用兩個(gè)二極管隔離開(kāi)q1和io_check,兩端都可以響應(yīng)按鈕的狀態(tài),從而實(shí)現(xiàn)按鈕復(fù)用。 2、用d2和q2,實(shí)現(xiàn)了與的功能,兩者任意一個(gè)對(duì)地短路都可以保持mcu供電。 使用步驟: 1、長(zhǎng)按sw

    2024年01月18日
    瀏覽(19)
  • STM32-按鍵檢測(cè)

    STM32-按鍵檢測(cè)

    做按鍵檢測(cè)時(shí),GPIO為輸入操作 讀取IO口輸入電平調(diào)用的 庫(kù)函數(shù) 為: uint8_t GPIO_ReadInputDataBit (GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); 讀取IO口輸入電平操作的 寄存器 為: GPIOx_IDR :端口輸入寄存器 使用位帶操作讀取IO口輸入電平: PEin(4) -讀取GPIOE.4口電平 PEin(n) -讀取 GPIOE.n口電平 按鍵輸入

    2024年02月06日
    瀏覽(19)
  • STM32速成筆記—按鍵檢測(cè)

    STM32速成筆記—按鍵檢測(cè)

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號(hào)獲取其他資料和工程文件! ?? 期待大家一起學(xué)習(xí)交流! 按鍵檢測(cè)原理比較簡(jiǎn)單,按鍵按下和不按下,其連接引腳的電平是不一樣的,按鍵檢測(cè)正是通過(guò)檢測(cè)按鍵引腳的電平變化來(lái)實(shí)現(xiàn)的。比如按鍵未按下時(shí)引腳電平為高電平,按

    2024年02月08日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包