📄 at89c2051时钟程序b.asm
字号:
;***************AT89C2051时钟程序 ****************** ;
; 29H:毫秒,
; 30H:毫秒,
; 31H:秒,32H:分,
; 33H:时
; P3.7为分按钮,
; P1.7为时按钮,
; P3.0:夜光灯开关-0输出
; P1口 为字符输出口,采用共阳显示管。
; 50H:键盘扫描计数(速度?
; 51H:延时单元
; 52H:闪烁单元
; 00H:秒闪
; 01H:补充暗显时的键盘扫描速率
; 02H:闪
; 03H:闪烁形状,0为开
; 04H:秒显示转换
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
nop
;***************** 主 程 序 ************************
START: MOV P3,#0FFH
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 20H,#00H
MOV 33H,#12
MOV 50H,#00H
MOV 51H,#80
MOV 52H,#00
MOV TMOD,#10B
MOV TL0,#06H
MOV TH0,#06H
SETB EA
SETB ET0
SETB TR0
;****************** 键盘扫描 **************************
KEY: LCALL LEDDISP
JB P3.7,KEY31
LCALL LEDDISP
JB P3.7,KEYOUT
INC 50H
MOV A,50H
CJNE A,#200,KEYOUT ;调键盘速度-分
INC 32H
MOV 50H,#00H
SETB 03H
SETB 02H
KEY31: JB P3.1,KEYS
LCALL LEDDISP
JB P3.1,KEYOUT
INC 50H
MOV A,50H
CJNE A,#200,KEYOUT ;调键盘速度-时
INC 33H
MOV 50H,#00H
SETB 03H
SETB 02H
KEYS: JB P3.5,KEYOUT
LCALL LEDDISP
LCALL LEDDISP
JB P3.5,KEYOUT
INC 50H
MOV A,50H
CJNE A,#200,KEYOUT ;调键盘速度-时
CPL 04H
KEYOUT: SJMP KEY
;****************** 中断服务 **************************
INTT0: PUSH ACC
PUSH PSW
INC 29H
MOV A,29H
CJNE A,#200,S
INC 30H ;MS+1
MOV 29H,#00H
INC 52H ;闪烁计数
MOV A,52H
CJNE A,#10,T52H
CPL 00H
JB 03H,F
CPL 02H
F: MOV 52H,#00
T52H:
S: MOV A,30H
CJNE A,#20,M
INC 31H ;S+1
MOV 30H,#00H
ACALL YGDCOMP ;夜光灯
M: MOV A,31H
CJNE A,#60,H
CPL P1.7
INC 32H ;M+1
MOV 31H,#00H
H: MOV A,32H
CJNE A,#60,H1
INC 33H ;H+1
MOV 32H,#00H
H1: MOV A,33H
CJNE A,#24,INTT0OUT
MOV 33H,#00
INTT0OUT: POP PSW
POP ACC
RETI
;******************** 夜光灯比校 *******************
YGDCOMP: MOV A,33H
CJNE A,#20,YGDCOMP1 ;亮夜光灯
CLR P3.0
YGDCOMP1: CJNE A,#22,YGDCOMP2 ;暗显示
MOV 51H,#20 ;调暗亮度
SETB 01H
YGDCOMP2: CJNE A,#7,YGDCOMPOUT
SETB P3.0
MOV 51H,#80
CLR 01H
YGDCOMPOUT: RET
;******************** 分配显示单元 *******************
;3Ah:时十位/3Bh:时个位
;3Ch:分十位/3Dh:分个位
DISP: mov a,33h ;十六进制转十进制
mov b,#10
div ab
mov 3Ah,a
mov 3Bh,b
mov a,32h
mov b,#10
div ab
mov 3Ch,a
mov 3Dh,b
mov a,31h
mov b,#10
div ab
mov 3Eh,a
mov 3Fh,b
RET
;******************** 动态显示 ***********************
LEDDISP: LCALL DISP
MOV DPTR,#TABLED ;指定查表启始地址
;//H
JB 04H,MS1
MOV A,3Ah ; 取时十数
SJMP MSOUT1
MS1: MOV A,3CH
MSOUT1: MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,a ;送出十位的7段代码
MOV A,3AH
CJNE A,#0,H_1 ;时的十位为0 时不显示
SJMP H_2
H_1: JNB 02H,T01HOUT ;闪烁
clr p3.5 ;开十位显示
H_2: acall D1ms ;显示162微秒
setb p3.5 ;关闭十位显示,防止鬼影
JNB 01H,T01HOUT ;夜间时执行
ACALL D1_1MS ;补充延时
CLR P3.5
NOP
NOP
NOP
SETB P3.5
ACALL D1_1MS
T01HOUT: JB 04H,MS2
mov a,3Bh ;取时个位数
SJMP MSOUT2
MS2: MOV A,3DH
MSOUT2: MOVC A,@A+DPTR ;查十位数的7段代码
mov p1,a ;送出十位的7段代码
JNB 00H,T20OUT2
CLR P1.7
SJMP T20OUT
T20OUT2: SETB P1.7
T20OUT: JNB 02H,T01HOUT3 ;闪烁
clr p3.4 ;开十位显示
acall D1ms
setb p3.4 ;关闭十位显示,防止鬼影
JNB 01H,T01HOUT3
ACALL D1_1MS
CLR P3.4
NOP
NOP
NOP
SETB P3.4
ACALL D1_1MS
T01HOUT3: ;//M
JB 04H,MS3
mov a,3Ch ;取分十位数
SJMP MSOUT3
MS3: MOV A,3EH
MSOUT3: MOVC A,@A+DPTR ;查个位数的7段代码
mov p1,a ;送出个位的7段代码
JNB 02H,T01HOUT4 ;闪烁
clr p3.3 ;开个位显示
acall D1ms ;显示162微秒
setb p3.3 ;关闭个位显示,防止鬼影
JNB 01H,T01HOUT4
ACALL D1_1MS
CLR P3.3
NOP
NOP
NOP
SETB P3.3
ACALL D1_1MS
T01HOUT4: JB 04H,MS4
mov a,3Dh ;取分个位数
SJMP MSOUT4
MS4: MOV A,3FH
MSOUT4: MOVC A,@A+DPTR ;查十位数的7段代码
mov p1,a ;送出十位的7段代码
JNB 02H,T01HOUT5 ;闪烁
clr p3.2 ;开十位显示
acall D1ms ;显示162微秒
setb P3.2 ;关闭十位显示,防止鬼影
JNB 01H,T01HOUT5
ACALL D1_1MS
ACALL D1_1MS
T01HOUT5: RET
TABLED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;******************** 延时程序 *********************
D1MS: MOV R7,51H ;2+2X80=162微秒,延时按12MHZ计算
DJNZ R7,$
RET
D1_1MS: MOV R7,#30 ;
DJNZ R7,$
RET
DS20MS: ACALL LEDDISP
ACALL LEDDISP
ACALL LEDDISP
RET
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H
DL05S1: LCALL LEDDISP
DJNZ R3,DL05S1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -