新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 矩陣鍵盤控制forMSP430

        矩陣鍵盤控制forMSP430

        作者: 時間:2016-11-27 來源:網絡 收藏
        1. /*****************************************************************
        2. //文件名:Keypad.c
        3. //描述:該文件定義與矩陣鍵盤有關的各種接口、函數,適用于MSP430F149
        4. //編寫人:小邪@清水
        5. //版本號:1.01
        6. *****************************************************************/
        7. #include
        8. #include"12864.h"
        9. ucharkeyPressed;//按鍵是否被按下:1--是,0--否
        10. ucharkeyval;//存放鍵值
        11. ucharkeyFlag;//按鍵是否已放開:1--是,0--否
        12. //設置鍵盤邏輯鍵值與程序計算鍵值的映射
        13. //12313(enter)
        14. //45614(up)
        15. //78915(down)
        16. //11(.)012(back)16(clear)
        17. ucharkey_Map[]={1,2,3,13,4,5,6,14,7,8,9,15,11,0,12,16};
        18. /*************************************************************************
        19. //名稱:InitKeypad
        20. //參數:延時的時間n
        21. //返回值:無
        22. //功能:初始化矩陣鍵盤的IO口
        23. *************************************************************************/
        24. voidInitKeypad(void)
        25. {
        26. P1DIR=0xf0;//P1.0~P1.3設置為輸入狀態,P1.4~P1.7設置為輸出狀態
        27. P1OUT|=0xf0;//P1.4~P1.7輸出高電平
        28. keyFlag=0;
        29. keyPressed=0;
        30. keyval=0;
        31. }
        32. /*************************************************************************
        33. //名稱:CheckKey
        34. //參數:無
        35. //返回值:無
        36. //功能:掃描矩陣鍵盤,獲取鍵值
        37. *************************************************************************/
        38. voidCheckKey(void)
        39. {
        40. ucharrow,col,tmp1,tmp2;
        41. tmp1=0x80;
        42. for(row=0;row<4;row++)//行掃描
        43. {
        44. P1OUT=0xf0;//P1.4~P1.7輸出全1
        45. P1OUT-=tmp1;//P1.4~p1.7輸出四位中有一個為0
        46. tmp1>>=1;
        47. if((P1IN&0x0f)<0x0f)//是否P1IN的P1.0~P1.3中有一位為0
        48. {
        49. tmp2=0x01;//tmp2用于檢測出那一位為0
        50. for(col=0;col<4;col++)//列檢測
        51. {
        52. if((P1IN&tmp2)==0x00)//是否是該列,等于0為是
        53. {
        54. keyval=key_Map[row*4+col];//獲取鍵值
        55. return;//退出循環
        56. }
        57. tmp2<<=1;//tmp2右移1位
        58. }
        59. }
        60. }
        61. }
        62. /*************************************************************************
        63. //名稱:delay
        64. //參數:無
        65. //返回值:無
        66. //功能:延時15ms的時間,用于消抖
        67. *************************************************************************/
        68. voiddelay()
        69. {
        70. uinttmp;
        71. for(tmp=12000;tmp>0;tmp--);
        72. }
        73. /*************************************************************************
        74. //名稱:KeyEvent
        75. //參數:無
        76. //返回值:無
        77. //功能:檢測按鍵,獲取鍵值
        78. *************************************************************************/
        79. voidKeyEvent(void)
        80. {
        81. uchartmp;
        82. P1OUT&=0x00;//設置P1OUT全為0,等待按鍵輸入
        83. tmp=P1IN;//獲取p1IN
        84. if((keyPressed==0x00)&&((tmp&0x0f)<0x0f))//如果有鍵按下
        85. {
        86. keyPressed=1;//如果有按鍵按下,設置keyPressed標識
        87. delay();//消除抖動
        88. CheckKey();//調用checkKey(),獲取鍵值
        89. }
        90. elseif((keyPressed==1)&&((tmp&0x0f)==0x0f))//如果按鍵已經釋放
        91. {
        92. keyPressed=0;//清除keyPressed標識
        93. keyFlag=1;//設置keyFlag標識
        94. }
        95. else
        96. {
        97. keyval=17;
        98. }
        99. }

        100. 上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 连山| 于都县| 松潘县| 武夷山市| 盘锦市| 来宾市| 都兰县| 社旗县| 德昌县| 乌什县| 霍林郭勒市| 宁南县| 班戈县| 乐业县| 惠来县| 平舆县| 河南省| 苍南县| 九龙城区| 手游| 紫金县| 灌南县| 柞水县| 镇远县| 铜陵市| 阜新| 安龙县| 右玉县| 贺州市| 乌苏市| 桐柏县| 通道| 通化市| 湛江市| 平凉市| 安达市| 崇仁县| 沂南县| 洛宁县| 通江县| 万州区|