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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5195|回復: 0
打印 上一主題 下一主題
收起左側

STM32 GPIO按鍵檢測技術(按鍵復用源碼)

[復制鏈接]
跳轉到指定樓層
樓主
自己剛剛學STM32一個禮拜,學完了GPIO,嘗試自己寫了按鍵的檢測,最簡單的單擊,
能準確的識別每一次,再到雙擊(其實多擊邏輯一樣),長按等復用模式。
這里提一下按鍵復用的思想:其實在做產品的時候,有復用思想可以節約按鍵,降低后期產品的PCB體積大小
具體的STM32實現的功能我簡述下,剛剛入門的萌新可以看下,寫的一般。
(1)環境復用:這個簡單,就是不同環境設置不同標志量即可
(2)組合復用:這里就是通過按兩次實現一個組合的效果,當然你寫復雜了有許多組合的效果,我這個小程序主要是在220ms內連續
按下兩次,PC13口連接的LED會閃爍2.5s,間隔是50ms。
(3)時間復用:就是長按,通過按鍵時間的長短實現不同功能。(長按復位,其中STM32的復位必須先關閉中斷,再調用NVIC中的復位函數
因為復位前有個延時,會影響復位的效果)
注:如果能用TIM(定時器)檢測按鍵,實現按鍵效果,更加perfect
萌新們一定要學會自己建立STM32工程喲


這是我的通過按鍵來實現不同功能的燈亮的實驗。
1.主要用到GPIO輸入與輸出的技術。
2.按鍵的復用功能
(1).環境復用:這個簡單,不同標志下實現不同功能,這里就不做功能實現了。
(2).組合復用:連續兩次按鍵(220ms連續按兩次),實現Led亮滅2.5s,亮滅間隔為50ms。
(3).時間切換:單次按鍵實現的Led的亮滅,長按實現STM32MicroController系統的復位。

單片機源程序如下:
  1. #include <STM32F10X.H>
  2. #include <misc.h>

  3. #define PC14 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_14)           //獨C14按鍵的值
  4. #define PC15_On GPIO_SetBits(GPIOC,GPIO_Pin_15)                  //Set是置1
  5. #define PC15_Off GPIO_ResetBits(GPIOC,GPIO_Pin_15)               //Reset置0
  6. #define PC13_Off GPIO_SetBits(GPIOC,GPIO_Pin_13)                 //Set是置1
  7. #define PC13_On GPIO_ResetBits(GPIOC,GPIO_Pin_13)                //Reset置0

  8. u16 Led_Count=0,Button_Flag=0,time=0;
  9. void RCC_Configuration(void);     //復位與時鐘寄存器初始化函數
  10. void Delay_ms(u16 n);             //延時函數ms
  11. void GPIO_Configuration(void);    //通用IO口初始化函數
  12. void System_Reset(void);          //系統復位函數
  13. void Led_Show(void);              //Led亮滅顯示函數
  14. u16 Key_Mode(u16 time);           //時間復用模式
  15. void Group_Button(void);          //組合復用模式(雙擊,多擊鼠標的檢測函數)



  16. int main(void)
  17. {
  18.         RCC_Configuration();
  19.         GPIO_Configuration();
  20.         while(1)
  21.         {
  22.                 switch(Key_Mode(100))
  23.                 {
  24.                         case 0:break;
  25.                         case 1:Led_Show();break;
  26.                         case 2:System_Reset();break;
  27.                         default:break;
  28.                 }
  29.                 Group_Button();
  30.         }
  31. }
  32.         
  33. void RCC_Configuration(void)
  34. {
  35.         SystemInit();
  36. }

  37. void Delay_ms(u16 n)
  38. {
  39.         u16 i;
  40.         while(n--)
  41.         {
  42.                 i=12000;
  43.                 while(i--);
  44.         }
  45. }

  46. void GPIO_Configuration(void)
  47. {
  48.         //配置按鍵輸出的工作模式,同組的同類型一次配置,同組不同類型分次配置
  49.         GPIO_InitTypeDef GPIO_InitStructure;
  50.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  51.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
  52.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  53.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  54.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  55.         
  56.         //配置按鍵輸入的工作模式
  57.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
  58.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  59.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  60.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  61.         
  62.         PC15_Off;PC13_Off;
  63. }

  64. void System_Reset(void)                                                //系統軟件復位函數
  65. {
  66.         PC13_On;
  67.         Delay_ms(500);
  68.         __set_FAULTMASK(1);                                                        //首先先要關閉中斷
  69.         NVIC_SystemReset();                                     //在進行軟復位
  70. }

  71. u16 Key_Mode(u16 time)                        //獨立按鍵函數
  72. {
  73.         u16 i=0;
  74.         if(PC14 == 0)
  75.         {
  76.                 Delay_ms(10);
  77.                 if(PC14 == 0)
  78.                 {
  79.                         while(!PC14)
  80.                         {
  81.                                 Delay_ms(10);i++;
  82.                         }
  83.                         Button_Flag++;
  84.                 }
  85.         }
  86.         if(i == 0)
  87.                 return 0;
  88.         else
  89.         {
  90.                 if(i < time)
  91.                         return 1;
  92.                 else
  93.                         return 2;
  94.         }
  95. }

  96. void Led_Show(void)
  97. {
  98.         Led_Count++;
  99.         if(Led_Count == 1)
  100.         PC15_On;
  101.         else
  102.         {
  103.                 PC15_Off;Led_Count=0;
  104.         }
  105. }

  106. void Group_Button(void)                                                                //雙擊鼠標和多擊鼠標的模塊寫出來了,后期用定時器系統能干其他的事情
  107. {                                                                                                                                                        //其實單片機是單線程,所謂的中斷無非是效率更高,其實主程序仍不能干其他事情
  108.         u16 i=0;
  109.         if(Button_Flag == 1)
  110.         {
  111.                 PC13_On;Delay_ms(1);time++;
  112.         }
  113.         else
  114.         {
  115.                 Button_Flag = 0;PC13_Off;
  116.                 if(time < 220 && time > 5)
  117.                 {
  118.                         time = 0;
  119.                         for(i=0;i<50;i++)
  120.                         {
  121.                                 if(i%2 == 0)
  122.                                 {PC13_On;Delay_ms(50);}
  123.                                 else
  124.                                 {PC13_Off;Delay_ms(50);}
  125.                         }
  126.                 }
  127.                 else time = 0;
  128.         }               
  129. }
復制代碼

所有資料51hei提供下載:
DetectKey.7z (191.26 KB, 下載次數: 26)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色av网站免费看 | 精品国产欧美一区二区三区不卡 | 亚洲精品v| 日本一区二区三区精品视频 | 99精品免费视频 | 成人午夜精品 | 在线精品一区二区 | 中文字幕第90页 | 国产电影一区二区 | 成人在线观看免费 | 在线不卡av| 91av亚洲| 久久久久久久久毛片 | 国产在线a | 中文字幕日韩专区 | 国产九九九九 | 亚洲最大福利网 | 一区二区在线 | 久久国产精品一区二区三区 | 国产在线视频三区 | 夜夜操天天干 | 久久不卡区 | 亚洲综合第一页 | 在线视频亚洲 | 日韩在线不卡 | 蜜桃av一区二区三区 | 免费在线看黄 | av一区二区三区四区 | 国产成人精品a视频一区www | 一区二区三区四区在线视频 | 四虎在线观看 | 中文字幕日韩欧美 | www.久久久久久久久久久 | 欧洲一区二区在线 | www.一区二区三区.com | 麻豆av网站 | 国产色婷婷精品综合在线手机播放 | 久久久精彩视频 | 日本成人在线观看网站 | 国产精品91久久久久久 | 中文字幕在线免费观看 |