• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 按鍵實現加減運算及連續按鍵檢測

    按鍵實現加減運算及連續按鍵檢測

    作者: 時間:2012-11-10 來源:網絡 收藏

    *
    注意:如果無法在keil里編譯,請刪除每一行的所有前導空白
    程序效果:若0(即7EH)按下,則加1;若1(即7DH)按下,
    則減1;若2(即7BH)按下,則快加,若按鍵3(77H)按下,則快減。
    */
    ORG 0000H
    LJMP START
    ORG 0030H
    START: MOV 30H,#00 //賦初值
    MOV 31H,#00
    MOV 32H,#01

    LOOP1: MOV R2,#04 //循環四次
    MOV R1,#0FEH //分別為:0FEH ?FDH ?FBH ?F7H

    LOOP: MOV A,R1 //賦值,用于暫存A的值
    MOV P0,A //賦初值
    RL A //循環左移
    XCH A,R1 //暫存A的值
    MOV A,P0 //讀?P0口的值
    LCALL DELAY1 //延時

    CJNE A,#7EH,LOP1 //判斷是否有按鍵按下
    LCALL ADD1 //有,則加1
    LOP12: MOV A,P0 //以下語句是用于判斷按鍵是否松開
    LCALL DELAY1
    CJNE A,#7EH,LOP1
    LCALL DISPLAY
    SJMP LOP12

    LOP1: CJNE A,#7DH,LOP2
    LCALL SUB1
    LOP22: MOV A,P0
    LCALL DELAY1
    CJNE A,#7DH,LOP2
    LCALL DISPLAY
    SJMP LOP22

    LOP2: CJNE A,#7BH,LOP3 //判斷快加的按鍵按下
    MOV R3,#10 //按下了,下面的語句用于減慢數值變化速度
    LOP32: LCALL DISPLAY
    LCALL DELAY
    DJNZ R3,LOP32
    LCALL ADD1

    LOP3: CJNE A,#77H,LOP4
    MOV R4,#10
    LOP42: LCALL DISPLAY
    LCALL DELAY
    DJNZ R4,LOP42
    LCALL SUB1

    LOP4: DJNZ R2,LOOP
    LCALL DISPLAY
    LJMP LOOP1
    //顯示子程序
    DISPLAY: MOV DPTR,#TAB //賦表首地址
    MOV A,#0FFH
    MOV P1,A //點亮最右邊的數碼管
    XCH A,R0 //暫存A的值
    MOV A,30H //顯示個位數
    MOVC A,@A+DPTR
    MOV P2,A
    LCALL DELAY1 //延時
    DEC R0 //減1,用于點亮下一個數碼管,準備下次顯示
    XCH A,R0

    MOV P1,A
    XCH A,R0
    MOV A,31H
    MOVC A,@A+DPTR
    MOV P2,A
    LCALL DELAY1
    DEC R0
    XCH A,R0

    MOV P1,A
    XCH A,R0
    MOV A,32H
    MOVC A,@A+DPTR
    MOV P2,A
    LCALL DELAY1
    RET
    //加子程序
    ADD1: INC 30H //個位加1
    MOV A,30H //把30H的值賦給A
    CJNE A,#0AH,LAP //判斷個位是否加為10
    MOV 30H,#00 //是,則清零

    INC 31H
    MOV A,31H
    CJNE A,#0AH,LAP
    MOV 31H,#00

    INC 32H
    MOV A,32H
    CJNE A,#0AH,LAP
    MOV 32H,#00
    LAP: NOP //空指令
    RET //返回
    //減子程序
    SUB1: DEC 30H //個位減1
    MOV A,30H //把30H的值賦給A
    CJNE A,#0FFH,LSP //判斷30H的值為0后是否在減1
    MOV 30H,#09 //是,則給30H賦9

    DEC 31H
    MOV A,31H
    CJNE A,#0FFH,LSP
    MOV 31H,#09

    DEC 32H
    MOV A,32H
    CJNE A,#0FFH,LSP
    MOV 32H,#09

    LSP: NOP
    RET
    //延時子程序,時間大約為2us*20*200=8ms
    DELAY: MOV R6,#20
    DEL2: MOV R5,#200
    DEL3: DJNZ R5,DEL3
    DJNZ R6,DEL2
    RET
    //延時子程序,時間約為:2us*5*250=2.5ms
    DELAY1: MOV R6,#5
    DEL4: MOV R5,#250
    DEL5: DJNZ R5,DEL5
    DJNZ R6,DEL4
    RET
    TAB: DB 3FH,06H,5BH,4FH,66H ;數碼管顯示的數值
    DB 6DH,7DH,07H,7FH,6FH
    END
    注意:如果無法在keil里編譯,請刪除每一行的所有前導空白,



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 湟源县| 图们市| 乌审旗| 馆陶县| 宜都市| 兰州市| 同江市| 报价| 龙胜| 桂东县| 新密市| 衡阳县| 东明县| 晋城| 徐水县| 新宁县| 普定县| 读书| 江西省| 扶绥县| 太保市| 西平县| 清水县| 额敏县| 大渡口区| 柯坪县| 堆龙德庆县| 平阴县| 开封县| 玛曲县| 崇义县| 黄大仙区| 屯昌县| 宜兰市| 忻州市| 许昌市| 驻马店市| 阿拉善盟| 突泉县| 天祝| 堆龙德庆县|