新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 按鍵程序設計,可以處理加速鍵、一鍵多功能等情況

        按鍵程序設計,可以處理加速鍵、一鍵多功能等情況

        作者: 時間:2016-11-22 來源:網絡 收藏
        我的按鍵程序設計,可以處理加速鍵一鍵多功能等情況
        后面有P1口行列式鍵盤程序實例
        xwj發表于2005-4-1516:36單片機←返回版面舉報該貼

        呵呵
        看到論壇在討論按鍵,也把我設計按鍵程序的思路說說,歡迎大家拍磚

        1、一般都不在鍵盤程序中延時,而是通過隔一段時間調用(比如10毫秒)來掃描按鍵,以盡量釋放CPU資源;
        2、所有鍵盤程序基本上都是一個模式,可以處理加速鍵、一鍵多功能等情況;
        3、對外接口只有2個,換用不同硬件的鍵盤只需把該鍵盤程序加入工程編譯即可,其他不需要作任何改動,非常方便。


        基本上都是一個模式:
        有鍵?--YES——和上次相同?--No--Keyold=0;退出
        ||
        |YES--Keyold++;
        ||
        |Keyold==首鍵延時KEYDELAY?--No--退出
        ||
        |YES--Keyok=1;//按下不放一定時間發首鍵,后面發加速鍵
        |保存鍵值到Keydata;(必要時譯碼)
        |Keyold=KEYDELAY-KEYLOOP(按住不放的延時);--退出
        |
        No--Keyold==0?--YES--退出
        |
        N0--Keyok=1;//不為0說明按了鍵再放開,當然作按鍵有效處理
        保存鍵值到Keydata;(必要時譯碼)
        Keyold=0;--退出

        所有鍵盤程序對外接口:
        unsignedcharKeyGetcode(void)//返回按鍵碼
        {
        key_ok=0;
        return(key_data);
        }

        bitKeyTest(void)//檢查有無按鍵
        {
        KeyScan();//鍵掃描
        return(key_ok);
        }





        //--------------------------------------------------------------------------//
        //源程序大公開//
        //(c)Copyright2001-2005xuwenjun//
        //AllRightsReserved//
        //V1.00//
        //--------------------------------------------------------------------------//
        //標 題:P1口行列式鍵盤程序//
        //文件名:xwj_hlkey.c//
        //版 本:V1.00//
        //修改人:徐文軍E-mail:xuwenjun@21cn.com//
        //日 期:05-05-13//
        //描 述:P1口行列式鍵盤程序//
        //聲 明://
        //以下代碼僅免費提供給學習用途,但引用或修改后必須在文件中聲明出處.//
        //如用于商業用途請與作者聯系.E-mail:xuwenjun@21cn.com//
        //有問題請mailtoxuwenjun@21cn.com歡迎與我交流!//
        //--------------------------------------------------------------------------//
        //老版本:老版本文件名://
        //創建人:徐文軍E-mail:xuwenjun@21cn.com//
        //日 期:05-05-13//
        //--------------------------------------------------------------------------//
        #i nclude
        #i nclude"xwj_hlkey.h"//P1口行列式鍵盤//
        //#i nclude"xwj_bp.h"//峰鳴器

        #defineKEYDELAY25
        #defineKEYLOOP10
        unsignedcharkey_bak;
        unsignedcharkey_temp;
        unsignedcharkey_old;
        unsignedcharkey_data;
        bitkey_ok;

        //P1口行列式鍵盤//
        #defineKEYPIN_LP1//定義鍵掃描列端口為P1低四位輸入//
        #defineKEYPIN_HP1//定義鍵掃描行端口為P1高四位掃描輸出//

        //內部私有函數//
        unsignedcharfnKeycode(unsignedcharkey);//根據鍵盤映射表輸出順序鍵值//

        //P1口行列式鍵盤//
        //---------------------------------------------------------------------------//
        voidKeyScan(void)//鍵掃描
        {
        unsignedcharsccode,recode;
        KEYPIN_L=KEYPIN_L|0x0f;//P1低四位為列線輸入//
        KEYPIN_H=KEYPIN_H&0x0f;//P1高四位為行線發全零掃描碼//
        if((KEYPIN_L&0x0f)!=0x0f)//有鍵按下
        {
        key_temp=鍵值;//鍵掃描,獲得鍵值
        if(key_temp==key_bak)
        {
        key_old++;
        if(key_old==KEYDELAY)//連續鍵,不要則把此if屏蔽
        {
        key_ok=1;
        key_data=fnKeycode(key_temp);//鍵解碼
        key_old=KEYDELAY-KEYLOOP;
        }
        }
        else
        {
        key_old=0;
        key_bak=key_temp;
        }
        }
        else//鍵抬起
        {
        if(key_old)
        {
        key_ok=1;
        key_data=fnKeycode(key_temp);//鍵解碼

        }
        key_old=0;
        }
        KEYPIN_H=KEYPIN_H|0xf0;
        }

        //---------------------------------------------------------------------------//

        unsignedcharKeyGetcode(void)//返回按鍵碼
        {
        key_ok=0;
        return(key_data);
        }

        bitKeyTest(void)//檢查有無按鍵
        {
        KeyScan();//鍵掃描
        return(key_ok);
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 尼勒克县| 天祝| 洮南市| 庄浪县| 锡林浩特市| 宣武区| 美姑县| 南皮县| 永修县| 古浪县| 卢氏县| 汉阴县| 乌拉特后旗| 安达市| 南宫市| 台中县| 尚义县| 塘沽区| 兰州市| 贡觉县| 兴山县| 奉新县| 海淀区| 水富县| 建阳市| 精河县| 崇仁县| 黔西| 桑植县| 阜城县| 儋州市| 精河县| 石城县| 阿合奇县| 宝山区| 荥阳市| 阿拉善右旗| 武山县| 扶风县| 东乡| 张掖市|