久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32固件庫使用–按鍵輸入程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:424834 發(fā)表于 2020-5-31 07:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
簡介
1.硬件
STM32F103C8T6 獨立按鍵
2.軟件
keil軟件

硬件部分
1.按鍵分類與輸入原理

按鍵按照結(jié)構(gòu)原理科分為兩類,一類是觸點式開關(guān)按鍵,如機(jī)械式開關(guān)、導(dǎo)電橡膠式開關(guān)燈;另一類是無觸點式開關(guān)按鍵,如電氣式按鍵,磁感應(yīng)按鍵等。前者造價低,后者壽命長。目前,微機(jī)系統(tǒng)中最常見的是觸點式開關(guān)按鍵。

在單片機(jī)應(yīng)用系統(tǒng)中,除了復(fù)位按鍵有專門的復(fù)位電路及專一的復(fù)位功能外,其他按鍵都是以開關(guān)狀態(tài)來設(shè)置控制功能或輸入數(shù)據(jù)的。當(dāng)所設(shè)置的功能鍵或數(shù)字鍵按下時,計算機(jī)應(yīng)用系統(tǒng)應(yīng)完成該按鍵所設(shè)定的功能,鍵信息輸入時與軟件結(jié)構(gòu)密切相關(guān)的過程。

對于一組鍵或一個鍵盤,總有一個接口電路與CPU相連。CPU可以采用查詢或中斷方式了解有無將按鍵輸入,并檢查是哪一個按鍵按下,將該鍵號送人累加器,然后通過跳轉(zhuǎn)指令轉(zhuǎn)入執(zhí)行該鍵的功能程序,執(zhí)行完成后再返回主程序。

2.按鍵結(jié)構(gòu)與特點

微機(jī)鍵盤通常使用機(jī)械觸點式按鍵開關(guān),其主要功能式把機(jī)械上的通斷轉(zhuǎn)換為電氣上的邏輯關(guān)系。也就是說,它能提供標(biāo)準(zhǔn)的TTL邏輯電平,以便于通用數(shù)字系統(tǒng)的邏輯電平相容。機(jī)械式按鍵再按下或釋放時,由于機(jī)械彈性作用的影響,通常伴隨有一定的時間觸點機(jī)械抖動,然后其觸點才穩(wěn)定下來。其抖動過程如下圖1所示,抖動時間的長短與開關(guān)的機(jī)械特性有關(guān),一般為5-10ms。在觸點抖動期間檢測按鍵的通與斷,可能導(dǎo)致判斷出錯,即按鍵一次按下或釋放錯誤的被認(rèn)為是多次操作,這種情況是不允許出現(xiàn)的。為了克服你、按鍵觸點機(jī)械抖動所致的檢測誤判,必須采取消抖措施。按鍵較少時,可采用硬件消抖;按鍵較多式,采用軟件消抖。


按鍵編碼

一組按鍵或鍵盤都要通過I/O口線查詢按鍵的開關(guān)狀態(tài)。根據(jù)鍵盤結(jié)構(gòu)的不同,采用不同的編碼。無論有無編碼,以及采用什么編碼,最后都要轉(zhuǎn)換成為與累加器中數(shù)值相對應(yīng)的鍵值,以實現(xiàn)按鍵功能程序的跳轉(zhuǎn)。

(2)鍵盤程序

一個完整的鍵盤控制程序應(yīng)具備以下功能:

a.檢測有無按鍵按下,并采取硬件或軟件措施消抖。

b.有可靠的邏輯處理辦法。每次只處理一個按鍵,期間對任何按鍵的操作對系統(tǒng)不產(chǎn)生影響,且無論一次按鍵 時間有多長,系統(tǒng)僅執(zhí)行一次按鍵功能程序。

c.準(zhǔn)確輸出按鍵值(或鍵號),以滿足跳轉(zhuǎn)指令要求。

3.獨立按鍵

(1)獨立按鍵

單片機(jī)控制系統(tǒng)中,如果只需要幾個功能鍵,此時,可采用獨立式按鍵結(jié)構(gòu)。

獨立按鍵式直接用I/O口線構(gòu)成的單個按鍵電路,其特點式每個按鍵單獨占用一根I/O口線,每個按鍵的工作不會影響其他I/O口線的狀態(tài)。獨立按鍵的典型應(yīng)用如圖所示。獨立式按鍵電路配置靈活,軟件結(jié)構(gòu)簡單,但每個按鍵必須占用一個I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜采用。


獨立按鍵的軟件常采用查詢式結(jié)構(gòu)。先逐位查詢沒跟I/O口線的輸入狀態(tài),如某一根I/O口線輸入為低電平,則可確認(rèn)該I/O口線所對應(yīng)的按鍵已按下,然后,再轉(zhuǎn)向該鍵的功能處理程序。

軟件部分
key.c

  1. #include"key.h"
  2. void KEY_GPIO_Config(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;         //定義結(jié)構(gòu)體指針變量
  5.         RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);  
  6. //開啟按鍵端口的時鐘
  7.         /*按鍵輸入控制GPIO端口的步驟*/
  8.         /*
  9.           {
  10.    1.選擇按鍵的引腳
  11.    2.設(shè)置按鍵的引腳為浮空輸入
  12.    3.使用結(jié)構(gòu)體初始化按鍵
  13.    }
  14.         */
  15.   //key1
  16.         GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  18.         GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
  19.         //key2
  20.         GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  22.         GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);        
  23.         
  24. }
  25. /*
  26. * 函數(shù)名:Key_Scan
  27. * 描述  :檢測是否有按鍵按下
  28. * 輸入  :GPIOx:x 可以是 A,B,C,D或者 E
  29. *                     GPIO_Pin:待讀取的端口位         
  30. * 輸出  :KEY_OFF(沒按下按鍵)、KEY_ON(按下按鍵)
  31. */
  32. uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  33. {        /*檢測是否有按鍵按下 */
  34.         if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
  35.         {         /*等待按鍵釋放 *///松手檢測
  36.                 while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);           
  37.                 return         KEY_ON;         
  38.         }
  39.         else
  40.                 return KEY_OFF;
  41. }

復(fù)制代碼
key.h

  1. #ifndef __KEY_H
  2. #define __KEY_H

  3. #include "stm32f10x.h"
  4. /*
  5. 注意:該引腳定義是根據(jù)野火STM32F103霸道開發(fā)板的原理圖定義的,如果需要自行的設(shè)計需要重新更改宏定義選擇不同的GPIO端口
  6. STM32F103ZET6芯片共有144個引腳
  7. 其中:GPIOA,GPIOB,GPIOC,GPIOD,GPIOE
  8. */

  9. //  引腳定義
  10. #define    KEY1_GPIO_CLK     RCC_APB2Periph_GPIOA
  11. #define    KEY1_GPIO_PORT    GPIOA                           
  12. #define    KEY1_GPIO_PIN         GPIO_Pin_0

  13. #define    KEY2_GPIO_CLK     RCC_APB2Periph_GPIOC
  14. #define    KEY2_GPIO_PORT    GPIOC                  
  15. #define    KEY2_GPIO_PIN         GPIO_Pin_13


  16. /** 按鍵按下標(biāo)置宏
  17.         *  按鍵按下為高電平,設(shè)置 KEY_ON=1, KEY_OFF=0
  18.         *  若按鍵按下為低電平,把宏設(shè)置成KEY_ON=0 ,KEY_OFF=1 即可
  19.         */
  20. #define KEY_ON        1
  21. #define KEY_OFF        0

  22. void KEY_GPIO_Config(void);
  23. uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

  24. #endif


復(fù)制代碼
main.c
  1. #include "stm32f10x.h"   
  2. #include "key.h"

  3. int main(void)
  4. {
  5.         
  6.           LED_GPIO_Config();
  7.           KEY_GPIO_Config();
  8.                 while(1)                           
  9.         {           
  10.                 if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON  )
  11.                 {
  12.                         GPIO_ResetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//開
  13.                         GPIO_SetBits(LED2_GPIO_PORT   , LED2_GPIO_PIN);//關(guān)
  14.                         GPIO_SetBits(LED3_GPIO_PORT   , LED3_GPIO_PIN);//關(guān)
  15.                 }  

  16.                 if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON  )
  17.                 {
  18.                     GPIO_SetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//關(guān)
  19.                         GPIO_SetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//關(guān)
  20.                         GPIO_SetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//關(guān)
  21.                         
  22.                 }               
  23.         }
  24. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99精品久久久国产一区二区三 | 精品欧美一区二区三区精品久久 | 羞羞的视频在线看 | 你懂的免费在线 | 亭亭五月激情 | 国产精品久久影院 | 精品国产乱码久久久久久蜜柚 | 日韩三区在线 | 欧美国产精品一区二区三区 | 欧美精品一二区 | 正在播放国产精品 | 国产精品成人在线播放 | 亚洲国产精品一区二区第一页 | av黄色片在线观看 | 日日网| 国产精品久久在线 | 国产美女一区二区 | 中文字幕在线电影观看 | 亚洲狠狠爱一区二区三区 | 麻豆va | 国产综合av| 国产精品久久 | 日本精品久久 | 一区二区三区中文字幕 | 人人看人人搞 | 国产激情片在线观看 | 国产精品色av | 99国产精品久久久久老师 | 久久精品视频一区二区三区 | 视频在线亚洲 | 国产精品久久在线观看 | 成人在线一区二区 | 日韩在线欧美 | 久久一久久 | 久久狠狠 | 成人在线小视频 | 成人在线视频网 | 欧美九九 | 欧美成人免费在线 | 99久热| 日日夜夜精品免费视频 |