新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于stm32的獨立按鍵掃描方式

        基于stm32的獨立按鍵掃描方式

        作者: 時間:2016-11-19 來源:網絡 收藏
        這兩天完成了一個stm32的工程,在解決按鍵時寫出了一個獨立按鍵的掃描函數,應該有前輩已經出來了,的其實質就是普通的掃描方式修改的,優點是將按鍵相關參數封裝為一個結構體,每加一個按鍵都不需要在函數中增加語句,廢話少說,先看掃描函數

        本文引用地址:http://www.104case.com/article/201611/318319.htm

        //*
        // Function: 掃描按鍵
        // Returns: u8 :按鍵id值
        //*
        u8 KeyScan()
        {
        static u8 keyUp=1;//按鍵按松開標志
        u8 i,count,upCount=0;
        count=sizeof(buttons)/sizeof(Button);
        for (i=0;i{
        if (keyUp && (GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==0))
        {
        keyUp = 0;
        delay_ms(10);
        if (GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==0)
        {
        return buttons[i].ButtonId;
        }
        }
        else if ((GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==1))
        {
        upCount++; //記錄有多少個按鍵松開了
        }
        }
        if (upCount == count)//按鍵松開數等于總按鍵數
        {
        keyUp = 1;
        }
        return ButtonNone;// 無按鍵按下
        }

        通俗易懂吧。接下來看結構體原型

        typedef struct
        {
        GPIO_TypeDef* ButtonPort;//按鍵端口
        uint16_t ButtonPin;//按鍵引腳
        u8ButtonId;//按鍵ID
        }Button;

        使用方法

        Button buttons[]={{GPIOB,GPIO_Pin_5,ButtonFunction},
        {GPIOB,GPIO_Pin_6,ButtonUp},
        {GPIOB,GPIO_Pin_1,ButtonDown},
        {GPIOB,GPIO_Pin_0,4}};

        一般的結構體初始化方法,前兩個參數大家都懂,最后一個可以定義一個枚舉,當然也可以自己賦值,注意別重復和定義為0了,因為0一般用來當作沒有按鍵的返回值。如今要加減按鍵就只需在上面的數組中處理。當然別忘了端口的初始化,這個就不說了。

        分析一下優缺點,

        優點:便于擴展,每加減一個按鍵都不用修改主要的按鍵掃描函數,如果端口初始化函數寫得好的話連端口初始化函數都可以不用管。

        缺點:如果按鍵過多,會損失不少時間,主要原因是循環結構



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 远安县| 孝昌县| 扎兰屯市| 贡觉县| 广德县| 涞水县| 郓城县| 霸州市| 通辽市| 应城市| 梁河县| 绵阳市| 吉木萨尔县| 松原市| 山东省| 抚州市| 公主岭市| 武宁县| 许昌市| 松原市| 吉安市| 曲周县| 拉孜县| 崇义县| 肥乡县| 县级市| 蒙阴县| 额敏县| 余姚市| 灵川县| 搜索| 高唐县| 榕江县| 三江| 卢湾区| 邹平县| 钟祥市| 泰安市| 肥东县| 淄博市| 平邑县|