#1楼主:数码管显示程序
文章发表于:2008-03-16 12:15
BUFF_LED1 EQU 20H ;数码管显示缓存
BUFF_LED2 EQU 21H
BUFF_LED3 EQU 22H
BUFF_LED4 EQU 23H
BUFF_LED5 EQU 24H
BUFF_LED6 EQU 25H
BUFF_LED7 EQU 26H
BUFF_LED8 EQU 27H
BUFF_LED9 EQU 28H
BUFF_LED10 EQU 29H
BUFF_LED11 EQU 2AH
BUFF_LED_LP EQU 2BH ;T0键盘显示扫描缓存
D1 EQU 30H
D2 EQU 31H
D3 EQU 32H
D4 EQU 33H
D5 EQU 34H
D6 EQU 35H
D7 EQU 36H
D8 EQU 37H
D9 EQU 38H
D10 EQU 39H
D11 EQU 3AH
LED_PORT EQU P0
DIG_PORT EQU P2
DIG_PORT1 EQU P1
org 000h
JMP main
ORG 00BH
JMP T0_INT
org 0023h
ljmp rx_int
ORG 100H
main:MOV SP ,#60H
MOV R0,#7FH
CLR_RAM:MOV A,#00H
MOV @R0,A
DJNZ R0,CLR_RAM
mov sp,#60h
MOV IE,#00H
mov tmod,#21h
mov scon,#50h
MOV IP,#10H
mov pcon,#00h
mov TH1,#0FDH ;sn=9600b/s-n-1
MOV TL1,#0FDH
MOV TL0,#LOW(65536-1000) ;定时器0以1ms中断一次,用于动态扫描
MOV TH0,#HIGH(65536-1000)
;MOV TH0,#244 ;T0=3MS
;MOV TL0,#72
SETB TR1
SETB ES
SETB TR0
SETB ET0
SETB EA
MOV P1,#0FFH ;INIT
MOV P2,#0FFH
;MOV P0,#0FFH
MOV P3,#0FFH
DISP: MOV BUFF_LED1,D1
MOV BUFF_LED2,D2
ANL BUFF_LED2,#0FH
MOV BUFF_LED3,D3
ANL BUFF_LED3,#0FH
MOV BUFF_LED4,D4
ANL BUFF_LED4,#0FH
MOV BUFF_LED5,D5
ANL BUFF_LED5,#0FH
MOV BUFF_LED6,D6
ANL BUFF_LED6,#0FH
MOV BUFF_LED7,D7
ANL BUFF_LED7,#0FH
MOV BUFF_LED8,D8
ANL BUFF_LED8,#0FH
MOV BUFF_LED9,D9
ANL BUFF_LED9,#0FH
MOV BUFF_LED10,D10
ANL BUFF_LED10,#0FH
MOV BUFF_LED11,D11
ANL BUFF_LED11,#0FH
JMP DISP
;----------- SERIAL COMMUNICATION INTRRUPT 串行接收中断--------------------
RX_INT: PUSH ACC
PUSH PSW
JB RI,RECIEVE
AJMP END_RX
;CLR RI
;MOV A,SBUF ;读接收字节
;CLR C
;SUBB A,#30H ;转换文本ASCii为数字
;MOV BUFF_LED1,BUFF_LED2 ;循环移动显示
;MOV BUFF_LED2,BUFF_LED3
;MOV BUFF_LED3,BUFF_LED4
;MOV BUFF_LED4,BUFF_LED5
;MOV BUFF_LED5,BUFF_LED6
;MOV BUFF_LED6,A
;CLR EA
;PUSH ACC
RECIEVE: CLR RI
MOV A,#00
MOV A,SBUF ;将接收的数据送显示
LCALL SHIFT
MOV D11,A
END_RX: POP PSW
POP ACC
RETI
;------------- T0 INTRRUPT 数码管扫描定时中断---------------------------
T0_INT: PUSH ACC
PUSH PSW
MOV TL0,#LOW(65536-1000) ;定时器0以1ms中断一次,用于动态扫描
MOV TH0,#HIGH(65536-1000)
;MOV TH0,#244 ;T0=3MS
;MOV TL0,#72
INC BUFF_LED_LP
MOV A,BUFF_LED_LP
CJNE A,#0cH,CONT_SCAN
MOV BUFF_LED_LP,#01H
CONT_SCAN: MOV A,BUFF_LED_LP
DEC A
RL A
MOV DPTR,#TAB_SCAN
JMP @A+DPTR
TAB_SCAN: AJMP SCAN_L1
AJMP SCAN_L2
AJMP SCAN_L3
AJMP SCAN_L4
AJMP SCAN_L5
AJMP SCAN_L6
AJMP SCAN_L7
AJMP SCAN_L8
AJMP SCAN_L9
AJMP SCAN_L10
AJMP SCAN_L11
SCAN_L1: MOV DIG_PORT,#01111111B
MOV A,BUFF_LED1
CJNE A,#4DH,END_SCAN1
JMP END_SCAN2
SCAN_L2: MOV DIG_PORT,#10111111B
MOV A,BUFF_LED2
JMP END_SCAN
SCAN_L3: MOV DIG_PORT,#11011111B
MOV A,BUFF_LED3
JMP END_SCAN
SCAN_L4: MOV DIG_PORT,#11101111B
MOV A,BUFF_LED4
JMP END_SCAN
SCAN_L5: MOV DIG_PORT,#11110111B
MOV A,BUFF_LED5
JMP END_SCAN
SCAN_L6: MOV DIG_PORT,#11111011B
MOV A,BUFF_LED6
JMP END_SCAN
SCAN_L7: MOV DIG_PORT1,#11111110B
MOV A,BUFF_LED7
JMP END_SCAN
SCAN_L8: MOV DIG_PORT1,#11111101B
MOV A,BUFF_LED8
JMP END_SCAN
SCAN_L9: MOV DIG_PORT1,#11111011B
MOV A,BUFF_LED9
JMP END_SCAN
SCAN_L10: MOV DIG_PORT1,#11110111B
MOV A,BUFF_LED10
JMP END_SCAN
SCAN_L11: MOV DIG_PORT1,#11101111B
MOV A,BUFF_LED11
JMP END_SCAN
END_SCAN1: MOV A,#0C0H
MOV LED_PORT,A
POP PSW
POP ACC
RETI
END_SCAN2: MOV A,#0BFH
MOV LED_PORT,A
POP PSW
POP ACC
RETI
END_SCAN: MOV DPTR,#TAB_LED
MOVC A,@A+DPTR
MOV LED_PORT,A
POP PSW
POP ACC
RETI
SHIFT:
MOV D1,D2
MOV D2,D3
MOV D3,D4
MOV D4,D5
MOV D5,D6
MOV D6,D7
MOV D7,D8
MOV D8,D9
MOV D9,D10
MOV D10,D11
RET
TAB_LED:DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;数码管显示字型表
DB 82H,0F8H,80H,90H,88H,83H,0A7H
DB 0A1H,86H,8EH,0FFH
END