當按鍵沒有按下去,電容達到飽和,電路短路,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...