⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7_flagdisp.asm.asm

📁 程序用中断扫描7段数码显示,有外部中断10MS中断串行通信中断等
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;FLAG-DISP CONTROLLER FOR 7 SEGMENT DISPLAY DRIVER
;LAST MODIFIED AT '95/04/27
;
BCD_CODE EQU    00H
SEG_CODE EQU    01H
U_NUMBER EQU    02H
D_NUMBER EQU    03H
UNIT     EQU    1
BPS9600  EQU    FDH
;
U_CNT_L  EQU    20H
U_CNT_M  EQU    21H
U_CNT_H  EQU    22H
D_CNT_L  EQU    23H
D_CNT_M  EQU    24H
D_CNT_H  EQU    25H

DISP_ON REG     2BH.0
;
TMPX    EQU     2CH
MODE    EQU     2DH
COUNT   EQU     2EH
TMP     EQU     2FH
DIGIT0  EQU     30H
DIGIT1  EQU     31H
DIGIT2  EQU     32H
DIGIT3  EQU     33H
DIGIT4  EQU     34H
DIGIT5  EQU     35H
DIGIT6  EQU     36H
DIGIT7  EQU     37H
DIGIT8  EQU     38H
DIGIT9  EQU     39H
DIGIT10 EQU     3AH
DIGIT11 EQU     3BH
;
NUMBER_L EQU    3CH
NUMBER_M EQU    3DH
NUMBER_H EQU    3EH
;
STACK    EQU    40H
;
TIMER0  EQU     15000           ;TIMER0 15mS INTERRUPT
TMSH    EQU     (65536-TIMER0)/ 256
TMSL    EQU     (65536-TIMER0).MOD. 256
;
        ORG     0000H
        JMP     START
        ORG     0003H
        JMP     INT0    ;[ENABLE]  EXTERNAL INT0 INTERRUPT
        ORG     000BH
        JMP     T0_INT  ;[ENABLE]  TIMER0 OVERFLOW INTERRUPT
        ORG     0013H
        RETI            ;[DISABLE] EXTERNAL INT1 INTERRUPT
        ORG     001BH
        RETI            ;[DISABLE] TIMER1 OVERFLOW INTERRUPT
        ORG     0023H
;       RETI
        JMP     SERIAL  ;[ENABLE]  SERIAL INTERRUPT
;
START   MOV     R0,#00H
        DJNZ    R0,$
        MOV     SP,#STACK
        CALL    DELAY
        CALL    SYSTEM_INIT
;
        MOV     COUNT,#FFH ;WAIT FOR COMMAND
        MOV     NUMBER_L,#00H
        MOV     NUMBER_M,#00H
        MOV     NUMBER_H,#00H
        SETB    DISP_ON
        CALL    SELF_TEST1
        CALL    SELF_TEST2
;       CALL    SELF_TEST3
        CALL    CLEAR
        CALL    ENABLE_INT
        CALL    WAIT_SIGN       ;DISPLAY ------
DISPLAY
        CALL    DELAY
        SJMP    DISPLAY
;
WAIT_SIGN
        MOV     R0,#DIGIT0
        MOV     A,#40H
$1      MOV     @R0,A
        INC     R0
        CJNE    R0,#DIGIT11+1,$1
        RET
;
ENABLE_INT
;ENABLE TIMER0 INTERRUPT
        MOV     TMOD,#21H       ;TIMER0 16 BIT COUNT,TIMER1 9600BPS
        MOV     TH0,#TMSH
        MOV     TL0,#TMSL
        MOV     TH1,#BPS9600
;TCON(8 BITS) SETTING
        CLR     TF1
        SETB    TR1             ;TIMER1 START COUNT(8 BITS)
        CLR     TF0             ;CLEAR TF0
        SETB    TR0             ;TIMER0 START COUNT(16 BITS)
        CLR     IE1
        CLR     IT1             ;INT1 EXTERNAL INTERRUPT DISABLE
        CLR     IE0             ;CLEAR INT0 FLAG
        SETB    IT0             ;INT0 NEGATIVE RISING TRIGGER
;SCON(8 BITS) SETTING
        MOV     SCON,#50H       ;MODE 1 SERIAL,TI&RI ALL CLEAR
                                ;ENABLE RECEIVE (REN=1)
        CLR     RI
        CLR     TI              ;DISABLE TRANSMIT
;
;IP(8 BITS) SETTING
        SETB    PX0             ;INT0 HIGHER PRIORITY
;IE(8 BITS) SETTING
        SETB    ET0             ;ENABLE TIMER0 INTERRUPT
        SETB    EX0             ;ENABLE INT0
        SETB    ES              ;ENABLE SERIAL INTERRUPT
;ENABLE SYSTEM INTERRUPT
        SETB    EA              ;ENABLE SYSTEM INTERRUPT
        RET
;
SERIAL
        PUSH    PSW
        PUSH    A
        PUSH    B
        PUSH    DPL
        PUSH    DPH
        PUSH    00H
        PUSH    01H
        PUSH    02H
        PUSH    03H
        PUSH    04H
        PUSH    05H
        PUSH    06H
        PUSH    07H
        JB      RI,$0
        JMP     INT0_END        ;RET FROM SERIAL INTERRUPT
$0      CLR     RI              ;clear Rx ready flag.
        CLR     TI
        MOV     A,SBUF          ;READ ONE BYTE
        MOV     B,A
        JMP     COMMAND
;
INT0
        PUSH    PSW
        PUSH    A
        PUSH    B
        PUSH    DPL
        PUSH    DPH
        PUSH    00H
        PUSH    01H
        PUSH    02H
        PUSH    03H
        PUSH    04H
        PUSH    05H
        PUSH    06H
        PUSH    07H
;
        MOV     A,P1    ;READ IN A COMMAND BYTE
        MOV     B,A     ;TRANSFER TO REG. B
;
COMMAND
        MOV     A,COUNT
        CJNE    A,#FFH,DATA_COMING
CHK_CMD
        MOV     A,B     ;READ DISPLAY COMMAND
$CMD1   CJNE    A,#FFH,$CMD2
        CALL    CLEAR   ;CLEAR 7-SEGMENT DISPLAY
        MOV     COUNT,#00H
        MOV     MODE,#BCD_CODE
        JMP     INT0_END
;
$CMD2   CJNE    A,#FEH,$CMD3
        CALL    CLEAR
        MOV     COUNT,#00H
        MOV     MODE,#SEG_CODE
        JMP     INT0_END
;
$CMD3   CJNE    A,#FDH,$CMD4
        MOV     COUNT,#00H
        MOV     MODE,#U_NUMBER
        JMP     INT0_END
;
$CMD4   CJNE    A,#FCH,$CMD5
        MOV     COUNT,#00H
        MOV     MODE,#D_NUMBER
        JMP     INT0_END
;
$CMD5   CJNE    A,#FBH,$CMD6
        MOV     COUNT,#FFH
        CALL    ADD_U_CNT
        CALL    CONVERT1
        JMP     INT0_END
$CMD6   CJNE    A,#FAH,$CMD7
        MOV     COUNT,#FFH
        CALL    SUBB_U_CNT
        CALL    CONVERT1
        JMP     INT0_END
$CMD7   CJNE    A,#F9H,$CMD8
        MOV     COUNT,#FFH
        CALL    ADD_D_CNT
        CALL    CONVERT2
        JMP     INT0_END
$CMD8   CJNE    A,#F8H,$CMD_END
        MOV     COUNT,#FFH
        CALL    SUBB_D_CNT
        CALL    CONVERT2
        JMP     INT0_END
$CMD_END
        JMP     INT0_END
;
;DATA IN ACC,DISPLAY CODE IN (MODE)
DATA_COMING
$MODE1  MOV     A,MODE
        CJNE    A,#BCD_CODE,$MODE2
        SJMP    DISP_BCD
$MODE2  CJNE    A,#SEG_CODE,$MODE3
        SJMP    DISP_7SEG
$MODE3  CJNE    A,#U_NUMBER,$MODE4
        SJMP    DISP_BIN
$MODE4  CJNE    A,#D_NUMBER,$MODE5
        SJMP    DISP_BIN
;
$MODE5  SJMP    DISP_BCD
;
DISP_BIN
        MOV     A,B     ;READ IN A BYTE
        PUSH    A
        MOV     A,#NUMBER_L
        ADD     A,COUNT
        MOV     R0,A    ;POINTER IN R0
        POP     A
        MOV     @R0,A   ;SAVE 7 SEGMENT CODE
$1      INC     COUNT   ;COUNTER +1
        MOV     A,COUNT
        CJNE    A,#3,INT0_END
        SETB    DISP_ON ;DISPLAY ON
        MOV     COUNT,#FFH ;WAIT FOR NEXT COMMAND
        MOV     A,MODE
        CJNE    A,#U_NUMBER,$2
        CALL    CONVERT1
        MOV     U_CNT_L,NUMBER_L
        MOV     U_CNT_M,NUMBER_M
        MOV     U_CNT_H,NUMBER_H
        SJMP    $3
$2      CALL    CONVERT2
        MOV     D_CNT_L,NUMBER_L
        MOV     D_CNT_M,NUMBER_M
        MOV     D_CNT_H,NUMBER_H
$3      JMP     INT0_END
;
DISP_7SEG
        MOV     A,B     ;READ IN A BYTE
        PUSH    A
        MOV     A,#DIGIT0
        ADD     A,COUNT
        MOV     R0,A    ;POINTER IN R0
        POP     A
        MOV     @R0,A   ;SAVE 7 SEGMENT CODE
$1      INC     COUNT   ;COUNTER +1
        MOV     A,COUNT
        CJNE    A,#12,INT0_END
        MOV     COUNT,#FFH ;WAIT FOR NEXT COMMAND
        SJMP    INT0_END
;
DISP_BCD
        MOV     A,B     ;READ IN A BYTE
        PUSH    A
        MOV     A,#DIGIT0
        ADD     A,COUNT
        MOV     R0,A    ;POINTER IN R0
        POP     A
        JB      ACC.7,$WITH_DP
$WITHOUT_DP
        CALL    GET_PATTERN ;SAVE IN (R0)
        SJMP    $1
$WITH_DP
        CLR     ACC.7
        CALL    GET_PATTERN
        SETB    ACC.7   ;ADD DECIMAL POINT
        MOV     @R0,A   ;RE-SAVE AGAIN
;
$1      INC     COUNT   ;COUNTER +1
        MOV     A,COUNT
        CJNE    A,#12,INT0_END
        MOV     COUNT,#FFH      ;
;
INT0_END
        POP     07H
        POP     06H
        POP     05H
        POP     04H
        POP     03H
        POP     02H
        POP     01H
        POP     00H
        POP     DPH
        POP     DPL
        POP     B
        POP     A
        POP     PSW
        RETI
;
GET_PATTERN             ;DATA IN ACC THEN SAVE IN @R0
        MOV     DPTR,#SEG_TABLE
        ADD     A,DPL
        MOV     DPL,A
        CLR     A
        MOVC    A,@A+DPTR
        MOV     @R0,A   ;SAVE IN DATA MEMORY
        RET
;
SEG_TABLE
        DB      3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0-9 DIGITS
        DB      00H,00H,00H,00H,00H,00H                 ;>9 ALL BLANK
;
DISP
        CLR     P3.7    ;ENABLE DISPLAY
        JNB     DISP_ON,$1
        CALL    DSP0
        CALL    DSP1
        CALL    DSP2
        CALL    DSP3
        CALL    DSP4
        CALL    DSP5
$1      CALL    DSP_BLANK
;       SETB    P3.7    ;DISABLE DISPLAY
        RET
;
;DATA IN R1,R0 (U,D)
DSP_BLANK
        MOV     P0,#00H
        CALL    CLK4
        CALL    CLK5
        RET
;
DSP0
        MOV     P0,DIGIT0
        CALL    CLK4
        MOV     P0,DIGIT6
        CALL    CLK5
        SETB    P3.4    ;P3.6 P3.5 P3.4=1 0 1
        CLR     P3.5

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -