色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

按鍵消抖/開關量信號監測實現方案

玩轉單片機與嵌入式 ? 來源:玩轉單片機與嵌入式 ? 2023-09-19 11:35 ? 次閱讀

關于按鍵消抖或者開關量信號監測,可以參考本公眾號的另外一篇原創文章:按鍵消抖常用的軟硬件方法。在該文章中介紹了兩種軟件延時的方式。但也都各有缺點。

一:舊方案

方案一:純軟件延時

sbit KEY = P1^3;
///按鍵讀取函數
uint8_t GetKey(void)
{
    if(KEY == 1)
    {
        DelayMs(20);        //延時消抖
        if(KEY == 1)
        {
            return 1;
        }
        else 
        {
            return 0;
        }
    }
    else 
    {
        return 0;
    }
}
致命缺點:在延時的時候一直占用cpu的資源,如果在延時的時候,有其他外部中斷或者搶占事件,系統完全沒有響應的

方案二:中斷消抖

此處不在貼出代碼:感興趣的同學可到文章中查看:按鍵消抖常用的軟硬件方法

致命缺點:多占用中斷資源。操作復雜。在資源就是成本的產品中(多占用一個中斷可能會導致需要選擇價格更高的MCU),這種方案的缺點更加明顯。

推薦方案

本文推薦一種更高效、合適,已在產品中使用過的軟件設計方案。直接上代碼。

#include 


// 定義開關信號結構體
typedef struct {
    bool lastState;       // 上次開關信號狀態
    bool currentState;    // 當前開關信號狀態
    bool validState;      // 有效的開關信號狀態
    int debounceDelayCounter;  // 開關信號消抖計數器
} DebouncedSwitch;


// 初始化開關信號結構體
void initializeSwitch(DebouncedSwitch* switchObj) {
    switchObj->lastState = false;
    switchObj->currentState = false;
    switchObj->validState = false;
    switchObj->debounceDelayCounter = 0;
}


// 模擬讀取開關信號狀態的函數
bool readSwitchState() {
    // 在這里替換為實際的開關信號讀取代碼
    // 返回開關信號的當前狀態(true表示開,false表示關)
    return false;
}


// 處理開關信號消抖的函數
void debounceSwitch(DebouncedSwitch* switchObj, int debounceTime) {
    // 讀取當前開關信號狀態
    switchObj->currentState = readSwitchState();


    // 如果當前狀態與上次狀態不同,重置計數器并更新上次狀態
    if (switchObj->currentState != switchObj->lastState) {
        switchObj->debounceDelayCounter = 0;
    } else {
        // 如果狀態相同,增加計數器值
        switchObj->debounceDelayCounter++;
    }


    // 如果計數器達到指定的消抖時間,表示開關信號狀態穩定
    if (switchObj->debounceDelayCounter >= (debounceTime / 10)) {
        // 如果當前狀態與 validState 不同,表示發生了有效的狀態變化
        if (switchObj->currentState != switchObj->validState) {
            switchObj->validState = switchObj->currentState;
        }
    }
    // 更新上次狀態
    switchObj->lastState = switchObj->currentState;
}


int main() {
    // 創建一個開關信號的DebouncedSwitch結構體
    DebouncedSwitch switchObj;
    initializeSwitch(&switchObj);


    while (1) {
        debounceSwitch(&switchObj, 100); // 設置消抖時間為100毫秒
        if (switchObj.validState) {
            if (switchObj.validState) {
                // 執行開關信號為開的操作
                printf("開關信號為開
");
            } else {
                // 執行開關信號為關的操作
                printf("開關信號為關
");
            }
        }


        // 在這里可以添加其他需要執行的代碼


        // 模擬延時或等待開關信號狀態變化
        // 這里使用usleep函數來模擬10毫秒的延時
        // 實際上,你需要根據你的硬件和操作系統來等待開關信號狀態變化
        usleep(10000); // 10毫秒
    }


    return 0;
}

1、函數詳解:

debounceSwitch函數該函數用于處理開關信號的消抖,以確保穩定的開關狀態。 它接受一個指向 DebouncedSwitch 結構體的指針,該結構體包含了上次狀態、當前狀態、有效狀態等信息,以及消抖時間的設置。

該函數的被調用周期為10ms(可以與產品程序中其他任務并行執行)。

2、函數的工作流程如下:

1)讀取當前開關信號狀態。

2)如果當前狀態與上次狀態不同,重置計數器并更新上次狀態。

3)如果當前狀態與上次狀態相同,增加計數器值。

4)如果計數器達到指定的消抖時間,表示開關信號狀態穩定。

5)如果當前狀態與 validState 不同,表示發生了有效的狀態變化,更新有效狀態。

6)更新上次狀態以便下一次比較

3、優點介紹:

1)擴展性:

debounceSwitch該函數使用結構體指針的形式,提供了開關量檢測的框架,需要多個開關量/按鍵檢測時,實例化對應的按鍵變量即可。例如:main函數的示例中實例化了switchObj,多有多個按鍵可以多定義不同的switchObj即可。如下:代碼所展示:
DebouncedSwitch switchObj_key1;
DebouncedSwitch switchObj_key2;


//其他代碼


debounceSwitch(&switchObj_key1, 100);
debounceSwitch(&switchObj_key2,50);

2、高度可定制:

 debounceSwitch函數中的消抖時間是作為參數傳遞的,這使得消抖時間可以根據不同的開關信號或應用場景進行定制。這種可定制性允許您在不同情況下使用不同的消抖時間,以滿足特定需求。

3、適用于實時系統:

相對于純軟件延時消抖,debounceSwitch函數是更可靠的,因為它不依賴于軟件的延時,而是基于實際的狀態變化來判斷開關信號的穩定性。這使得它適用于實時系統和對時間精度要求較高的應用。

總結

當然,作為一個產品中使用的函數還有很多可優化的空間,比如:函數內判斷指針不為空。進行參數的有效性檢查等等。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開關量
    +關注

    關注

    2

    文章

    169

    瀏覽量

    15062
  • 源碼
    +關注

    關注

    8

    文章

    639

    瀏覽量

    29185
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 按鍵消抖
    +關注

    關注

    2

    文章

    27

    瀏覽量

    10448

原文標題:共享一個產品中使用的按鍵消抖/開關量監測函數(附源碼,可移植)

文章出處:【微信號:玩轉單片機與嵌入式,微信公眾號:玩轉單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    按鍵的硬件電路原理詳解

    按鍵通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個
    的頭像 發表于 02-02 09:42 ?9502次閱讀
    <b class='flag-5'>按鍵</b>的硬件<b class='flag-5'>消</b><b class='flag-5'>抖</b>電路原理詳解

    按鍵電路的實現方式

    按鍵通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個
    的頭像 發表于 08-29 11:25 ?4632次閱讀

    按鍵

    請問大家的按鍵是用什么方法解決的,如普通的按鍵如何
    發表于 09-26 22:17

    技術分享:明德揚按鍵的原理和基于fpga的設計

    ,利用硬件來減輕軟件工作,通過硬件加速軟件處理,即可做到軟件并行化,因而在按鍵
    發表于 08-02 10:38

    按鍵及原理是什么

    淺談:在設計單片機按鍵輸入的時候,進行按鍵是防止按鍵輸入被CPU誤讀多次的必要手段。一、按鍵
    發表于 07-21 06:02

    MCU按鍵問題

    按鍵問題機械按鍵是必須的,1、延時
    發表于 11-04 06:37

    有什么方法去實現按鍵

    怎樣用軟件即程序來實現按鍵呢?有什么方法去實現按鍵
    發表于 12-15 07:25

    介紹獨立按鍵方法

    目錄按鍵介紹按鍵方法按鍵檢測原理C51例程歡迎加QQ及郵件交流按鍵介紹
    發表于 01-14 07:49

    VHDL—按鍵

    達到去抖動的目的。本例中用狀態機實現電路:端口描述:clk 輸入檢測時鐘;reset 復位信號;din 原始按鍵
    發表于 11-11 17:17 ?2次下載

    vhdl按鍵程序(七種方式實現按鍵

    按鍵通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個
    發表于 01-29 16:04 ?5.6w次閱讀
    vhdl<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>程序(七種方式<b class='flag-5'>實現</b><b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>)

    基于尖峰脈沖的按鍵

    按鍵通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個
    的頭像 發表于 11-20 07:09 ?3065次閱讀

    為什么要進行按鍵

    按鍵通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個
    的頭像 發表于 04-19 14:55 ?1w次閱讀

    FPGA內實現按鍵的方法

    通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下
    的頭像 發表于 09-05 10:43 ?1219次閱讀
    FPGA內<b class='flag-5'>實現</b><b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>的方法

    為什么要進行按鍵按鍵抖動的原理 按鍵的方法

    按鍵通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個
    的頭像 發表于 02-17 17:07 ?1.8w次閱讀
    為什么要進行<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>?<b class='flag-5'>按鍵</b>抖動的原理 <b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>的方法

    如何在FPGA中實現按鍵

    在FPGA(現場可編程門陣列)中實現按鍵是一個重要的設計環節,特別是在處理用戶輸入時,由于物理按鍵的機械特性和電氣特性,
    的頭像 發表于 08-19 18:15 ?1769次閱讀
    主站蜘蛛池模板: 甜性涩爱快播| 99精品免费久久久久久久久蜜桃| 亚洲99精品A片久久久久久| 午夜伦理 第1页| 亚洲伊人久久一次| 最近更新2019中文字幕国语 | 欧美精品一卡二卡| 人与禽交3d动漫羞羞动漫| 忘忧草在线社区WWW日本直播 | 我的家庭女教师| 亚洲免费视频日本一区二区| 曰本真人00XX动太图| mdapptv麻豆下载| 国产精品久免费的黄网站| 精品国产自在现线拍400部| 免费观看久久| 色欲AV人妻精品麻豆AV| 亚洲男人的天堂久久精品麻豆| 2020最新无码国产在线视频| 吃奶啃奶玩乳漫画| 河南老太XXXXXHD| 女人爽到高潮嗷嗷叫视频| 十二月综合缴缴情| 有人在线观看的视频吗免费| 扒开 浓密 毛| 精品久久伊人| 日本 一二三 不卡 免费| 亚洲成人精品久久| 青青草AV国产精品| 日日噜噜大屁股熟妇| 欧洲美女高清一级毛片| 欧美精品3atv一区二区三区| 伦理片qvod| 男生插女生下体| 伦理片92伦理午夜| 禁漫H天堂免费A漫| 广播电台在线收听| 国产精品欧美亚洲| 国产亚洲精品网站在线视频| 国偷自产视频一区二区久| 国产精品一区二区欧美视频|