一、概述
1、按鍵簡(jiǎn)介
按鍵是一種機(jī)械器件,按鍵兩端分別對(duì)應(yīng)某電路的兩個(gè)斷點(diǎn),我們可以通過(guò)按鍵接通和斷開控制該電路的電壓等參數(shù),我們利用按鍵做的應(yīng)用通常有控制繼電器、鍵盤、復(fù)位等。隨著應(yīng)用的擴(kuò)展,按鍵已成為電路板上不可或缺的一部分。
2、按鍵類別簡(jiǎn)介
按鍵主要有四種類型:常開帶復(fù)位、常開不帶復(fù)位、常閉帶復(fù)位、常閉不帶復(fù)位。(本次實(shí)驗(yàn)使用的是常開帶復(fù)位按鍵)
按鍵主要有以下4種工作模式:
常開帶復(fù)位:初始默認(rèn)狀態(tài)是開路,當(dāng)受力按下時(shí)按鍵使電路連通,受力結(jié)束后其自動(dòng)返回開路狀態(tài)。 常開帶不復(fù)位:初始默認(rèn)狀態(tài)是開路,每按下一次按鍵改變一次開閉狀態(tài)。 常閉帶復(fù)位:初始默認(rèn)狀態(tài)是連通,當(dāng)受力按下時(shí)按鍵使電路開路,受力結(jié)束后其自動(dòng)返回連通狀態(tài)。 常閉不帶復(fù)位:初始默認(rèn)狀態(tài)是連通,每按下一次按鍵改變一次開閉狀態(tài)。 3、按鍵消抖
使用手動(dòng)按鍵的時(shí)候,由于機(jī)械抖動(dòng)可能造成按鍵的錯(cuò)誤識(shí)別。一般手動(dòng)按下按鍵然后釋放,按鍵兩片金屬膜接觸的時(shí)間大約為50ms,按鍵松開到穩(wěn)定的時(shí)間為5-10ms。因此,如果在首次檢測(cè)到按鍵被按下后延時(shí)20ms左右再次檢測(cè),即可確認(rèn)是否真的有按鍵被按下,從而消除按鍵抖動(dòng)造成的錯(cuò)誤識(shí)別。本實(shí)驗(yàn)通過(guò)給于一定延時(shí)后再進(jìn)行檢測(cè),從而有效的避免了按鍵抖動(dòng)帶來(lái)的誤判。
二、硬件電路
在iCore3雙核心開發(fā)板中,采用一個(gè)獨(dú)立的按鍵與STM32F407的PH15相連,限流電阻為1K。
三、實(shí)驗(yàn)原理
按鍵的一端與STM32的GPIO(PH15)相連,另外一端接地,且PH15外接一個(gè)1K電流大小的上拉電阻。初始化時(shí)把PH15設(shè)置成輸入模式,當(dāng)按鍵彈起時(shí),PH15由于上拉電阻的作用呈高電平(3.3V);當(dāng)按鍵按下時(shí),PH15直接被按鍵短接到GND,呈低電平。因此判斷PH15的電平變化,可得到按鍵狀態(tài)。
四、源代碼
1、主函數(shù)
/*
* Name : main
* Description : ---
* Author : ysloveivy.
*
* History
* --------------------
* Rev : 0.00
* Date : 11/21/2015
*
* create.
* --------------------
*/
int main(void)
{
int i;
static int work_status = 0; //三色LED燈工作狀態(tài)
static int key_status = 1; //按鍵松開標(biāo)置
led.initialize(); //三色LED燈端口初始化
key.initialize();
while(1){
if(KEY_INPUT)key_status = 1;
if(key_status == 1){
if(!KEY_INPUT){
for(i = 0;i < 10000;i++); //按鍵防抖動(dòng)
if(!KEY_INPUT){
key_status = 0;
work_status += 1;
if(work_status > 2)work_status = 0;
//操作 LED
switch(work_status){
case 0:
LED_RED_ON;
LED_GREEN_OFF;
LED_BLUE_OFF;
break;
case 1:
LED_RED_OFF;
LED_GREEN_ON;
LED_BLUE_OFF;
break;
case 2:
LED_RED_OFF;
LED_GREEN_OFF;
LED_BLUE_ON;
break;
default:
break;
}
}
}
}
}
}
2、GPIO初始化
LED的GPIO初始化配置方式與上一講一致,以下是按鍵的GPIO初始化程序
/*
* Name : initialize
* Description : ---
* Author : ysloveivy.
*
* History
* --------------------
* Rev : 0.00
* Date : 11/21/2015
*
* create.
* --------------------
*/
static int initialize(void)
{
GPIO_InitTypeDef GPIO_uInitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
//設(shè)置連接按鍵的IO端口
GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_15;
//設(shè)置端口為輸入模式
GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_IN;
//設(shè)置速度為第三級(jí)
GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//設(shè)置輸入端口不變化
GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//把設(shè)置的參數(shù)用到結(jié)構(gòu)體
GPIO_Init(GPIOH, &GPIO_uInitStructure);
return 0;
}
3、小知識(shí)
voidRCC_AHB1PeriphClockCmd
(uint32_tRCC_AHB1Periph,FunctionalStateNewState)
此函數(shù)為外設(shè)使能函數(shù),第一個(gè)參數(shù)為需要被使能的外設(shè),第二個(gè)參數(shù)為使能與否。可能很多讀者看到這函數(shù)不知道如何入手,不知道參數(shù)填啥子好,別急,咱先查看一下他的定義:
查看定義方法:雙擊函數(shù)名選中,右擊再點(diǎn)GO TODefinition of ...就可以查看咯。
RCC_AHB1PeriphClockCmd函數(shù)定義如下:
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
{
assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->AHB1ENR |= RCC_AHB1Periph;
}
else
{
RCC->AHB1ENR &= ~RCC_AHB1Periph;
}
}
注意被我標(biāo)紅的字符串,按照剛剛查定義的方法,它會(huì)告訴我們函數(shù)的參數(shù)可以填啥。如查看IS_FUNCTIONAL_STATE:
#define IS_FUNCTIONAL_STATE(STATE)
(((STATE) == DISABLE) || ((STATE) == ENABLE))
我們可以看出第二個(gè)參數(shù)可填寫DISABLE(使能)和ENABLE(不使能)。
小結(jié):上面用外設(shè)的使能函數(shù)為大家介紹了查看函數(shù)的方法,此方法在實(shí)際應(yīng)用經(jīng)常可以用到,當(dāng)我們?cè)陂喿x、修改程序的時(shí)候,遇到哪些不太清楚的函數(shù),就可以用這種方法查看。
五、實(shí)驗(yàn)現(xiàn)象
按鍵每按下一次,ARM·LED顏色變換(紅色、綠色、藍(lán)色輪流交換)一次。
-
STM32
+關(guān)注
關(guān)注
2272文章
10924瀏覽量
357589 -
GPIO
+關(guān)注
關(guān)注
16文章
1216瀏覽量
52383
原文標(biāo)題:STM32學(xué)習(xí)2:GPIO輸入實(shí)驗(yàn)——讀取按鍵狀態(tài)
文章出處:【微信號(hào):changxuemcu,微信公眾號(hào):暢學(xué)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
i.MX6ULL 驅(qū)動(dòng)開發(fā)7—按鍵輸入捕獲與GPIO輸入配置與高低電平讀取
![i.MX6ULL 驅(qū)動(dòng)開發(fā)7—<b class='flag-5'>按鍵</b><b class='flag-5'>輸入</b>捕獲與<b class='flag-5'>GPIO</b><b class='flag-5'>輸入</b>配置與高低電平<b class='flag-5'>讀取</b>](https://file.elecfans.com//web2/M00/45/54/poYBAGKLpr6AdGfGAADTB0hubAU186.png)
【HAL庫(kù)每天一例】第004例:GPIO-按鍵狀態(tài)判斷之掃描式
講講關(guān)于GPIO按鍵輸入的關(guān)鍵要點(diǎn)
GPIO輸入--按鍵
STM32--固件庫(kù)使用--按鍵輸入
![<b class='flag-5'>STM32</b>--固件庫(kù)使用--<b class='flag-5'>按鍵</b><b class='flag-5'>輸入</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F103-入門基礎(chǔ)實(shí)驗(yàn)-GPIO輸入-按鍵(查詢/中斷)控制LED核心代碼(固件庫(kù)版)
![<b class='flag-5'>STM32</b>F103-入門基礎(chǔ)實(shí)驗(yàn)-<b class='flag-5'>GPIO</b><b class='flag-5'>輸入</b>-<b class='flag-5'>按鍵</b>(查詢/中斷)控制LED核心代碼(固件庫(kù)版)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
2、【STM32F0系列學(xué)習(xí)】之—通用輸入輸出端口(GPIO)
![2、【<b class='flag-5'>STM32</b>F0系列學(xué)習(xí)】<b class='flag-5'>之</b>—通用<b class='flag-5'>輸入</b>輸出端口(<b class='flag-5'>GPIO</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32學(xué)習(xí)筆記1——軟硬件基礎(chǔ)之keil5編程與GPIO開發(fā)
![<b class='flag-5'>STM32</b>學(xué)習(xí)筆記1——軟硬件基礎(chǔ)<b class='flag-5'>之</b>keil5<b class='flag-5'>編程</b>與<b class='flag-5'>GPIO</b>開發(fā)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux應(yīng)用開發(fā)【第九章】GPIO編程應(yīng)用開發(fā)
![Linux應(yīng)用開發(fā)【第九章】<b class='flag-5'>GPIO</b><b class='flag-5'>編程</b>應(yīng)用開發(fā)](https://file.elecfans.com//web2/M00/24/ED/pYYBAGGzOE6AcYxJAANS_fETZ9Y449.png)
STM32 按鍵輸入實(shí)驗(yàn)
![<b class='flag-5'>STM32</b> <b class='flag-5'>按鍵</b><b class='flag-5'>輸入</b>實(shí)驗(yàn)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32基本GPIO操作:按鍵輸入(掃描+外部中斷)
![<b class='flag-5'>STM32</b>基本<b class='flag-5'>GPIO</b>操作:<b class='flag-5'>按鍵</b><b class='flag-5'>輸入</b>(掃描+外部中斷)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32筆記之按鍵KEY輸入
![<b class='flag-5'>STM32</b>筆記<b class='flag-5'>之</b><b class='flag-5'>按鍵</b>KEY<b class='flag-5'>輸入</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用GPIO讀取按鈕狀態(tài)
![用<b class='flag-5'>GPIO</b><b class='flag-5'>讀取</b>按鈕<b class='flag-5'>狀態(tài)</b>](https://file1.elecfans.com/web2/M00/8B/DE/wKgZomShIWGAX1zyAAAIfqChZXo410.jpg)
評(píng)論