⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhong.asm

📁 本压缩包包含1602液晶显示
💻 ASM
字号:
本程序为详细的时钟程序!

org 0000h
ajmp start     ; ;转初始化程序
org 0003h
ajmp terrout0   ;;转外中断0(按键)
org 000bh
ajmp clock0   ; ;转定时中断0
org 0013h
ajmp terrout1  ; ;转外中断1(按键)
org 001bh
ajmp clock1   ; ;转定时中断1
org 0023h
reti           ; ;串行中断返回
org 0100h
;;----------- ------------初始化程序---------------------------
start:    mov sp, #60h     ;   ;置堆栈地址
        mov r0,#40h        ; ;从40~51H共18个单元清零
        mov r1,#12h
clear0:   mov @r0,#00h
        inc r0
        djnz r1,clear0
        mov tmod,#21h     ; ;计数器t1为方式2,计数器0为方式1
	    mov tl0,#0dch      ; ;计数器t1定时125ms
	    mov th0,#0bh       ;
        mov tl1,#6h         ;;计数器t0定时500us
        mov th1,#6h
        setb it0
        setb it1
	    mov ip, #2h        ; ;定时器T0中断级为最高
	    mov ie,#8fH       ;  ;总中断开放
        setb  tr0          ;  ;开启T0定时器
        mov 3fH,#08h      ;  ;T0计数中断次数,8次中断为1秒
        setb p3.0           ; ;数码管关闭
        setb p3.1
        setb p3.4
        setb p3.5
	    mov 47h,#00h      ; ;显示时间从12:00开始
	    mov 48h,#12h     ;  ;47H为分单元地址,48H为时单元地址
	    mov 40h,#0h       ; ;40H为分低位单元地址
	    mov 41h,#0h       ; ;41H为分高位单元地址
	    mov 42h,#2h       ; ;42H为时低位单元地址
	    mov 43h,#1h       ;;43H为时低位单元地址
  ;--------------------------------核心程序段-----------
main:   mov a,49h          ;根据49H单元中的标志字选择显示的子程序
        cjne a,#0h,dis1      ;为0就正常显示,否则就跳转
        acall normal        ;调用正常显示子程序
        jmp main
dis1:    mov a,49h
        cjne a,#1h,dis2      ;为1就调时,否则就跳转
        acall sethour        ;调用调时子程序
        jmp main
dis2:    mov a,49h
        cjne a,#2h,dis3      ;为2就调分,否则就跳转
        acall setmin        ;调用调分子程序
        jmp main
dis3:    mov a,49h
        cjne a,#3h,dis4      ;为3就闹钟调时,否则就跳转
        acall  setclocka    ;调用闹钟调时子程序
        jmp main
dis4:    mov a,49h
        cjne a,#4h,main      ;为4就闹钟调分,否则就跳转
        acall  setclockb     ;调用闹钟调分子程序
        jmp main
;------------------设置闹种的调分显示程序------------------
setclockb: mov a,3fh
         cjne a,#5,neq0
neq0:     jc lower0          ;亮0.5秒后就熄灭
         acall disSet0         ;调用显示闹钟分低位子程序
         acall disSet1        ;调用显示闹钟分高位子程序
         jmp  condis0
lower0:   clr   p3.5          ;置分低位显示位
	     mov  a ,#0ffh       ;熄灭符送给A口
         mov  p1,a          ;灭灯
	     acall  delms         ;延时
         setb  p3.5          ;关闭分低位显示位
	     clr   p3.4          ;置分高位显示位
         mov  a,#0ffh       ;熄灭符送给A口
         mov  p1,a         ;灭灯
	     acall  delms        ;延时
condis0:  acall dispoint        ;调用小数点闪烁子程序
	     acall disSet2         ;调用显示闹钟时低位子程序
	     acall disSet3         ;调用显示闹钟时高位子程序
	     mov a,49h
         cjne a,#4h,endsetclock0
         jmp setclockb
endsetclock0:  ret
;;------------------设置闹种的调时显示程序------------------
setclocka: acall disSet0         ;调用显示闹钟分低位子程序
         acall disSet1        ;调用显示闹钟分高位子程序
	     acall dispoint        ;调用小数点闪烁子程序
	     mov a,3fh
         cjne a,#5,neq1
neq1:     jc lower1          ;亮0.5秒后就熄灭
         acall disSet2        ;调用显示闹钟时低位子程序
	     acall disSet3        ;调用显示闹钟时高位子程序
         jmp  condis1
lower1:   clr    p3.1        ;置时低位显示位
	     mov a,#0ffh          ;熄灭符送给A口
         mov  p1,a         ;灭灯
	     acall  delms        ;延时
         setb  p3.1         ;关闭时低位显示位
	     clr   p3.0         ;置时高位显示位
         mov a,#0ffh        ;熄灭符送给A口
         mov  p1,a         ;灭灯
	     acall  delms       ;延时
	     setb  p3.0         ;关闭时高位显示位
condis1:  mov a,3fh
         cjne a,#3h,endsetclock1
         jmp setclocka
endsetclock1:  ret
;;------------------ -------设置调分钟显示程序------------------------
setmin:   mov a,3fh
         cjne a,#5,neq2
neq2:     jc lower2            ;亮0.5秒后就熄灭
         acall display0         ;调用显示分低位子程序
	     acall display1         ;调用显示分高位子程序
	     jmp  condis2
lower2:   clr    p3.5
	     mov a,#0ffh           ;熄灭符送给A口
         mov  p1,a
	     acall  delms
         setb   p3.5
	     clr    p3.4
         mov a,#0ffh
         mov  p1,a
	     acall  delms
	     setb  p3.4
condis2:  acall dispoint           ;调用小数点闪烁子程序
         acall display2           ;调用显示时低位子程序
         acall display3           ;调用显示时高位子程序
         mov a,49h
         cjne a,#2h,endmin
         jmp setmin
endmin:  ret
;------------------ -------设置调时钟显示程序------------------------
sethour:  acall display0              ;显示分低位
         acall display1              ;显示分高位
         acall dispoint              ;调用小数点闪烁子程序
         mov a,3fh
         cjne a,#5,neq3
neq3:     jc lower3
         acall display2              ;显示时低位
	     acall display3              ;显示时高位
	     jmp condis3
lower3:   setb   p3.4
	     clr    p3.1
         mov a,#0ffh               ;熄灭符送给A口
         mov  p1,a
	     acall  delms
         setb  p3.1
	     clr   p3.0
         mov a,#0ffh
         mov  p1,a
	     setb p3.0
	     acall  delms
condis3:  mov a,49h
         cjne a,#1h,endhour
         jmp sethour
endhour:  ret
;------------------ -------正常的时候显示程序------------------------
normal:  acall display0             ;显示分低位
        acall display1              ;显示分高位
	    acall dispoint              ;调用小数点闪烁子程序
        acall display2              ;显示时低位
        acall display3              ;显示时高位
        mov a,49h
        cjne a,#0h,endnor
        jmp normal
endnor:  ret
;------------------------ 显示分低位程序-------------------------------------
display0: clr   p3.5                 ;显示分低位;
        mov 	r1,#40H
        mov  a,@r1               ;取显示数据到A
        mov  dptr,#tab
        movc  a,@a+DPTR         ;查显示数据对应段码
        mov  p1,a
        acall  delms
        ret
display1: setb  p3.5                 ;显示分高位
	     clr    p3.4
         mov   r1,#41h
	     mov   a,@r1               ;取显示数据到A
         movc  a,@a+dptr            ;查显示数据对应段码
         mov 	p1,a
         acall 	delms
         ret
display2:  setb   p3.4                 ;显示时低位
	     clr    p3.1
         mov    r1,#42h
         mov   a,@r1                 ;取显示数据到A
         movc	a,@a+dptr             ;查显示数据对应段码
         mov 	p1,a
	     acall 	delms
         ret
display3:  setb  p3.1                   ;显示时高位
	     clr  p3.0
	     mov    r1,#43H
         mov   a,@r1                  ;取显示数据到A
         movc	a,@a+dptr              ;查显示数据对应段码
         mov 	p1,a
	     acall 	delms
         setb   p3.0
	     ret
dispoint:  mov a,3fh                      ;小数点闪烁显示
         cjne a,#5,neq4
neq4:     jc lower4
         mov a,#0ffh
         mov p1,a
         setb p3.4
         setb p3.1
         acall delms
	     jmp endpoint
lower4:   mov a,#7fh
         mov p1,a
         clr p3.4
         clr p3.1
         acall delms
         setb p3.4
         setb p3.1
endpoint:  ret
delms:   mov r7,#0ffH                     ;延时子程序
delms1:  djnz r7,delms1
        ret
tab:     db 88h,0bbh,94h,91h,0a3h,0c1h,0c0h,9bh,80h,81h
;;---------------------------- 时钟时、分、秒加1程序---------------------------
clock0:  orl tl0,#0dch                      ;定时器0中断子程序
       mov th0,#0bh
       push psw
       push acc
       mov psw,#8h                      ;置寄存器组1为当前寄存器组
       djnz 3fH,ptfr0                      ;没到1秒就退出,继续定时
       mov 3fH,#08H                     ;到1秒重新置中断次数
       mov r0,#46H                       ;秒单元(46H)加1
       mov a,@r0
       add a,#1
       da a
       mov @r0,a
       cjne a,#60H,ptfr0                   ;没到60秒就退出
       mov @r0,#0h                      ;到60秒就秒单元复位
       inc r0                             ;分单元(47H)加1
       mov a,@r0
       add a,#1
       da a
       mov @r0,a                        ;分单元拆为高、低两部分BCD码
       anl a,#0fh
       mov 40h,a                         ;分低位单元(40H)
       mov a,@r0
       swap a
       anl a,#0fh
       mov 41h,a                          ;分高位单元(41H)
       acall alarmstart                      ;测试是否该闹铃
       acall alarmclose                      ;关闹铃
       mov a,@r0
       cjne a,#60H,ptfr0                     ;没到60分就退出
       mov @r0,#0                         ;到60分分单元就置0
       mov 40h,#0h
       mov 41h,#0h
       inc r0                               ;时单元(48H)加1
       mov a,@r0
       add a,#1
       da a
       mov @r0,a                           ;时单元拆为高、低两部分BCD码
       anl a,#0fh
       mov 42h,a                           ;时低位单元(42H)
       mov a,@r0
       swap a
       anl a,#0fh
       mov 43h,a                            ;时高位单元(43H)
       acall alarmstart                        ;测试是否该闹铃
	   mov a,@r0
       cjne a,#24h,ptfr0                       ;没到24时就退出
       mov @r0,#0                          ;到24时就时单元置0
       mov 42h,#0
       mov 43h,#0
ptfr0:   pop  acc                            ;中断返回
       pop  psw
       reti
;----------------- -外中断0用来设置功能选项-----------
terrout0: push psw
       push acc
       call delms
       jnb p3.2,d2
        pop acc
       pop psw
       reti
d2:    clr  ex0
       mov a,49h
       add a,#1h
	   da a
	   mov 49h,a
       cjne a,#5h,clear
clear:   jc  return
       mov a,#0h
       mov 49h,a
return:  acall delay
       setb ex0
       pop acc
       pop psw
       reti
  ;------------------------------外中断1用来对相应的单元内容加1
terrout1:push psw
       push acc
       acall testclock
       call delms
       jnb p3.3, d1
         pop acc
       pop psw
       reti
d1:    mov a,49h
       cjne a,#1h,con1
       mov a,48h
       add a,#1h
       da a
       mov 48h,a
       anl a,#0fh
       mov 42h,a
       mov a,48h
       swap a
       anl a,#0fh
       mov 43h,a
       mov a, 48h
       cjne a,#24h,return1
	   mov 48h,#0h
       mov 42h,#0h
       mov 43h,#0h
	   ajmp return1
con1:   mov a,49h
       cjne a,#2h,con2
       mov a,47h
	   add a,#1h
	   da a
	   mov 47h,a
       anl a,#0fh
       mov 40h,a
       mov a,47h
       swap a
       anl a,#0fh
       mov 41h,a
       mov a,47h
	   cjne a,#60h,return1
	   mov 47h,#0h
       mov 41h,#0h
	   ajmp return1
con2:   mov a,49h
       cjne a,#3h,con3
       mov a,4bh
	   add a,#1h
	   da a
	   mov 4bh,a
       anl a,#0fh
       mov 4fh,a
       mov a,4bh
       swap a
       anl a,#0fh
       mov 50h,a
       mov a,4bh
	   cjne a,#24h,return1
	   mov 4bh,#0h
	   mov 4fh,#0h
	   mov 50h,#0h
	   ajmp return1
con3:   mov a,49h
       cjne a,#4h,return1
       mov a,4ah
	   add a,#1h
	   da a
	   mov 4ah,a
       anl a,#0fh
       mov 4dh,a
       mov a,4ah
       swap a
       anl a,#0fh
       mov 4eh,a
       mov a,4ah
	   cjne a,#60h,return1
	   mov 4ah,#0h
	   mov 4eh,#0h
	   ajmp return1
return1:  acall delay
       pop acc
       pop psw
       reti
;;---------------------闹种响铃程序,频率2000Hz
clock1:  cpl p3.2
       reti
;;--------------------------闹钟开始操作
alarmstart: mov a,47h
         cjne a,4ah,endalarm
	     mov a,48h
	     cjne a,4bh,endalarm
	     mov 4ch,#1h                 ;设置标志位,1表示闹钟已开
	     clr ex0                      ;关闭外中断0
	     setb tr1
endalarm:  ret
;;---------------------------闹种结束操作
alarmclose: mov a,4ch
          cjne a,#1,endalarm1
	      mov a,4ah
	      add a,#1h
	      da a
	      cjne a,47h,endalarm1
	      clr tr1
          setb  p3.2
          setb ex0
	      mov 49h,#0h
	      mov 4ch,#0h
endalarm1:  ret
;;--------------------------------------设置闹钟时间显示程序
disset0:    clr   p3.5
          mov 	r1,#4dh      ;显示分低位
          mov  a,@r1        ;取显示数据到A
         mov  dptr,#tab
         movc	a,@a+dptr    ;查显示数据对应段码
         mov 	p1,a
         acall 	delms
         ret
disset1:   setb  p3.5             ;显示分高位
	     clr   p3.4
         mov    r1,#4eh
	     mov  a,@r1            ;取显示数据到A
         movc	a,@a+dptr       ;查显示数据对应段码
         mov 	p1,a
         acall 	delms
         ret
disset2:   setb  p3.4
	     clr   p3.1
         mov    r1,#4fh
         mov   a,@r1         ;取显示数据到A
         movc	a,@a+dptr     ;查显示数据对应段码
         mov 	p1,a
	     acall 	delms
         ret
disSet3:  setb  p3.1
	     clr  p3.0
	     mov   r1,#50H
         mov   a,@r1         ;取显示数据到A
         movc	a,@a+dptr     ;查显示数据对应段码
         mov 	p1,a
	     acall 	delms
         setb  p3.0
	     ret
 delay:   mov r5,#0a0H
 delay1:  mov r4,#0ffh
 ddd:    djnz r4,ddd
         djnz r5,delay1
         ret
 testclock: mov a,4ch
         cjne a,#1h,testend
         clr tr1
         setb p3.2
         setb ex0
	     mov 4ch,#0h
	     mov 49h,#0h
 testend:  ret
  end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -