7 按鍵檢測

2021-10-05 20:47:02 字數 4208 閱讀 1826

當按鍵沒有按下去,電容達到飽和,電路短路,gpio口pa0為低電平;當按鍵k1按下,四腳按鍵左側1,2和右側3,4導通,pa0變成高電平。而且與按鍵併聯的電容放電達到了消除按鍵抖動產生的波紋的效果,避免檢測不正確。

確定好兩個gpio口:goioa_0和gpioc_13,進行埠初始化,還要對埠進行檢測,最後編寫main函式。

但是檢測到按鍵了,需要有個原件給反映出來,可以設計乙個led燈或者蜂鳴器

bsp_key.c檔案內容

#include "bsp_key.h"

/** 按鍵初始化

* 初始化兩個按鍵gpio埠為浮空輸入

*/void key_gpio_config(void)

/** * @brief 檢測是否有按鍵按下

* @param gpiox:具體的埠, x 可以是(a...g)

* @param gpio_pin:具體的埠位, 可以是 gpio_pin_x(x 可以是 0...15)

* @retval 按鍵的狀態

* @arg key_on:按鍵按下

* @arg key_off:按鍵沒按下

*/uint8_t key_scan(gpio_typedef* gpiox, uint16_t gpio_pin)

else

return key_off;

}

bsp_key.**件內容
#ifndef __bsp_key

#define __bsp_key

#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

/* 按鍵檢測 */

/** 按鍵按下標誌巨集

* 按鍵按下為高電平,設定 key_on = 1, key_off = 0

* 若按鍵按下為低電平,把巨集設定成 key_on = 0, key_off = 1即可

*/#define key_on 1

#define key_off 0

void key_gpio_config(void);

uint8_t key_scan(gpio_typedef* gpiox, uint16_t gpio_pin);

#endif /* __bsp_key */

bsp_led.**件內容
#ifndef __bsp_led_h    //條件編譯巨集,防止別的庫包括該函式的時候,重複編譯

#define __bsp_led_h

#include "stm32f10x.h"

//綠色

#define led1_g_gpio_pin gpio_pin_0

#define led1_g_gpio_port gpiob

#define led1_g_gpio_clk rcc_apb2periph_gpiob

//藍色

#define led2_g_gpio_pin gpio_pin_1

#define led2_g_gpio_port gpiob

#define led2_g_gpio_clk rcc_apb2periph_gpiob

//紅色

#define led3_g_gpio_pin gpio_pin_1

#define led3_g_gpio_port gpiob

#define led3_g_gpio_clk rcc_apb2periph_gpiob

/* 直接操作暫存器的方法控制io口 */

#define digitalhi(p,i) //輸出為高電平

#define digitallo(p,i) //輸出為低電平

#define digitaltoggle(p,i) //輸出為反轉狀態

/* 定義控制io的巨集 */

#define led1_toggle digitaltoggle(led1_g_gpio_port,led1_g_gpio_pin)

#define led1_off digitalhi(led1_g_gpio_port,led1_g_gpio_pin)

#define led1_on digitallo(led1_g_gpio_port,led1_g_gpio_pin)

#define led2_toggle digitaltoggle(led2_g_gpio_port,led2_g_gpio_pin)

#define led2_off digitalhi(led2_g_gpio_port,led2_g_gpio_pin)

#define led2_on digitallo(led2_g_gpio_port,led2_g_gpio_pin)

#define led3_toggle digitaltoggle(led3_g_gpio_port,led3_g_gpio_pin)

#define led3_off digitalhi(led3_g_gpio_port,led3_g_gpio_pin)

#define led3_on digitallo(led3_g_gpio_port,led3_g_gpio_pin)

/* 基本的混色,後面高階用法使用pwm可混出全彩顏色,且效果更好 */

//綠#define led_green \

led1_on; \

led2_off; \

led3_off;

//藍#define led_blue \

led1_off; \

led2_on; \

led3_off;

//紅#define led_red \

led1_off; \

led2_off; \

led3_on;

//黃(紅+綠)

#define led_yellow \

led1_on; \

led2_off; \

led3_on;

//紫(紅+藍)

#define led_purple \

led1_off; \

led2_on; \

led3_on;

//白(綠+紅+藍)

#define led_white \

led1_on; \

led2_on; \

led3_on;

//黑 (全部關閉)

#define led_black \

led1_off; \

led2_off; \

led3_off;

void led_gpio_config(void);

#endif /* __bsp_led_h*/

bsp_led.c檔案內容
//bsp :board support package 板級支援包

#include "bsp_led.h"

void led_gpio_config(void)

#include "stm32f10x.h"   // 相當於51微控制器中的  #include #include "bsp_key.h"

#include "bsp_led.h"

void delay(__io uint32_t count);

/** * @brief 主函式

* @param 無

* @retval 無

*/int main(void)

}void delay(__io uint32_t count)

矩陣鍵盤 按鍵檢測 按鍵次數檢測

在進行矩陣按鍵檢測的時候,對於51微控制器來說,由於io輸出電流較小,驅動能力不足,若用乙個a號io口去檢測b號io口,無論b口高電平還是低電平,a口皆是低電平 若a口置高,可用來檢測b口的低電平。io.h檔案 ifndef matrix h define matrix h include stc1...

按鍵檢測(二)

基本功是每按一次按鍵,訊號電平發生一次反轉 按鍵長按或者不按訊號狀態不發生變化,比如按下後led點亮,此時繼續保持按下或者鬆開,led狀態不變,當按鍵再次按下後,led才會熄滅。應用場景 如果按鍵按下為高電平,那麼就可以用來檢測按鍵按下時的上公升沿,或者中斷的上公升沿,調整防抖時延實現不同的靈敏度。...

python檢測按鍵按下 如何檢測按鍵是否被按下?

對於python,作為乙個新手,我嘗試著用一本指南來編寫我自己的遊戲。不過,在這個遊戲中,我試著檢測什麼時候乙個鍵一直被按住而不是僅僅按下。我使用的當前 不會使字元移動,而且如果沒有實現halt self,evt 會導致飛船在按住按鈕足夠長時間後無法控制地加速。在from tkinter impor...