📄 time22.asm
字号:
; 李坤三作品:时钟数码显示。AT89S52单片机控制,P1口的0-5口用于扫描,P0口用于段码显示;
; 定时器0工作于方式1;s1键控制调整分钟,S2键控制调整小时,S3键用于启动流水灯演示
;P3口的(0-3);S17用于控制P3.7口的输出,控制继电器Q2;S18用于控制P3.6口的输出
;控制继电器Q3;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 开始:主程序 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 00h
jmp start
org 0bh
jmp tim0
;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;
start:
mov sp,#50h
mov r3,#6
clear:
mov r0,20h ;显示器寄存器赋初值
mov @r0,#00h
inc r0
djnz r3,clear
setb p3.6
setb p3.7
mov 2ah,#12h ;时
mov 2bh,#00 ;分
mov 2ch,#00 ;秒
mov tmod,#00000001b ;time0,model1
mov tl0,#0b0h
mov th0,#3ch
mov r4,#14h;1s
setb ea
setb et0
setb tr0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 键盘扫描程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main: lcall dis0
lcall display
mov r3,#04h
mov R0,#0feh;1111 1110b ;P2.0=0,扫描初值
key1:mov A,R0
mov p2,a
call delay0
mov a,p2
jnb acc.4,sett ;若P2.4=0,说明被按下,转
mov a,r0
rl a
mov r0,a
djnz r3,key1
ajmp main
sett: lcall de5ms
jnb acc.4,set0
ajmp main
set0:mov a,p2
jnb acc.4,set0
mov a,r3
dec a
rl a
mov dptr,#mmtab
jmp @a+dptr
mmtab:
sjmp setmm0
sjmp setnn0
sjmp setjj1
sjmp setjj2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 调时程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
setmm0:clr et0
clr tr0
setmin:mov a,2bh
add a,#1
da a
mov 2bh,a
mov 2ch,#00h
cjne a,#60h,setout
mov 2bh,#00h
ajmp setout
setnn0:clr et0
clr tr0
sethou:mov a,2ah
add a,#1
da a
mov 2ah,a
cjne a,#24h,setout ;不是24H,重新扫描
mov 2ah,#00h
sjmp setout
setout:call dis0
call display
setb et0
setb tr0
ljmp main
setjj1:cpl p3.7
call dis0
call display
ljmp main
setjj2:cpl p3.6
call dis0
call display
ljmp main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 中断服务程序 1S ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tim0: push acc
push psw
clr et0
clr tr0
mov tl0,#0b0h
mov th0,#3ch
djnz r4,out0
mov r4,#14h;重赋值
call clock;调计时程序
out0:call dis0
call display
setb et0
setb tr0
pop psw
pop acc
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 加1子程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
clock:
mov a,2ch ;秒
add a,#1
da a
mov 2ch,a
cjne a,#60h,out1;不是60秒退出
mov 2ch,#00
mov a,2bh ;分
add a,#1
da a
mov 2bh,a
cjne a,#60h,out1
mov 2bh,#00
mov a,2ah ;时
add a,#1
da a
mov 2ah,a
cjne a,#24h,out1
mov 2ah,#00
out1:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 调整子程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dis0:push acc
push psw
setb rs0
setb rs1
mov r1,#20h
mov a,2ch
mov b,#10h
div ab
mov @r1,b ;把B的内容存入20H,秒个位
inc r1
mov @r1,a ;把A的内容放入21H,秒十位
inc r1
mov a,2bh
mov b,#10h
div ab
mov @r1,b ;入22H,分个位
inc r1
mov @r1,a ;入23H,分十位
inc r1
mov a,2ah
mov b,#10h
div ab
mov @r1,b ;入24H,时个位
inc r1
mov @r1,a ;入25H,时十位
pop psw
pop acc
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示子程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
display: push acc
push psw
setb rs1
clr rs0
mov r0,#25h
mov r2,#11111110b;秒扫描字初值
display0:mov a,r2
mov p1,a
mov a,@r0
mov dptr,#tab
movc a,@a+dptr
mov p0,a
call delay0
dec r0
mov a,r2
jnb acc.5,endout
rl a
mov r2,a
ajmp display0
endout:mov p1,#0ffh
mov p0,#00h
pop psw
pop acc
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数字表 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tab:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00h
;共阴表,0123456789不亮;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 延时子程序 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
de5ms:mov r5,#60 ;5ms
d1:mov r4,#248
djnz r4,$
djnz r5,d1
ret
delay0:mov r6,#10 ;1ms
dl1:mov r7,#15
dl2:djnz r7,dl2
djnz r6,dl1
ret
delay:
mov r2,#50
xx1:mov r1,#20
xx2:mov r3,#248
djnz r3,$
djnz r1,xx2
djnz r2,xx1
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -