|
发表于 2007-12-8 08:40:19
|
显示全部楼层
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
MINITEK BIT P3.0
HOURK BIT P3.1
SW1 BIT P3.2;加减计数
SW2 BIT P3.3 ;暂停
DISPBUF EQU 40H ;分、秒存储的起始位置
DISPBIT EQU 48H ;DISPBIT用于判断数码管个数
T2SCNTA EQU 49H
T2SCNTB EQU 4AH
TEMP EQU 4BH ;TEMP是用于付位选的起始值
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
ORG 0040H
START: MOV SECOND,#00H
MOV MINITE,#00H
MOV HOUR,#00H
MOV DISPBIT,#00H
MOV T2SCNTA ,#00H
MOV T2SCNTB ,#00H
MOV TEMP,#0FDH
MOV TMOD,#01H
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) / 256
SETB TR0
SETB ET0
SETB EA
MOV 21H,#3CH
LCALL DISP
NK1:JB MINITEK,NK2
LCALL DELY10MS
JB MINITEK,NK2
INC MINITE
MOV A,MINITE
CJNE A,#60,NS60
MOV MINITE,#00H
NS60: LCALL DISP
JNB MINITEK,$
NK2: JB HOURK,NK3
LCALL DELY10MS
JB HOURK,NK3
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
NH24: LCALL DISP
JNB HOURK,$
NK3: LJMP NK1
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DISP:
MOV A,#DISPBUF ;DISPBUF=40H
ADD A,#6 ;(A)=46H
DEC A
MOV R1,A ;R1=(45H)
MOV A,HOUR
MOV B,#10
DIV AB
MOV @R1,A ;(45H)=HOUR高
DEC R1
MOV A,B
MOV @R1,A ;(44H)=HOUR低
DEC R1 ;R1=(43H)
MOV A,MINITE
MOV B,#10
DIV AB
MOV @R1,A ;(43H)=MINITE高
DEC R1
MOV A,B
MOV @R1,A ;(42H)=MINITE低
DEC R1
MOV A,SECOND
MOV B,#10
DIV AB
MOV @R1,A ;(41H)=SECONE高
DEC R1
MOV A,B
MOV @R1,A ;(40h)=SECOND低,字符取完则显示
RET
DISP1 JMP DISP
INT_T0:
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) / 256
MOV A,#DISPBUF ;(A)=#40h
ADD A,DISPBIT ;(A)=(40h)
MOV R0,A ;送SECOND高到R0
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;取SECOND高的字符
MOV P2,A ;送出显示
MOV A,DISPBIT ;取第一个数码管位选
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A ;送出位选
INC DISPBIT ;送第二个位选
MOV A,DISPBIT
CJNE A,#06,KNA ;判断是否为最后个数码管的位选,不是就加1
MOV DISPBIT,#00H ;是最后个数码管就清0
KNA: JNB SW1,JIANJISHU
JNB SW2,DONE
INC T2SCNTA ;(49h)=#01
MOV A,T2SCNTA ;不是(a)=#01h
CJNE A,#100,DONE ;判断是否为100?
MOV T2SCNTA,#00H ;是(49H)=#00
INC T2SCNTB ;(4ah)=#01
MOV A,T2SCNTB ;(A)=#01H
CJNE A,#05H,DONE ;判断是否为5,不是则返回
MOV T2SCNTB,#00H ;是(4AH)=#00
INC SECOND ;SECOND加1
MOV A,SECOND
CJNE A,#60,NEXTT ;是否为60S
MOV SECOND,#00H ;是则清0 SECOND
INC MINITE ;60S 则MINITE加1
MOV A,MINITE
CJNE A,#60,NEXTT ;是否为60M
MOV MINITE,#00H ;是则清0 MINITE
INC HOUR
MOV A,HOUR
CJNE A,#24,NEXTT
MOV HOUR,#00H
JIANJISHU:JNB SW2,DONE
INC T2SCNTA ;(49h)=#01
MOV A,T2SCNTA ;不是(a)=#01h
CJNE A,#100,DONE ;判断是否为100?
MOV T2SCNTA,#00H ;是(49H)=#00
INC T2SCNTB ;(4ah)=#01h
MOV A,T2SCNTB ;(A)=#01H
CJNE A,#05H,DONE ;判断是否为5,不是则返回
MOV T2SCNTB,#00H ;是(4AH)=#00
MOV A,SECOND
CJNE A,#00H,JIANMIAO
MOV A,MINITE
CJNE A,#00H,JIANFEN
MOV A,HOUR
CJNE A,#00H,JIANHOUR
LCALL DONE
JIANHOUR EC HOUR
MOV MINITE,#60
LCALL NEXTT
JIANFEN EC MINITE
MOV SECOND,#60
LCALL NEXTT
JIANMIAO EC SECOND
LCALL NEXTT
NEXTT: LCALL DISP ;否则显示
DONE: RETI
TABLE: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH ,01H,09H
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH
END |
|