新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8S獨立按鍵IO口設置及按下事件問題

        STM8S獨立按鍵IO口設置及按下事件問題

        作者: 時間:2016-11-19 來源:網絡 收藏
        • GPIO設置
        • 按鍵檢測
          • 1 連續按鍵檢測短按
        • 關鍵代碼

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

        1 GPIO設置

                        STM8 I/O 口引腳配置表

        Px_DDRPx_CR1Px_CR2I/O 方式引腳狀態
        000輸入懸浮輸入
        001輸入上拉輸入
        010輸入中斷懸浮輸入
        011輸入中斷上拉輸入
        100輸出開漏輸出
        110輸出推挽輸出
        1x1輸出輸出(最快速度為10MHZ)

        STM8S的IO配置,我們只需要操作五個寄存器就行了:

        • 輸出數據寄存器 (ODR)
        • 輸入數據寄存器 (IDR)
        • 數據方向寄存器 (DDR)
        • 控制寄存器1(CR1)
        • 控制寄存器2(CR2)

        2 按鍵檢測

          在做獨立按鍵檢測的時候,設置成上拉輸入不能實現功能,設置成中斷懸浮輸入就可以了。
          兩次短按鍵之間的時間間隔大約在300ms~600ms之間。一次短按鍵按下的時間大約在14ms~26ms之間;

        2.1 連續按鍵檢測(短按+)

        定時器TIM1 + 按鍵 = 連續按鍵檢測(短按鍵+鍵)
        兩個標記:

        • 短按+—flag0
        • 短按后時間在規定范圍之內—flag1

        如果兩個標記都滿足,則開/關電源;每次按鍵都啟動按鍵計時;

        當兩次按鍵的時間間隔在300ms~600ms之間的時候,怎么得到第一次(短按)和第二次()按鍵之間的時間呢?
          如果判斷了是短按,則開啟計時,同時將第一次短按flag置一,超過600ms停止計時并清零,等待第二次的按鍵;有了第二次的按鍵之后,在短按置一flag條件中中斷計時,判斷是否在規定范圍之內的時間間隔,是則將flag1置一;并接下來判斷該按鍵是還是短按,如果是,則將flag0置一,滿足flag0、flag1均置一,則是連續按鍵。

        3 關鍵代碼

        /*return = 0   :   No Key Press1   :   Single Key Press2   :   將作為一次單獨按鍵,并執行Single Key Press功能   3   :   Double Key Press*/unsigned int Key_Scan(void){unsigned int count = 0;if(0 == KEY){Delay(2);if(0 == KEY){if(1 == keytimesFlag){afterOnceShortPressFlag = 0;if((afterOnceShortPressCount <=30) && (afterOnceShortPressCount > 15)){isSetTimeFlag = 1;}else isSetTimeFlag = 0;}keyFlag = 1;while(!KEY);keyFlag = 0;count = keyCount;keyCount = 0;}else{count = 0;}}if(count >= 200){if(1 == isSetTimeFlag){isSetTimeFlag = 0;keytimesFlag = 0;return 3;}else {keytimesFlag = 0;return 2;           }}else if(count >= 4){afterOnceShortPressFlag = 1;afterOnceShortPressCount = 0;keytimesFlag = 1;return 1;}else return 0;}

        在定時周期為10ms的定時器中斷函數里:

        @far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void){   TIM1_SR1 &=~(0x01);    if(1 == keyFlag){++keyCount;}else ;if(1 == afterOnceShortPressFlag){++afterOnceShortPressCount;if(afterOnceShortPressCount > 80){afterOnceShortPressFlag = 0;afterOnceShortPressCount = 0;keytimesFlag = 0;}}else ;}

          另參見使用外部中斷鍵識別:使用外部中斷識別鍵



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 泾源县| 射洪县| 荣昌县| 乌拉特后旗| 梨树县| 浮山县| 永顺县| 临西县| 无为县| 潜江市| 花垣县| 祁阳县| 茂名市| 临沂市| 四子王旗| 右玉县| 乌拉特前旗| 浦县| 柘荣县| 永嘉县| 城市| 延长县| 太湖县| 隆德县| 耒阳市| 霍山县| 西乡县| 股票| 巴南区| 教育| 白山市| 阳春市| 渝中区| 睢宁县| 平和县| 英德市| 得荣县| 阆中市| 邵东县| 南昌县| 武川县|