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

📄 timer.asm

📁 利用AT89S51单片机制作简易电子表.本程序用汇编语言编写
💻 ASM
字号:
key_mm_sign   bit 00h
key_hh_sign   bit 01h
;;;;;;;;;;;;;;;;中断入口程序;;;;;;;;;;;;;;;;;
            org 0000h
            ajmp start
            org 0003h
            reti
            org 000bh
            ljmp intt0      ;定时器0中断入口地址程序
            org 0013h
            reti
            org 001bh
            reti
            org 0023h
            reti
;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;
            org 0050h
start:      mov r0,#70h
            mov r7,#06h
cleardisp:  mov @r0,#00h
            inc r0
            djnz r7,cleardisp
            mov 75h,#01h
            mov 74h,#02h
                            ;定时器t0初始化;
            mov tmod,#01h
            mov th0,#3ch
            mov tl0,#0b5h

            setb ea           ;开所有中断
            setb et0         ; 开定时器中断
            setb tr0         ;开启T0
            mov r4,#14h
start1:     lcall display      ;调用显示程序
            call  key_mm
            call  key_hh
            jmp start1

;;;;;;;;;;;;;;;;;;;;;;1s 计时程序;;;;;;;;;;;;;;;;;;;;;
intt0:      push acc        ;入栈保护寄存器,状态字
            push psw
            clr  et0        ;关中断,定时器T0
            clr  tr0
            mov tl0,#0bdh
            mov th0,#3ch
            setb tr0        ;开中断
            djnz r4,outt0   ;1S到否?没到,退出中断服务子程序
            cpl  p3.0
ddss:       mov r4,#14h     ;到了,计数器重置初值。
            INC   70h       ;秒个位加1
            MOV   A,70h
            CJNE  A,#0AH,outt0  ;秒个位等于十否?不等于跳出中断
            cpl   p3.1
            MOV   70h,#00H      ;等于,秒个位清零
            INC   71h           ;秒十位加一
            MOV   A,71h
            CJNE  A,#06H,outt0
            MOV   71h,#00H
addmm:      INC   72h
            MOV   A,72h
            CJNE  A,#0AH,outt0
            mov   72h,#00h
            inc   73h
            mov   a,73h
            CJNE  A,#06H,outt0
            mov   73h,#00h
addhh:      inc   74h
            mov   a, 74h
            cjne  a,#0ah,addhh_loop    ;时个位不等于0ah ,与04H比较
            mov   74h,#00h             ;时个位等于0ah,清零
            inc   75h                  ;
            jmp   outt0
addhh_loop: cjne  a,#04h,outt0         ;不等于04H,中断返回
            mov   a,75h                ;等于就再比较时十位,如果十位等于02H
            cjne  a,#02h,outt0
            mov  70h,#00h              ;秒,分,十显示区全部清零,不等于02H就
            mov  71h,#00h
            mov  72h,#00h
            mov  73h,#00h
            mov  74h,#00h
            mov  75h,#00h
outt0:                                 ;中断返回
            pop psw
            pop acc
            setb et0
            reti


;;;;;;;;;;;;;;;;;;;;;;;时针调整程序;;;;;;;;;;;;;;;;;;;;;;;;
;当键被按下时进入此程序

;;;;;;;;;;;;;;;;;调分钟程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
key_mm:
         jnb p1.1,key_mmnext
         clr key_mm_sign
         jmp key_mmret
key_mmnext:
         jb key_mm_sign,key_mmret
         setb key_mm_sign
         call dk5ms
         jb   p1.1,key_mmret
         INC   72h
         MOV   A,72h
         CJNE  A,#0AH,key_mmret
         mov   72h,#00h
         inc   73h
         mov   a,73h
         CJNE  A,#06H,key_mmret
         MOV  72H,#00H
         MOV  73H,#00H

key_mmret: ret


key_hh:
         jnb p1.2,key_hhnext
         clr key_hh_sign
         jmp key_hhret
key_hhnext:
         jb key_hh_sign,key_hhret
         setb key_hh_sign
         call dk5ms
         jb   p1.2,key_hhret
            inc   74h
            mov   a, 74h
            cjne  a,#0ah,key_hh_loop
            mov   74h,#00h
            inc   75h
            jmp   key_hhret
key_hh_loop:
            cjne  a,#04h,key_hhret
            mov   a,75h
            cjne  a,#02h,key_hhret
            mov  74h,#00h
            mov  75h,#00h
key_hhret: ret


;;;;;;;;;;;;;;;;;;;;;;;;显示程序;;;;;;;;;;;;;;;;;;;;;;
;显示数据在70H-75H单元内,用六位共阳数码管显示,P0口输出段码数据,P2口作出
;扫描控制,每个LED亮1MS时间逐位循环
display:
           mov r1,#70h   ;指向显示缓冲区的首地址
           mov r5,#00h   ;数码管显示从最低位开始
play:      mov a,r5
           mov p2,a
           mov a,@r1
           mov dptr,#tab
           movc a,@a+dptr
           mov p0,a
           lcall dl5ms
           mov p0,#0ffh      ;消隐
           inc  r1
           inc  r5
           cjne r5,#06h,play
endout:
           mov p0,#0ffh          ;关动态显示屏
;           mov p2,a
           ret
  tab:     DB 0C0h,0F9h,0A4h,0B0h,099h,092h,082h,0F8h,080h,90h

         ;0   1   2   3   4   5   6  7    8   9   不亮
;;;;;;;;;;;;;延时程序;;;;;;;;;;;;;;;;;;;;;;;;
;1ms  延时程序,LED显示用

dl5ms:  push 06h
        push 07h
        mov  r6,#32h
dl1:    mov r7,#10h

dl2:   djnz r7,dl2
       djnz r6,dl1
       nop
       nop
       nop

       pop  07h
       pop  06h
       ret

dk5ms:  push 06h
        push 07h
        mov  r6,#32h
dk1:    mov r7,#20h

dk2:   djnz r7,dk2
       djnz r6,dk1
       nop
       nop
       nop
       pop  07h
       pop  06h
       ret
       end

⌨️ 快捷键说明

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