新聞中心

        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里編譯,請刪除每一行的所有前導空白,



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 康保县| 广南县| 湟中县| 兴文县| 青州市| 长顺县| 界首市| 定南县| 边坝县| 千阳县| 兴隆县| 滕州市| 星子县| 金秀| 达尔| 小金县| 珠海市| 长沙县| 泰和县| 永济市| 湟中县| 武宣县| 台州市| 垣曲县| 洪雅县| 许昌市| 奎屯市| 衡东县| 安达市| 澄江县| 汾阳市| 苍溪县| 三河市| 南乐县| 资中县| 玛多县| 本溪| 北川| 江华| 枣强县| 柏乡县|