allok.asm

来自「这是一个在单片机实现时钟的程序」· 汇编 代码 · 共 317 行

ASM
317
字号
 ZXK  equ  0FF22h
 ZWK  equ  0FF21h
        org 0000h
        Ljmp start 
        org 000bh
        Ljmp int_t0
        org 001bh
        Ljmp int_t1
        org 0050h
start:  
        mov sp, #40h
        mov 30h,#08h      ;C 时
        mov 31h,#55h      ;C 分
        mov 32h,#55h      ;C 秒
        mov 33h,#00h      ;C 毫秒
        mov 34h,#00h      ;R 分
        mov 35h,#00h      ;R 秒
        mov 36h,#00h      ;R 毫秒
        mov 37h,#0ach     ;alarm
        mov 38h,#02h      ;D 时
        mov 39h,#00h      ;D 分
        mov 3ah,#00h      ;R 状态
        mov 3bh,#00h      ;系统状态
        mov 3ch,#00h      ;key 接口


        mov tmod,#11h
        setb ea
        mov tl0,#78h
        mov th0,#0ech        
        setb et0
        setb pt0
        setb tr0
        mov tl1,#78H
        mov th1,#0ecH
        setb et1
        clr  pt1
        setb tr1

KEYSCAN:
        LCALL    KEY
        mov      a,3CH
        ANL      A,#07H             ;取低三位
        jz       KEYSCAN
        MOV      A,3Ch              ;读取KEY状态
        ANL      A,#04H
        JZ       KEYBC              ;KEYA未被按下 执行KEYBC
        MOV      A,3bh
        INC      A                  ;KEYA 被按下,系统状态加1
        MOV      3bh,A
        CJNE     A,#03H, CLRKEY     ;系统状态<>3
        MOV      3bh,#00H
        LJMP     CLRKEY
KEYBC:  MOV      A,3bh              ;读取系统状态
        JZ       ccontr             ;0 状态 钟表控制     Ccontr
        DEC      A
        JZ       rcontr             ;1 状态 跑表控制     Rcontr
        DEC      A
        JZ       dcontr             ;2 状态 定时控制     Dcontr

ccontr: MOV      A,3Ch              ;读取KEY状态
        ANL      A,#02H
        JZ       KEYCC              ;KEYCB未被按下 执行KEYCC
        MOV      A,30h
        ADD      A,#1
        DA       A                  ;KEYCB 被按下,C 时加1
        MOV      30h,A
        CJNE     A,#24H, CLRKEY     ;C 时<>24
        MOV      30h,#00H
        LJMP     CLRKEY
KEYCC:  MOV      A,31h
        ADD      A,#1
        DA       A                  ;KEYCC 被按下,C 分加1
        MOV      31h,A
        CJNE     A,#60H, CLRKEY      ;C 分<>60
        MOV      31h,#00H
        LJMP     CLRKEY
rcontr: MOV      A,3Ch              ;读取KEY状态
        ANL      A,#02H
        JZ       KEYRC              ;KEYRB未被按下 执行KEYRC
        MOV      A,3ah              ;KEYRB 被按下  读入R 状态
        JNZ      CLRKEY             ; R 计时状态  无效退出
        mov      34h,#00h
        mov      35h,#00h           ;R 停止状态 全部清0
        mov      36h,#00h
        LJMP     CLRKEY
KEYRC:  MOV      A,3ah
        CPL      A                  ;KEYRC 被按下  反转 R 状态
        MOV      3ah,A
        LJMP     CLRKEY
dcontr: MOV      A,3Ch              ;读取KEY状态
        ANL      A,#02H
        JZ       KEYDC              ;KEYDB未被按下 执行KEYDC
        MOV      A,38h
        ADD      A,#1
        DA       A                  ;KEYDB 被按下,D 时加1
        MOV      38h,A
        CJNE     A,#24H, CLRKEY      ;D 时<>24
        MOV      38h,#00H
        LJMP     CLRKEY
KEYDC:  MOV      A,39h
        ADD      A,#1
        DA       A                  ;KEYDC 被按下,D 分加1
        MOV      39h,A
        CJNE     A,#60H, CLRKEY      ;D 分<>60
        MOV      39h,#00H
CLRKEY: mov      3ch,#00h           ;key 响应完 清除
        LJMP     KEYSCAN
        
int_t0:  
         push 7
         push 6                 ;保存现场
         push 5
         push 4
         push 3                
         push 2
         push 1
         push 0
         push dph
         push dpl
         push acc
         push psw         
         mov r3,30h             ;C 时
         mov r2,31h             ;C 分
         mov r1,32h             ;C 秒
         mov r7,33h             ;C 毫秒
         mov r6,34h             ;R 分
         mov r5,35h             ;R 秒
         mov r4,36h             ;R 毫秒

         CLR     TR0
         MOV     TL0,#78H       ;10mS 定时常数
         MOV     TH0,#0eCH
         SETB    TR0

         MOV     A,R7
         ADD     A,#1            ;C毫秒加1
         DA      A
         MOV     R7,A
         CJNE    R7,#00H,RUNCLK  ;判断C毫秒=100
         CJNE    R1,#59H,SECOND  ;判断C秒=59
         MOV     R1,#99H
         CJNE    R2,#59H,MINUTE  ;判断C分=59
         MOV     R2,#99H
         CJNE    R3,#23H,HOUR    ;判断C时=23
         MOV     R3,#99H
HOUR:    MOV     A,R3
         ADD     A,#1            ;C时加1
         DA      A
         MOV     R3,A
MINUTE:  SETB    P3.0
;        mov     3ch,#01h        ;测试key 接口
         MOV     A,R2
         ADD     A,#1            ;C分加1
         DA      A
         MOV     R2,A
SECOND:  MOV     A,R1
         ADD     A,#1            ;C秒加1
         DA      A
         MOV     R1,A
         MOV     A,R2
         CJNE    A,39H, RUNCLK   ;判断C分<>D分转移
         mov     A,30H           ;C 时
         CJNE    A,38H, RUNCLK   ;判断C时<>D时转移
         CLR     P3.0            ;定时到 执行动作
RUNCLK:   MOV     A,3ah          ;读入R 状态
          JZ      exit           ;R 状态为0退出
          MOV     A,R4
          ADD     A,#1           ;R 毫秒加1
          DA      A
          MOV     R4,A
          CJNE    R4,#00H,exit     ;判断R毫秒=100
          CJNE    R5,#59H,RSECOND  ;判断R秒=59
          MOV     R5,#99H        
          MOV     A,R6
          ADD     A,#1              ;R分加1
          DA      A
          MOV     R6,A

RSECOND:  MOV     A,R5
          ADD     A,#1              ;R秒加1
          DA      A
          MOV     R5,A

exit:    mov 30h, r3              ;C 时
         mov 31h, r2              ;C 分
         mov 32h, r1              ;C 秒       
         mov 33h, r7              ;C 毫秒
         mov 34h, r6              ;R 分
         mov 35h, r5              ;R 秒
         mov 36h, r4              ;R 毫秒             
         pop psw                  ;恢复现场
         pop acc    
         pop dpl
         pop dph
         pop 0
         pop 1
         pop 2
         pop 3
         pop 4
         pop 5
         pop 6
         pop 7
         RETI                    ;中断返回 



int_t1:   
         push 0                  ;保存现场
         push 4 
         push 5
         push dph
         push dpl
         push acc
         push psw

         CLR     TR1
         MOV     TL1,#78H        ;30mS 定时常数
         MOV     TH1,#0ECH
         SETB    TR1

         MOV   A,3bh             ;读取系统状态
         JZ    cvalue            ;0 状态 显示钟     Cvalue
         DEC   A
         JZ    rvalue            ;1 状态要显示跑表  Rvalue
         DEC   A
         JZ    dvalue             ;2 状态要显示跑表  Dvalue

cvalue:  mov r0,#30h             ;C 时 分 秒
         sjmp  DISP
rvalue:  MOV R0,#34H             ;R 分 秒 毫秒
         sjmp  DISP
dvalue:  mov r0,#37h             ;D AC 时 分
         sjmp  DISP
         mov  r0,#30h
DISP:    mov  r4,#03h             ;循环次数
         mov  r5,#20h             ;置位信息
         clr  a
	 mov  a,#0fh
	 mov  dptr, #0ff20h
	 movx @dptr, a
LOOP:    MOV     DPTR,#TAB       ;显示高位
         MOV     A,@R0
         SWAP    A
         ANL     A,#0FH          
         MOVC    A,@A+DPTR
	 mov     dptr, #ZXK
	 movx    @dptr, a
	 mov     a,R5
  	 mov     dptr, #ZWK
	 movx    @dptr, a
         RR      A
         MOV     R5,A
         LCALL   DELAY
         MOV     DPTR,#TAB          ;显示低位        
         MOV     A,@R0
         ANL     A,#0FH          
         ADD     A,#10H
         MOVC    A,@A+DPTR
	 mov     dptr, #ZXK
	 movx    @dptr, a
	 mov     a,R5
	 mov     dptr, #ZWK
	 movx    @dptr, a
         RR      A
         MOV     R5,A
         LCALL   DELAY
         INC     R0
         DJNZ    R4,LOOP 
         POP     PSW             ;恢复现场
         POP     ACC
         POP     DPL
         POP     DPH
         POP     5           
         POP     4
         POP     0   
         RETI                    ;中断返回           

DELAY:                          ;延时子程序
        PUSH    0               ;保存现场
        PUSH    1
        MOV     0,#08H
DELAY1: MOV     1,#35H
        DJNZ    1,$
        DJNZ    0,DELAY1
        POP     1               ;恢复现场
        POP     0
        RET
KEY:
        PUSH     8               ;保存现场
        mov      p1,#0FFh
        MOV      A,P1
        CPL      A
        ANL      A,#07H          ;取低三位
        JNZ      IN              ;有键按下
        jmp       pp
IN:     MOV      A, #05H         ;延时20ms,消抖
LCA:    ;LCALL    DELAY
        DEC      A
        JNZ      LCA
        MOV      A,P1            ;读取键盘的值
        CPL      A
        ANL      A,#07H
        MOV      3CH,A           ;键盘值送key 接口
LOOSEN: MOV      A,P1
        CPL      A
        ANL      A,#07H
        JNZ      LOOSEN          ;有键按下返回LOOSEN 等待松按
pp:     POP      8                ;恢复现场
        RET
        
tab:    DB      0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;'0,1,2,3,4,5,6,7'
        DB      080H,098H,088H,083H,0C6H,0A1H,086H,08EH ;'8,9,A,B,C,D,E,F'
        DB      040H,079H,024H,030H,019H,012H,002H,078H ;'0.,1.,2.,3.,4.,5.,6.,7.'
        DB      000H,010H,008H,003H,047H,021H,006H,00eH ;'8.,9.,A.,B.,C.,D.,E.,F.'
        END

⌨️ 快捷键说明

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