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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)按鍵單擊雙擊長按程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1053355 發(fā)表于 2022-12-20 12:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
如何實(shí)現(xiàn)一個(gè)按鍵多種功能,這里介紹了按鍵單擊,雙擊,長按,源代碼,親測有效,模塊獨(dú)立,包括.c和.h文件
my_key.c
  1. /**                                       
  2.   * @file    my_key.c                                       
  3.   * @author  xxb                                       
  4.   * @version V1.0                                       
  5.   * @date    07/29/                                      
  6.   * @brief   This file provides all the KEY firmware functions.                                       
  7.   */                                         
  8. #define KEY_GLOBAL                                       
  9.                                        
  10. #include "..\inc\my_key.h"                                       
  11. #include "..\inc\my_led.h"                                       
  12.                                                                         
  13. /****************************************************************************                                       
  14. 【功能說明】按鍵掃描程序                                       
  15. ****************************************************************************/                                          
  16.                                        
  17. U8  Key_Scan(void)                                       
  18. {                                       
  19.                                        
  20.         U8 key_val=NO_KEY;                                
  21.                                        
  22.         //這里添加讀口線的代碼
  23. //        if(!_pa0)
  24. //        {
  25. //                key_val=MyKEY_NAME1;
  26. //        }
  27. //        else if(!_pa2)
  28. //        {
  29. //                key_val=MyKEY_NAME2;
  30. //        }                                
  31.         return (key_val);                                
  32.                                        
  33. }                                       
  34.                                        
  35. /****************************************************************************                                       
  36. 【功能說明】獲取鍵值                                       
  37. ****************************************************************************/                                         
  38.                                        
  39. U8 Get_KeyValue(void)                                       
  40. {                                       
  41.         U8 new_val;                                
  42.         U8 ret=NO_KEY;                                
  43.         static U8  press_time=0;                                
  44.                                        
  45.         new_val=Key_Scan();                        //掃描按鍵               
  46.         switch (key_state)                                
  47.         {                                
  48.                 case 0:                        
  49.                 if(new_val<NO_KEY)   //如果有鍵按下,轉(zhuǎn)到狀態(tài)1。                        
  50.                 {                        
  51.                         old_val=new_val;               
  52.                         press_time=0;               
  53.                         key_state=1;               
  54.                 }                        
  55.                 break;                        
  56.                                        
  57.                 case 1:                        
  58.                 if (old_val==new_val)  //確實(shí)有鍵按下(消抖)                        
  59.                 {                        
  60.                         key_state=2;                                
  61.                 }                        
  62.                 else key_state=0;                        
  63.                 break;        

  64.                 case 2:                        
  65.                 if (old_val==new_val)                  //繼續(xù)按著開始計(jì)時(shí)               
  66.                 {                                
  67.                         if(++press_time>=100)        //100x10=1000MS
  68.                         {        
  69.                                 ret=new_val+10;                //在短按鍵值基礎(chǔ)上加10就是長按
  70.                                 key_state=3;
  71.                         }        
  72.                 }                        
  73.                 else                                                //松開了返回短按        
  74.                 {               
  75.                         ret=new_val;                        //返回短按        
  76.                         key_state=3;        
  77.                 }                        
  78.                 break;                        
  79.                                        
  80.                 case 3:                                                
  81.                 if (new_val==NO_KEY)         //如果松開鍵                        
  82.                 {                        
  83.                         key_state=4;                   //轉(zhuǎn)到狀態(tài)4 (消抖)               
  84.                 }                        
  85.                 break;                        
  86.                                        
  87.                 case 4:                        
  88.                 if (new_val==NO_KEY)         //如果確實(shí)松開                        
  89.                 {                        
  90.                 key_state=0;                   //轉(zhuǎn)到狀態(tài)0                        
  91.                 }                        
  92.                 else   key_state=3;                        
  93.                 break;                        
  94.         }                                
  95.         return (ret);                                
  96. }                                       
  97.                                        
  98. /**                                       
  99.   * @brief  KEY Process program        (10MS調(diào)一次,最短不能低于5MS,最長不大于32MS)                                
  100.   * @param  None                                       
  101.   * @retval None                                       
  102.   */                                       
  103. void Key_Process(void)                                       
  104. {                                       
  105.                                 
  106.         U8 key_val=Get_KeyValue();                                
  107.         switch(key_val)               
  108.         {
  109.                 case MyKEY_NAME1:
  110.                 //短按鍵1處理        
  111.                 break;
  112.                
  113.                 case MyKEY_NAME2:
  114.                 //短按鍵2處理               
  115.                 break;
  116.                
  117.                 case MyKEY_NAME1_LONG:
  118.                 //長按鍵1處理               
  119.                 break;
  120.         }               
  121.         
  122.                
  123. }                                          
復(fù)制代碼


my_key.h
  1. /**
  2.   * @file    my_key.h
  3.   * @author  xxb
  4.   * @version V1.0
  5.   * @date    07/29/2017
  6.   * @brief   This file contains all the functions prototypes for the KEY firmware
  7.   */
  8. #ifndef __MY_KEY_H__
  9. #define __MY_KEY_H__



  10. #include "..\inc\cpu.h"


  11. #ifdef  KEY_GLOBAL
  12. #define KEY_EXT
  13. #else
  14. #define KEY_EXT     extern
  15. #endif

  16. #define NO_KEY     0xFF

  17. #define MyKEY_NAME1                        1
  18. #define MyKEY_NAME2                        2




  19. #define MyKEY_NAME1_LONG        MyKEY_NAME1+10



  20. KEY_EXT U8 key_state;
  21. KEY_EXT U8 old_val;


  22. void Key_Process(void);



  23. #endif
復(fù)制代碼


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:765927 發(fā)表于 2023-2-24 16:09 來自觸屏版 | 只看該作者
51有你更精彩,收藏了
回復(fù)

使用道具 舉報(bào)

板凳
ID:97678 發(fā)表于 2023-2-24 19:38 | 只看該作者
..\inc\my_led.h" 這個(gè)文件沒有,可以發(fā)一下嗎?
程序有錯(cuò)誤!

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲高清 | 国产精品伦一区二区三级视频 | 日韩欧美大片在线观看 | 欧美亚州综合 | 欧美一级黄色免费 | 午夜一级黄色片 | 成人欧美一区二区三区黑人孕妇 | 亚洲国产一区二区三区在线观看 | 久久久久亚洲精品 | 美女视频. | 最新av中文字幕 | 欧美综合一区二区三区 | 日本亚洲欧美 | 国产一区二区在线免费观看 | 久久成人国产 | 国产免费麻豆视频 | 日韩免费一二三区 | 精品成人 | 九色网址 | 精品久久99| 国产婷婷精品av在线 | 亚洲毛片 | 天天操天天玩 | 日本亚洲精品成人欧美一区 | 国产激情在线播放 | 操到爽 | 欧美福利一区 | 亚洲草草视频 | 欧美中国少妇xxx性高请视频 | 国产一区不卡在线观看 | 精品av| 久久高清| 精品伊人| 性视频网 | 一区二区三区电影网 | 日韩精品视频一区二区三区 | 亚洲中午字幕 | 精品乱码一区二区 | 久久av一区二区三区 | 久久不卡日韩美女 | 天天综合亚洲 |