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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3461|回復: 5
收起左側

按鍵狀態機配置運用 STM32源程序

  [復制鏈接]
ID:815787 發表于 2020-8-29 17:08 | 顯示全部樓層 |閱讀模式
#include "key.h"
/**********************************************************************
    *函數名:KEY_init
    *功  能:按鍵初始化
    *參  數:無
    *返  回:無
    *備  注:
        KEY  ----  PA0
**********************************************************************/
void KEY_Init(void)
{

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //使能PA時鐘
        GPIO_InitTypeDef GPIO_InitStructure;                                    //定義結構體變量
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空輸入模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

}

/****************************************************************
    驅動層
    1.完成按鍵的消抖,松手檢測
    2.把過程細分為一個個狀態
    3.實現長按與單擊功能
   
    按鍵初始態                  0
    按鍵消抖與確認態          1
    按鍵的單擊和長按狀態      2
    等待按鍵釋放狀態            3

*****************************************************************/
u8 key_driver()
{
    static unsigned char state = 0, time = 0;           //靜態變量具有記憶性,不會再讀取這里的賦值
    unsigned char key_return = N_key;                   //不用靜態,避免按鍵釋放的時候回不到無鍵狀態

    switch (state)
    {
      case 0:                                         // 按鍵初始態  
        if (!KEY) state = 1;                        // 鍵被按下是0,非0即真,狀態轉換到按鍵消抖和確認狀態  1
        break;
      
      case 1:                                          // 按鍵消抖與確認態
        if (!KEY)                                     // 再次確認按鍵是否按下
        {
             time = 0;                              // 按鍵按下,開始計時
             state = 2;                             // 按鍵仍然處于按下,消抖完成,狀態轉換到按下鍵時間的計時狀態,但返回的還是無鍵事件
        }         
        else
             state = 0;                           // 按鍵已抬起,轉換到按鍵初始態。此處完成和實現軟件消抖,其實按鍵的按下和釋放都在此消抖的。
        break;
      
      case 2:
        if(KEY)                                 //前面確認按鍵按下后,此時按鍵釋放為1
        {
             key_return = S_key;                // 此時按鍵釋放,說明是產生一次短操作,返回S_key
             state = 0;                           // 轉換到按鍵初始態
        }
        else if (++time >= 100)                 // 繼續按下,
        {
             key_return = L_key;                //  
             state = 3;                          // 轉換到等待按鍵釋放狀態
        }
        break;

      case 3:                                     // 等待按鍵釋放狀態,此狀態只返回無按鍵事件
        if (KEY) state = 0;                       // 按鍵已釋放,轉換到按鍵初始態
        break;
    }
    return key_return;
}   
u8 key_read(void)  
{  
    static u8 key_m=key_state_0, key_time_1=0;  
    u8 key_return=0,key_temp;  
      
    key_temp=key_driver();  
      
    switch(key_m)  
    {  
        case key_state_0:  
            if(key_temp==S_key)  
            {  
                 key_time_1=0;               // 第1次單擊,不返回,到下個狀態判斷后面是否出現雙擊  
                 key_m=key_state_1;  
            }  
            else  
                 key_return=key_temp;        // 對于無鍵、長鍵,返回原事件  
            break;  
            case key_state_1:  
            if(key_temp==S_key)             // 又一次單擊(間隔肯定<500ms)  
            {  
                 key_return=D_key;          // 返回雙擊鍵事件,回初始狀態  
                 key_m=key_state_0;  
            }  
            else                                 
            {                                // 這里500ms內肯定讀到的都是無鍵事件,因為長鍵>1000ms,在1s前低層返回的都是無鍵  
                 if(++key_time_1>=50)  
                 {  
                      key_return=S_key;      // 500ms內沒有再次出現單鍵事件,返回上一次的單鍵事件  
                      key_m=key_state_0;     // 返回初始狀態  
                 }  
             }  
             break;  
    }
    return key_return;  
}      

評分

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

查看全部評分

回復

使用道具 舉報

ID:815094 發表于 2020-8-29 17:12 | 顯示全部樓層
學到了 謝謝貼主
回復

使用道具 舉報

ID:291265 發表于 2020-9-15 20:40 | 顯示全部樓層
++time >= 100  這個時間,好像不能固定使用100  如果是1秒  ....函數多了,100估計就等于N秒..
如果有  10個按鍵掃描函數  ,這個時間好像就會變長(長按按鍵)
回復

使用道具 舉報

ID:890367 發表于 2022-8-19 14:37 | 顯示全部樓層
你好樓主,key.h這里面是什么???
回復

使用道具 舉報

ID:1040201 發表于 2022-9-2 15:48 | 顯示全部樓層
我還需要細細咀嚼一下。非常感謝
回復

使用道具 舉報

ID:165291 發表于 2022-12-3 21:59 | 顯示全部樓層
沒做完整程序嗎?看不懂啊!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区 | 精品久久久久久久久久久下田 | 久久人人网 | 玖玖玖av| 在线观看免费av网 | 国产专区在线 | 久久久国产一区二区三区四区小说 | 一级黄色毛片a | 天天综合国产 | 最近中文字幕第一页 | 亚洲一区二区三区久久久 | 91中文字幕在线观看 | 黄色片免费看视频 | 亚洲自拍偷拍欧美 | 中文字幕在线视频精品 | 国产精品影视在线观看 | 日韩二 | 久久精品国产一区二区三区不卡 | 久久激情视频 | 国产99久久 | 久久精品国产久精国产 | 亚洲一区二区三区久久 | 亚洲成人一区 | 一区二区电影网 | gogo肉体亚洲高清在线视 | 日本亚洲一区 | 天天操网 | 浴室洗澡偷拍一区二区 | 亚洲精品一区二区三区丝袜 | 欧美一区二区三区在线 | а_天堂中文最新版地址 | 成人在线播放网站 | 91看片| 亚洲一区二区三区在线视频 | 免费观看的av毛片的网站 | 成人欧美一区二区三区黑人孕妇 | 日韩欧美在线播放 | 日韩午夜精品 | 九九热视频这里只有精品 | 综合激情久久 | 亚洲精品久久国产高清情趣图文 |