找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 16669|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STM32單片機(jī)實(shí)現(xiàn)按鍵功能 源碼 原理圖 教程等

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
實(shí)驗(yàn) 5  STM32單片機(jī)實(shí)現(xiàn)按鍵功能

前面幾章,我們介紹了  STM32  的  IO  口作為輸出以及系統(tǒng)時(shí)鐘的使用,這
一章,我們將向大家介紹如何使用  STM32  的  IO  口作為輸入用。在本章中,我
們將利用板載的  4  個(gè)按鍵,來控制板子上的 4 個(gè)  LED。  通過本章的學(xué)習(xí),  你
將了解到  STM32  的  IO  口作為輸入口的使用方法。 本章分為以下學(xué)習(xí)目標(biāo):
1、了解按鍵輸入的原理。
2、了解 STM32 的輸入模式。

1.1  硬件電路設(shè)計(jì)
通過前面的學(xué)習(xí),我們學(xué)會(huì)了如何使用 GPIO 輸出模式,接下來,我們來學(xué)
習(xí)怎么使用 GPIO 的輸入模式。 首先我們來看在我們開發(fā)板上面按鍵的原理圖。  




通過上面的原理圖,我可能看到四個(gè)按鍵分別接到單片機(jī)的 PA0、 PE2、
PE3、PE4。

1.2  按鍵消抖
通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開 、閉合時(shí),電壓信號(hào) 如
下圖:  


由于機(jī)械點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定的接通,在斷
開時(shí)也不會(huì)一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動(dòng)。抖動(dòng)
時(shí)間的長短由按鍵的機(jī)械特性決定的,一般為 5ms 到 10ms。按鍵穩(wěn)定閉合時(shí)間
的長短則由操作人員的按鍵動(dòng)作決定的,一般為零點(diǎn)幾秒至數(shù)秒。按鍵抖動(dòng)會(huì)引
起按鍵被誤讀多次。為了確保 CPU 對(duì)鍵的一次閉合僅作一次處理,必須去除按
鍵抖動(dòng)。一般來說一個(gè)簡單的按鍵消抖就是先讀取一次按鍵的狀態(tài),如果得到按
鍵按下之后,延時(shí) 10ms,再次讀取一次按鍵的狀態(tài),如果按鍵還是按下狀態(tài),
那么說明按鍵已經(jīng)按下。

1.3   V3.5 庫函數(shù)輸入函數(shù)介紹
在第一章 LED 燈中我們已經(jīng)介紹了,STM32 的 IO 口配置方式了,那么這

里 我們就不在作介紹了,我們直接介紹庫函數(shù)中的輸入讀取函數(shù)。 輸入讀取函
數(shù)有多個(gè)函數(shù),詳細(xì)大家可以查看《STM32 固件庫使用手冊(cè)(中 文 翻 譯
版 ).pdf 》, 在 這 里 我 們 簡 單 介 紹 一 個(gè) 要 用 到 的 輸 入 函 數(shù)
GPIO_ReadInputDataBit()函數(shù):

這個(gè)函數(shù)是讀取一個(gè)設(shè)置為輸出模式時(shí),一個(gè) IO 口的狀態(tài)值。當(dāng)讀取的 IO 口
為 1 的時(shí)候,輸出 1,當(dāng) IO 口輸出為 0 的時(shí)候,輸出 0。
  1. /*******************************************************************************
  2. *                 
  3. --------------------------------------------------------------------------------
  4. * 實(shí) 驗(yàn) 名                 : 按鍵實(shí)驗(yàn)
  5. * 實(shí)驗(yàn)說明       : 按鍵按下點(diǎn)亮D1-D4對(duì)應(yīng)LED燈
  6. * 連接方式       :
  7. * 注    意                 :         所用函數(shù)在systick.c和led.c,key.c文件內(nèi)
  8. *******************************************************************************/

  9. #include "public.h"
  10. #include "led.h"
  11. #include "key.h"
  12. #include "systick.h"


  13. /*******************************************************************************
  14. * 函 數(shù) 名         : key_pros
  15. * 函數(shù)功能                   : 按鍵處理函數(shù),判斷按鍵按下控制對(duì)應(yīng)的LED燈
  16. * 輸    入         : 無
  17. * 輸    出         : 無
  18. *******************************************************************************/
  19. void key_pros()          //按鍵處理函數(shù)
  20. {
  21.         if(k_up==1)          //判斷按鍵k_up是否按下
  22.         {
  23.                 delay_ms(10); //消抖處理
  24.                 if(k_up==1)         //再次判斷按鍵k_up是否按下
  25.                 {
  26.                         GPIO_Write(GPIOC,(u16)0xfe);                        
  27.                 }
  28.                 while(k_up); //等待按鍵松開
  29.         }
  30.         if(k_down==0)
  31.         {
  32.                 delay_ms(10);
  33.                 if(k_down==0)
  34.                 {
  35.                         GPIO_Write(GPIOC,(u16)(0xfd));               
  36.                 }
  37.                 while(!k_down);
  38.         }
  39.         if(k_left==0)
  40.         {
  41.                 delay_ms(10);
  42.                 if(k_left==0)
  43.                 {
  44.                         GPIO_Write(GPIOC,(u16)(0xfb));               
  45.                 }
  46.                 while(!k_left);
  47.         }
  48.         if(k_right==0)
  49.         {
  50.                 delay_ms(10);
  51.                 if(k_right==0)
  52.                 {
  53.                         GPIO_Write(GPIOC,(u16)(0xf7));               
  54.                 }
  55.                 while(!k_right);
  56.         }        
  57. }

  58. /****************************************************************************
  59. * Function Name  : main
  60. * Description    : Main program.
  61. * Input          : None
  62. * Output         : None
  63. * Return         : None
  64. ****************************************************************************/
  65. int main()
  66. {                  
  67.         LED_Init();        //LED初始化
  68.         key_init();                 //按鍵端口初始化函數(shù)
  69.         GPIO_Write(GPIOC,(u16)(0xff));


  70. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼



下載:
32單片機(jī)實(shí)現(xiàn)按鍵功能.zip (2.85 MB, 下載次數(shù): 84)


評(píng)分

參與人數(shù) 1黑幣 +3 收起 理由
lcw880066 + 3 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:310068 發(fā)表于 2018-4-17 14:54 | 只看該作者
看起來不錯(cuò) 想學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:477269 發(fā)表于 2019-3-2 22:16 | 只看該作者
不錯(cuò),跟著學(xué)習(xí)了         
回復(fù)

使用道具 舉報(bào)

地板
ID:880219 發(fā)表于 2021-2-22 10:44 | 只看該作者
很好 很奈斯 感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表