📄 7_flagdisp.asm.asm
字号:
;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 + -