国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
STM32固件庫使用–按鍵輸入程序
[打印本頁]
作者:
路漫漫
時間:
2020-6-4 16:56
標題:
STM32固件庫使用–按鍵輸入程序
簡介
1.硬件
STM32F103C8T6 獨立按鍵
2.軟件
keil軟件
硬件部分
1.按鍵分類與輸入原理
按鍵按照結構原理科分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關燈;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,后者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。
在單片機應用系統中,除了復位按鍵有專門的復位電路及專一的復位功能外,其他按鍵都是以開關狀態來設置控制功能或輸入數據的。當所設置的功能鍵或數字鍵按下時,計算機應用系統應完成該按鍵所設定的功能,鍵信息輸入時與軟件結構密切相關的過程。
對于一組鍵或一個鍵盤,總有一個接口電路與CPU相連。CPU可以采用查詢或中斷方式了解有無將按鍵輸入,并檢查是哪一個按鍵按下,將該鍵號送人累加器,然后通過跳轉指令轉入執行該鍵的功能程序,執行完成后再返回主程序。
2.按鍵結構與特點
微機鍵盤通常使用機械觸點式按鍵開關,其主要功能式把機械上的通斷轉換為電氣上的邏輯關系。也就是說,它能提供標準的TTL邏輯電平,以便于通用數字系統的邏輯電平相容。機械式按鍵再按下或釋放時,由于機械彈性作用的影響,通常伴隨有一定的時間觸點機械抖動,然后其觸點才穩定下來。其抖動過程如下圖1所示,抖動時間的長短與開關的機械特性有關,一般為5-10ms。在觸點抖動期間檢測按鍵的通與斷,可能導致判斷出錯,即按鍵一次按下或釋放錯誤的被認為是多次操作,這種情況是不允許出現的。為了克服你、按鍵觸點機械抖動所致的檢測誤判,必須采取消抖措施。按鍵較少時,可采用硬件消抖;按鍵較多式,采用軟件消抖。
按鍵編碼
一組按鍵或鍵盤都要通過I/O口線查詢按鍵的開關狀態。根據鍵盤結構的不同,采用不同的編碼。無論有無編碼,以及采用什么編碼,最后都要轉換成為與累加器中數值相對應的鍵值,以實現按鍵功能程序的跳轉。
(2)鍵盤程序
一個完整的鍵盤控制程序應具備以下功能:
a.檢測有無按鍵按下,并采取硬件或軟件措施消抖。
b.有可靠的邏輯處理辦法。每次只處理一個按鍵,期間對任何按鍵的操作對系統不產生影響,且無論一次按鍵 時間有多長,系統僅執行一次按鍵功能程序。
c.準確輸出按鍵值(或鍵號),以滿足跳轉指令要求。
3.獨立按鍵
(1)獨立按鍵
單片機控制系統中,如果只需要幾個功能鍵,此時,可采用獨立式按鍵結構。
獨立按鍵式直接用I/O口線構成的單個按鍵電路,其特點式每個按鍵單獨占用一根I/O口線,每個按鍵的工作不會影響其他I/O口線的狀態。獨立按鍵的典型應用如圖所示。獨立式按鍵電路配置靈活,軟件結構簡單,但每個按鍵必須占用一個I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜采用。
1.png
(39.62 KB)
下載附件
2020-6-4 16:55 上傳
2.png
(37.65 KB)
下載附件
2020-6-4 16:55 上傳
獨立按鍵的軟件常采用查詢式結構。先逐位查詢沒跟I/O口線的輸入狀態,如某一根I/O口線輸入為低電平,則可確認該I/O口線所對應的按鍵已按下,然后,再轉向該鍵的功能處理程序。
軟件部分
key.c
#include"key.h"
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義結構體指針變量
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
//開啟按鍵端口的時鐘
/*按鍵輸入控制GPIO端口的步驟*/
/*
{
1.選擇按鍵的引腳
2.設置按鍵的引腳為浮空輸入
3.使用結構體初始化按鍵
}
*/
//key1
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
//key2
GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
}
/*
* 函數名:Key_Scan
* 描述 :檢測是否有按鍵按下
* 輸入 :GPIOx:x 可以是 A,B,C,D或者 E
* GPIO_Pin:待讀取的端口位
* 輸出 :KEY_OFF(沒按下按鍵)、KEY_ON(按下按鍵)
*/
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{ /*檢測是否有按鍵按下 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
{ /*等待按鍵釋放 *///松手檢測
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
復制代碼
key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
/*
注意:該引腳定義是根據野火STM32F103霸道開發板的原理圖定義的,如果需要自行的設計需要重新更改宏定義選擇不同的GPIO端口
STM32F103ZET6芯片共有144個引腳
其中:GPIOA,GPIOB,GPIOC,GPIOD,GPIOE
*/
// 引腳定義
#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
復制代碼
main.c
#include "stm32f10x.h"
#include "key.h"
int main(void)
{
LED_GPIO_Config();
KEY_GPIO_Config();
while(1)
{
if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
{
GPIO_ResetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//開
GPIO_SetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//關
GPIO_SetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//關
}
if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON )
{
GPIO_SetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//關
GPIO_SetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//關
GPIO_SetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//關
}
}
}
復制代碼
歡迎光臨 ELEOK (http://www.afoofa.cn/)
Powered by Discuz! X5.0