免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 647 | 回复: 0
打印 上一主题 下一主题

基本框架-按键数码管显示 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-26 19:23 |只看该作者 |倒序浏览

; 89s52 ex00 just test
NAME     JUST_KUSO

    ; declear segment
PROG    SEGMENT        CODE
STACK    SEGMENT        IDATA
CONST    SEGMENT        CODE
INTVET    SEGMENT        CODE
VAR        SEGMENT        DATA
BITVAR    SEGMENT        BIT

    ; allocate variable
    RSEG    VAR
DPY_SW:            DS     1
DISP_DAT_LOW:    DS    1
DISP_DAT_HIG:    DS    1
KEY_CNT:        DS    1
KEY_CONT:        DS    1
KEY_TRG:        DS    1
KEY_RELEASE:    DS    1
KEY_SAV:        DS    1
TIME_SET:        DS    1

    ; allocate vit variable
    RSEG    BITVAR

INT_FLAG:     DBIT     1
    
    ; allocate stack
    RSEG    STACK
STACK_ADDR:
    DS    10H

    ; const data
    RSEG    CONST    
    ; TABLE DATA
DYP_TABLE:
    DB        3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ,7FH, 6FH

    ; MACRO

    ; interrupt vector
    CSEG    AT        00H
    JMP        INT_HANLDER_RESET
    CSEG    AT        0BH
    JMP        INT_HANLDER_T0

    ; main program
    RSEG    PROG
    ; RESET HANDLER
INT_HANLDER_RESET:    
    ; SETUP STACK    
    MOV        SP, #STACK_ADDR
MAIN:
    CALL    SYSTEM_INIT
    CALL    RAM_INIT

    MOV        TIME_SET,#0
    CALL    REFLASH_DISP
LOOP:
    ; WAIT 5MS
    JNB        INT_FLAG,LOOP
    CLR        INT_FLAG
    
    CALL    SCAN_DYP_PROC
    CALL    SCAN_KEY_PROC

    JMP        LOOP

SCAN_KEY_PROC:
    ; key_read_port
    MOV        P3,#0FH
    NOP
    NOP
    MOV        A,P3
    CPL        A
    ANL        A,#0FH
    MOV        R0,A
    CJNE    A,KEY_SAV,SCAN_NO_KEY
    INC        KEY_CNT
    MOV        A,KEY_CNT
    CLR        C
    SUBB    A,#10
    JC        SCAN_KEY_PROC_END
    ; TRG
    MOV        A,R0
    XRL        A,KEY_CONT
    ANL        A,R0
    MOV        KEY_TRG,A
    ; RELEASE
    XRL        A,KEY_CONT
    XRL        A,R0
    MOV        KEY_RELEASE,A
    ; CONT
    MOV        KEY_CONT,R0
KEY_FUNC:                    
    MOV        A,KEY_TRG
    ANL        A,#1<<0
    JNZ        K_PROC_0

    MOV        A,KEY_TRG
    ANL        A,#1<<1
    JNZ        K_PROC_1

    MOV        A,KEY_TRG
    ANL        A,#1<<2
    JNZ        K_PROC_2

    MOV        A,KEY_TRG
    ANL        A,#1<<3
    JNZ        K_PROC_3

    JMP        SCAN_KEY_PROC_END
K_PROC_0:
    INC        TIME_SET
    CALL    REFLASH_DISP
    JMP        SCAN_KEY_PROC_END
K_PROC_1:
    DEC        TIME_SET
    CALL    REFLASH_DISP
    JMP        SCAN_KEY_PROC_END
K_PROC_2:
    NOP
    JMP        SCAN_KEY_PROC_END
K_PROC_3:
    NOP
    JMP        SCAN_KEY_PROC_END

SCAN_NO_KEY:
    MOV        KEY_CNT,#0
    MOV        KEY_SAV,R0
    JMP        SCAN_KEY_PROC_END
SCAN_KEY_PROC_END:
    RET



SCAN_DYP_PROC:    
    MOV        A,DPY_SW
SCAN_DPY_COM0:
    CJNE    A,#0,SCAN_DPY_COM1
    MOV        A,#7
    MOV        P2,A
    MOV        DPTR,#DYP_TABLE
    MOV        A,DISP_DAT_LOW
    ANL        A,#0X0F
    MOVC    A,@A+DPTR
    MOV        P0,A
    INC        DPY_SW
    JMP        SCAN_DPY_END
SCAN_DPY_COM1:
    CJNE    A,#1,SCAN_DPY_COM2
    MOV        A,#6
    MOV        P2,A
    MOV        DPTR,#DYP_TABLE
    MOV        A,DISP_DAT_LOW
    SWAP    A
    ANL        A,#0X0F
    MOVC    A,@A+DPTR
    MOV        P0,A
    INC        DPY_SW
    JMP        SCAN_DPY_END    
SCAN_DPY_COM2:
    CJNE    A,#2,SCAN_DPY_ERR
    MOV        A,#5
    MOV        P2,A
    MOV        DPTR,#DYP_TABLE
    MOV        A,DISP_DAT_HIG
    ANL        A,#0X0F
    MOVC    A,@A+DPTR
    MOV        P0,A
    INC        DPY_SW
    JMP        SCAN_DPY_END
SCAN_DPY_ERR:
    MOV        A,#0
    MOV        DPY_SW,A
    JMP        SCAN_DYP_PROC
SCAN_DPY_END:
    RET
    
REFLASH_DISP:
    MOV        R0,TIME_SET
    CALL    BIN2BCD_1BYTE
    MOV        DISP_DAT_LOW,R0
    MOV        DISP_DAT_HIG,R1
REFLASH_DISP_END:
    RET

; 1 BYTE BINARY->BCD
; entry : R0
; RETURN : R1:R0
BIN2BCD_1BYTE:
    MOV        A,R0
    MOV     B, #100
    DIV     AB
    MOV     R1, A
    MOV     A, #10
    XCH     A,B
    DIV     AB
    SWAP     A
    ADD     A,B
BIN2BCD_1BYTE_END:
    MOV        R0,A
    RET

; SYSTEM INIT
SYSTEM_INIT:
    ; TIMER0
    MOV        TMOD, #1
    SETB    TR0
    ; T0 INTERRUPT
    SETB    ET0
    SETB    EA
SYSTEM_INIT_END:
    RET

RAM_INIT:

RAM_INIT_END:
    RET


    RSEG    INTVET
INT_HANLDER_T0:
    PUSH    ACC
    PUSH    PSW
    USING    2

    SETB     INT_FLAG

    MOV        TL0, #LOW(65536-5000)
    MOV        TH0, #HIGH(65536-5000)

    POP        PSW
    POP        ACC
    RETI

    END


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP