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

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 鍵盤接口程序設(shè)計之加減運算

    鍵盤接口程序設(shè)計之加減運算

    作者: 時間:2012-11-10 來源:網(wǎng)絡(luò) 收藏

    /*
    程序效果:1、開機時顯示899
    2、按鍵key0一次數(shù)字加1,按鍵key1一次數(shù)字減1。
    加到999時再加1歸零,減到000時再減1得999。
    3、按住鍵key2不放實現(xiàn)連加功能,前3s每0.2s加1,以后每0.1s加1.
    4、按住鍵key3不放實現(xiàn)連減功能,前3s每0.2s減1,以后每0.1s減1.
    5、版權(quán)所有:http://www.51hei.com/ 轉(zhuǎn)帖須保留
    */
    ORG 0000H
    LJMP START
    ORG 0013H //1
    LJMP IN1
    ORG 0030H
    START:SETB IT1 //設(shè)置為下降沿觸發(fā)
    SETB EX1 //打開1
    SETB EA //開總中斷
    MOV 30H,#09 //賦初值
    MOV 31H,#09
    MOV 32H,#08
    LOOP: LCALL DISPLAY //調(diào)用顯示子程序
    SJMP LOOP

    IN1: LCALL DISPLAY
    LCALL DISPLAY
    LCALL DELAY1
    JB P3.3,LA0P //其實這三條語句就是
    LJMP LA0P1 //JB P3.3 LOOP1
    LA0P: LJMP LOOP1 //只是跳轉(zhuǎn)距離沒有那么大
    LA0P1: JNB P3.4 ,KEY0 //KEY0按下,轉(zhuǎn)key0,

    //沒有則,執(zhí)行下面的語句
    JNB P3.5,KEY1
    JNB P3.6,KEY2
    JNB P3.7,KEY3
    LOOP3: JNB P3.3,LOOP2 //等待P3.3為高
    LCALL DISPLAY //為高,調(diào)用現(xiàn)實子程序
    LCALL DISPLAY
    LCALL DELAY1 //延時12ms
    JNB P3.3,LOOP3 //P3.3為低,繼續(xù)等待
    LJMP LOOP1 //P3.3為高,結(jié)束
    LOOP2: LCALL DISPLAY
    LJMP LOOP3

    KEY0: LCALL ADD1 //KEY0按下,加1
    LJMP LOOP3
    KEY1: LCALL SUB1 //KEY1按下,加1
    LJMP LOOP3

    KEY2: MOV R2,#15
    LAP2: MOV R1,#33

    LCALL ADD1
    LAP1: LCALL DISPLAY // 循環(huán)完33次約為0.2s
    JB P3.3,LAP4 // 33*6ms
    DJNZ R1,LAP1 //
    DJNZ R2,LAP2 //外循環(huán)結(jié)束,需3s
    //
    LAP5: MOV R1,#16
    LCALL ADD1
    LAP6: LCALL DISPLAY // 循環(huán)完16次,需0.1s
    JB P3.3,LAP7 // 16*6ms
    DJNZ R1, LAP6 //
    LJMP LAP5 //快速加1

    LAP7: LCALL DISPLAY //P3.3為高,調(diào)用顯示子程序
    LCALL DELAY1
    JNB P3.3,LAP6 //P3.3為低,繼續(xù)快速加1
    LJMP LOOP1 //為高,結(jié)束

    LAP4: LCALL DISPLAY
    LCALL DISPLAY
    LCALL DELAY1
    JNB P3.3,LAP1 //為低,重新循環(huán)
    LJMP LOOP1 //為高,結(jié)束

    KEY3: MOV R2,#15 //以下功能同KEY2
    LSP2: MOV R1,#33

    LCALL SUB1
    LSP1: LCALL DISPLAY
    JB P3.3,LSP4
    DJNZ R1,LSP1
    DJNZ R2,LSP2

    MOV R1,#16
    LCALL SUB1
    LSP5: LCALL DISPLAY
    JB P3.3,LSP6
    DJNZ R1, LSP5
    LJMP key3

    LSP6: LCALL DISPLAY
    LCALL DELAY1
    JNB P3.3,LSP5
    LJMP LOOP1


    LSP4: LCALL DISPLAY
    LCALL DISPLAY
    LCALL DELAY1
    JNB P3.3,LSP1

    LOOP1: NOP //空指令
    RETI //返回


    DISPLAY:MOV DPTR,#TAB //顯示沒有問題了
    MOV A,#0FBH //賦初值
    MOV P2,A //點亮第四個數(shù)碼管
    XCH A,R0 //暫存A的值
    MOV A,32H
    MOVC A,@A+DPTR
    MOV P0,A //顯示個位數(shù)
    LCALL DELAY //延時
    XCH A,R0
    RL A //循環(huán)右移,為下次做準備

    MOV P2,A
    XCH A,R0
    MOV A,31H
    MOVC A,@A+DPTR
    MOV P0,A
    LCALL DELAY
    XCH A,R0
    RL A

    MOV P2,A
    MOV A,30H
    MOVC A,@A+DPTR
    MOV P0,A
    LCALL DELAY
    RET

    ADD1: INC 30H //加1子程序
    MOV A,30H
    CJNE A,#10,LOP1 //判斷個位是否滿10
    MOV 30H,#00 //是,則清零
    INC 31H //同時十位加1
    MOV A,31H
    CJNE A,#10,LOP1 //判斷十位是否滿10
    MOV 31H,#00 //是,則清零
    INC 32H //同時百位加1
    MOV A,32H
    CJNE A,#10,LOP1 //判斷百位是否滿10
    MOV 32H,#00 //是,則清零
    LOP1: NOP //空指令
    RET //返回

    SUB1: DEC 30H //減1子程序
    MOV A,30H
    CJNE A,#0FFH,LOP2 //判斷是否減過0
    MOV 30H,#09 //是,則賦9
    DEC 31H
    MOV A,31H
    CJNE A,#0FFH,LOP2
    MOV 31H,#09
    DEC 32H
    MOV A,32H
    CJNE A,#0FFH,LOP2
    MOV 32H,#09
    LOP2: NOP
    RET

    TAB: DB 3FH,06H,5BH,4FH,66H ;數(shù)碼管顯示的數(shù)值
    DB 6DH,7DH,07H,7FH,6FH
    DELAY: MOV R7,#4 //延時時間約為:2MS
    DEL2: MOV R6,#250
    DEL1: DJNZ R6,DEL1
    DJNZ R7,DEL2
    RET
    DELAY1: MOV R7,#24 //延時時間約為:12MS
    DEL3: MOV R6,#250
    DEL4: DJNZ R6,DEL4
    DJNZ R7,DEL3
    RET
    END



    評論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 景泰县| 融水| 牡丹江市| 滨海县| 富裕县| 宁陵县| 孝义市| 桃江县| 七台河市| 蒙城县| 仲巴县| 宁陕县| 介休市| 保亭| 正阳县| 连州市| 富民县| 隆昌县| 浮山县| 磐安县| 正安县| 娄烦县| 安阳县| 同心县| 孙吴县| 海阳市| 汝阳县| 同德县| 仁怀市| 遂宁市| 西林县| 潞西市| 泗阳县| 泾川县| 防城港市| 从化市| 武乡县| 上杭县| 湖北省| 武山县| 阿克陶县|