新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 凌陽(yáng)61單片機(jī)之按鍵無(wú)延時(shí)消抖(采用狀態(tài)機(jī)編程思想

        凌陽(yáng)61單片機(jī)之按鍵無(wú)延時(shí)消抖(采用狀態(tài)機(jī)編程思想

        作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
        無(wú)延時(shí)消抖在另一篇博文已經(jīng)有詳細(xì)的說(shuō)明,這里不再贅述。
        在學(xué)習(xí)FPGA時(shí),覺(jué)得狀態(tài)機(jī)這種編程思想非常好,可以很充分地利用CPU的資源。
        大的單片機(jī)工程,或者實(shí)時(shí)性較強(qiáng)的工程,采用狀態(tài)機(jī)編程思想可以很好解決一些問(wèn)題,例如:
        鍵盤掃描,蜂鳴器報(bào)警,LED燈閃爍等等。
        下面是小弟昨晚用狀態(tài)機(jī)編程思想寫的基于凌陽(yáng)61單片機(jī)之下,按鍵無(wú)延時(shí)消抖程序。
        程序的按鍵還是有點(diǎn)小抖動(dòng),主要是因?yàn)橹鞒绦驁?zhí)行的任務(wù)少,跳入鍵盤掃描時(shí)間短。
        現(xiàn)在才發(fā)現(xiàn)C里面的枚舉類型可以用來(lái)干嘛、、、
        放于狀態(tài)機(jī)這塊剛剛好。
        #include "SPCE061A.H"
        enum State {Init, Press, Free};
        enum State Key_State; //按鍵狀態(tài)
        unsigned char Key_Press; //按鍵值
        void Keyscan(void)
        {
        switch (Key_State)
        {
        case Init : // 按鍵初始態(tài)
        if((*P_IOA_Data & 0x0007) != 0)
        {
        Key_State = Press; // 鍵被按下,但需要確認(rèn)是否是干擾
        }
        break;
        case Press : // 按鍵確認(rèn)態(tài)
        if((*P_IOA_Data & 0x0007) != 0) //如有鍵按下則不是干擾,判斷鍵值
        {
        //判斷是哪一個(gè)按鍵被按下
        if( (*P_IOA_Data & 0x0001) != 0 ); //第一個(gè)鍵被按下
        {
        *P_IOB_Data = ~*P_IOB_Data;
        }
        if( (*P_IOA_Data & 0x0003) != 0 ); //第二個(gè)鍵被按下
        {
        *P_IOB_Data = ~*P_IOB_Data;
        }
        if( (*P_IOA_Data & 0x0007) != 0 ); //第三個(gè)鍵被按下
        {
        *P_IOB_Data = ~*P_IOB_Data;
        }
        Key_State = Free; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
        }
        else
        {
        Key_State = Init; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài)
        }
        break;
        case Free :
        if((*P_IOA_Data & 0x0007) == 0) //判斷按鍵是否釋放
        {
        Key_State = Init; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài)
        }
        break;
        }
        }
        void Board_Init(void)
        {
        //設(shè)置A口為帶下拉電阻的輸入 IO初始化開(kāi)始
        *P_IOB_Dir=0xFFFF; //output
        *P_IOB_Attrib=0xFFFF;
        *P_IOB_Data=0xFFFF;
        Key_Press = 1;
        Key_State = 0;
        }
        int main()
        {
        Board_Init();
        while(1)
        {
        Keyscan();
        *P_Watchdog_Clear = C_WDTCLR;
        }
        return 0;
        }



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 吉林市| 鄂温| 陆川县| 来凤县| 视频| 江安县| 太湖县| 洛川县| 舒城县| 邵东县| 慈利县| 龙胜| 榆树市| 栾城县| 久治县| 朝阳市| 浦东新区| 原平市| 乌拉特后旗| 昌平区| 陵川县| 疏勒县| 邵阳市| 普陀区| 册亨县| 明光市| 论坛| 武穴市| 固阳县| 香格里拉县| 南召县| 江川县| 扎赉特旗| 尼木县| 无极县| 永济市| 孟津县| 梅州市| 清远市| 来宾市| 平江县|