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

📄 mcuwatch.asm

📁 基于51单片机数字时钟
💻 ASM
字号:
;使用空间:41H~47H,50H~59H,60H~68H
;影响资源:A、R1~R6、ACC
;堆栈需求:4B


ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INTT0
ORG 0030H

MAIN:
MOV SP,#70H   ;指针初始化
MOV 20H,#00H  ;清20H(位寻址)  00H 闹铃默认时间开启位 02H跑表方式开启位
MOV 40H,#00H  ;跑表百分之一秒缓存
MOV 41H,#00H  ;....十............
MOV 42H,#0AH  ;跑表个位缓存
MOV 43H,#00H  ;跑表十位缓存
MOV 44H,#00H  ;
MOV 45H,#0AH
MOV 46H,#00H
MOV 47H,#00H
MOV 50H,#00H  ;秒个位缓存
MOV 51H,#00H  ;秒十位缓存
MOV 52H,#0AH  ;横杠
MOV 53H,#00H  ;分个位缓存
MOV 54H,#00H  ;分十位缓存
MOV 55H,#0AH  ;横杠
MOV 56H,#00H  ;时个位缓存
MOV 57H,#00H  ;时十位缓存
MOV 58H,#00H  ;时钟中断次数清零
MOV 59H,#00H  ;跑表中断次数清零
MOV 60H,#00H  ;秒个位缓存
MOV 61H,#00H  ;秒十位缓存
MOV 62H,#0AH  ;横杠
MOV 63H,#00H  ;分个位缓存
MOV 64H,#00H  ;分十位缓存
MOV 65H,#0AH  ;横杠
MOV 66H,#00H  ;时个位缓存
MOV 67H,#00H  ;时十位缓存
MOV 68H,#00H  ;闹铃初值

MOV TMOD,#01H  ;选定时器1
MOV TCON,#00H
MOV TL0,#00H
MOV TH0,#0DCH  ;10MS COUNT
SETB EA
SETB ET0   ;溢出中断
SETB TR0    ;开启定时器0

CYCLE:       ;主时钟循环
LCALL SHOW1    ;时钟显示函数
LCALL SCAN         ;扫描程序函数
LCALL JUDGE        ;主界面按键判断函数
AJMP CYCLE


   SHOW1: 
      MOV R1,#50H                  ;指向显示数据首址          R5 YONG  R1 YONG
      MOV R5,#01H                 ;扫描控制字初值
   PLAY1: MOV  DPTR,#8000H
         MOV A,R5
         MOVX @DPTR,A   
         MOV  A,@R1
         MOV  DPTR,#TAB
         MOVC A,@A+DPTR
         MOV  DPTR,#9000H
         MOVX @DPTR,A
   LOOP11: LCALL DL1MS
          INC R1
          MOV A,R5
          JB ACC.7,ENDOUT1          ;到达最高位
   LOOP21: RL A
          MOV R5,A
          MOV DPTR,#9000H
          MOV A,#00H
          MOVX @DPTR,A
          AJMP PLAY1
   ENDOUT1: MOV DPTR,#8000H
           MOV A,#00H
           MOVX @DPTR,A
	   MOV DPTR,#9000H
	   MOV A,#00H
           MOVX @DPTR,A
RET        
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H

DL1MS: MOV 4CH,#14H    ;延时一毫秒函数
  DL1: MOV 4DH,#32H
  DL2: DJNZ 4DH,DL2
       DJNZ 4CH,DL1
RET

SCAN:
    MOV DPTR,#8000H
    MOV A,#01H
    MOVX @DPTR,A
    MOVX A,@DPTR
    ANL A,#0FH
    MOV R4,A
    JNZ KEYIN
RET
    KEYIN: 
         CLR P1.6         ;开蜂鸣器
         LCALL DELAY5MS       ;延时五毫秒
    REKEYIN: 
         MOVX A,@DPTR   ;再次读按键 
         ANL A,#0FH
         XRL A,R4   ;与前一次按键值比较 
         JZ  REKEYIN   ;按键松开了吗? 
         SETB P1.6         ;关蜂鸣器
RET

DELAY5MS:
    MOV R2,#90   ;消抖延时程序     R2 YONG  R3 YONG
    DL5MS: 
         MOV R3,#50 
         DJNZ R3,$ 
         DJNZ R2,DL5MS 
RET

JUDGE:
    CJNE R4,#01H,JUDGE1               ;R4  YONG
    AJMP ALARM                      ;1键到闹钟设置
    JUDGE1:
    CJNE R4,#02H,JUDGE2              ;2键到跑表界面
    AJMP STOPWATCH
    JUDGE2:
    CJNE R4,#04H,JUDGE3
    AJMP TIMESETTING                 ;3键到时间设置
    JUDGE3:
    MOV R4,#00H
RET

ALARM:                        ;闹钟程序
    LCALL DELAY1S             ;延时一秒

  LOOP3:            ;闹铃循环
    LCALL SCAN       
    LCALL NEXT       ;按键判断
    LCALL SHOW2       ;闹铃时间显示
    AJMP LOOP3
    
    NEXT:           
    CJNE R4,#01H,NEXT1
    AJMP ADDH             ;按1键小时加1
    NEXT1:
    CJNE R4,#02H,NEXT2
    AJMP ADDMM               ;按2键分加1
    NEXT2:
    CJNE R4,#04H,NEXT3
    AJMP DECIDE               ;闹钟确定
    NEXT3:
    CJNE R4,#08H,NEXT4
    MOV 60H,#00H
    MOV 61H,#00H
    MOV 62H,#0AH
    MOV 63H,#00H
    MOV 64H,#00H
    MOV 65H,#0AH
    MOV 66H,#00H
    MOV 67H,#00H
    LJMP CYCLE            ;置零返回
    NEXT4:RET
    
    DELAY1S:               ;延时1秒函数
        LCALL DL1S1
	LCALL DL1S1
    RET
	DL1S1:MOV R6,#10H
	DL1S2:LCALL SHOW2
	      DJNZ R6,DL1S2
        RET
   
    SHOW2: MOV R1,#60H                  ;指向显示数据首址          R5 YONG  R1 YONG
           MOV R5,#01H                 ;扫描控制字初值
    PLAY2: MOV  DPTR,#8000H
           MOV A,R5
           MOVX @DPTR,A   
           MOV  A,@R1
           MOV  DPTR,#TAB
           MOVC A,@A+DPTR
           MOV  DPTR,#9000H
           MOVX @DPTR,A
    LOOP12: LCALL DL1MS
            INC R1
            MOV A,R5
            JB ACC.7,ENDOUT2
    LOOP22: RL A
            MOV R5,A
            MOV DPTR,#9000H
            MOV A,#00H
            MOVX @DPTR,A
            AJMP PLAY2
    ENDOUT2: MOV DPTR,#8000H
             MOV A,#00H
             MOVX @DPTR,A
	     MOV DPTR,#9000H
	     MOV A,#00H
             MOVX @DPTR,A
RET        	   
    
    ADDH:                          ;小时加1函数
	INC 66H
	MOV A,66H
        XRL A,#0AH
        JNZ RETURN
        MOV 66H,#00H
	INC 67H
    RETURN:MOV A,66H
           XRL A,#04H
           JNZ ZOUREN
 	   MOV A,67H
	   XRL A,#02H
	   JNZ ZOUREN
           MOV 66H,#00H
	   MOV 67H,#00H
    ZOUREN:
    RET

    ADDMM:                  ;分加1函数
          INC 63H
          MOV A,63H
          XRL A,#0AH
          JNZ RETURN1
          INC 64H
	  MOV A,64H
          XRL A,#06H
          JNZ CLRM0 
          MOV 64H,#00H
    CLRM0:MOV 63H,#00H
    RETURN1:RET
        
    DECIDE:SETB 00H         ;开启默认铃声响时标志位
    LJMP CYCLE2

   CYCLE2:

        LCALL SHOW1
        LCALL SCAN
	LCALL DISDING        ;按键判断
	AJMP CYCLE2
    
 

    DISDING:
    CJNE R4,#01H,DISDING1
    AJMP ALARMTIME            ;1键显示闹钟设置时间
    DISDING1:
    CJNE R4,#02H,DISDING2
    AJMP NOSOUND              ;关闹铃
    DISDING2:
    CJNE R4,#08H,DISDING3
    MOV 60H,#00H
    MOV 61H,#00H
    MOV 62H,#0AH
    MOV 63H,#00H
    MOV 64H,#00H
    MOV 65H,#0AH
    MOV 66H,#00H
    MOV 67H,#00H
    SETB 00H
    LJMP CYCLE
    DISDING3:RET
        
    ALARMTIME:LCALL SHOW2
              LCALL SCAN
	      CJNE R4,#01H,BEHAND
	      AJMP CYCLE2
	      BEHAND:
	      CJNE R4,#02H,ALARMTIME
	      AJMP NOSOUND
              NOSOUND:SETB 00H
                      LJMP CYCLE


STOPWATCH:                  ;跑表程序
    SETB 02H                ;开启跑表计数方式位
    LCALL SHOW2
    LCALL SCAN
    LCALL LOOKEY            ;按键判断
    AJMP STOPWATCH

    LOOKEY:
    CJNE R4,#01H,LOOKEY1
    AJMP SUSPEND             ;1键暂停
    LOOKEY1:
    CJNE R4,#02H,LOOKEY2
    AJMP STOP                ;2键停止
    LOOKEY2:
    CJNE R4,#04H,LOOKEY3      ;3键取消
    CLR 02H
    MOV 60H,#00H
    MOV 61H,#00H
    MOV 62H,#0AH
    MOV 63H,#00H
    MOV 64H,#00H
    MOV 65H,#0AH
    MOV 66H,#00H
    MOV 67H,#00H
    LJMP CYCLE
    LOOKEY3: RET

    SUSPEND:              ;暂停函数
    MOV 47H,67H
    MOV 46H,66H
    MOV 45H,65H
    MOV 44H,64H
    MOV 43H,63H
    MOV 42H,62H
    MOV 41H,61H
    MOV 40H,60H            ;寄存数值
    SUSPEND1:
    LCALL SHOW3
    LCALL SCAN
    LCALL SUSJUD             ;按键判断
    AJMP SUSPEND1

    SUSJUD:
    CJNE R4,#01,SUSJUD1        ;1键继续
    AJMP GOON
    SUSJUD1:
    CJNE R4,#02H,SUSJUD2        ;2键清零
    AJMP CLENUM
    SUSJUD2:
    CJNE R4,#04H,SUSJUD3         ;3键返回时钟
    CLR 02H
    MOV 60H,#00H
    MOV 61H,#00H
    MOV 62H,#0AH
    MOV 63H,#00H
    MOV 64H,#00H
    MOV 65H,#0AH
    MOV 66H,#00H
    MOV 67H,#00H
    LJMP CYCLE
    SUSJUD3:RET
    
    GOON:MOV 60H,40H
         MOV 61H,41H
         MOV 62H,42H
         MOV 63H,43H
         MOV 64H,44H
         MOV 65H,45H
         MOV 66H,46H
         MOV 67H,47H
	 AJMP STOPWATCH
  CLENUM:MOV 60H,#00H
         MOV 61H,#00H
         MOV 62H,#0AH
         MOV 63H,#00H
         MOV 64H,#00H
         MOV 65H,#0AH
         MOV 66H,#00H
         MOV 67H,#00H
	 AJMP STOPWATCH

  STOP:                 ;停止函数
    MOV 40H,60H
    MOV 41H,61H
    MOV 42H,62H
    MOV 43H,63H
    MOV 44H,64H
    MOV 45H,65H
    MOV 46H,66H
    MOV 47H,67H
    STOP1:
    LCALL SHOW3
    LCALL SCAN
    LCALL STOPJUD           ;按键判断
    AJMP STOP1

    STOPJUD:               
    CJNE R4,#01H,STOP2           ;1键复值
    AJMP STOP
    STOP2:
    CJNE R4,#02H,STOP3             ;2键恢复
    AJMP STOPWATCH
    STOP3:RET
 
    SHOW3: MOV R1,#40H                  ;指向显示数据首址          R5 YONG  R1 YONG
           MOV R5,#01H                 ;扫描控制字初值
    PLAY3: MOV  DPTR,#8000H
           MOV A,R5
           MOVX @DPTR,A   
           MOV  A,@R1
           MOV  DPTR,#TAB
           MOVC A,@A+DPTR
           MOV  DPTR,#9000H
           MOVX @DPTR,A
    LOOP13: LCALL DL1MS
            INC R1
            MOV A,R5
            JB ACC.7,ENDOUT3
    LOOP23: RL A
            MOV R5,A
            MOV DPTR,#9000H
            MOV A,#00H
            MOVX @DPTR,A
            AJMP PLAY3
    ENDOUT3: MOV DPTR,#8000H
             MOV A,#00H
             MOVX @DPTR,A
	     MOV DPTR,#9000H
	     MOV A,#00H
             MOVX @DPTR,A
RET        

TIMESETTING:                  ; 时间设置
    CLR ET0                   ;关定时器
    CLR TR0
    LCALL DELAY1S
  LOOP4:  
    LCALL SCAN
    LCALL UPTO                  ;按键判断
    LCALL SHOW2                
    AJMP LOOP4

    UPTO:
    CJNE R4,#01H,UPTO1
    AJMP ADDH
    UPTO1:
    CJNE R4,#02H,UPTO2
    AJMP ADDMM
    UPTO2:
    CJNE R4,#04H,UPTO3
    AJMP FIX
    UPTO3:
    CJNE R4,#08H,UPTO4
    SETB TR0            ;开启定时器
    SETB ET0
    LJMP CYCLE
    UPTO4:RET

    FIX:
    MOV 50H,60H
    MOV 51H,61H
    MOV 52H,62H
    MOV 53H,63H
    MOV 54H,64H
    MOV 55H,65H
    MOV 56H,66H
    MOV 57H,67H
    MOV 58H,#00H
    SETB TR0            ;开启定时器
    SETB ET0
    LJMP CYCLE


INTT0:                ;中断程序
   PUSH ACC
   PUSH PSW
   CLR ET0
   CLR TR0
   JB 00H,PANDUANSHI
   HUIQU:
   JB 02H,INCPAO        ;判断跑表计时方式位
   HUILAI:
   INC 58H                
   MOV A,58H 
   CJNE A,#100,BENUM        ;一秒计数
   MOV  58H,#00H 
   LCALL ADD11              
   
  BENUM: 
   MOV  TL0,#20H 
   MOV  TH0,#0DCH          ;中断补偿
   POP PSW
   POP ACC
   SETB ET0                ;开启计时器0
   SETB TR0
   RETI
   
PANDUANSHI:
   MOV A,53H
    XRL A,63H
    JNZ BACK
    MOV A,54H
    XRL A,64H
    JNZ BACK
    MOV A,56H
    XRL A,66H
    JNZ BACK
    MOV A,57H
    XRL A,67H
    JNZ BACK
    CLR P1.6
   AJMP HUIQU

    ADD11:                ;时钟加1程序
	INC 50H
	MOV A,50H
        XRL A,#0AH
        JNZ GOBACK1
        MOV 50H,#00H
	INC 51H
	MOV A,51H
        XRL A,#06H
        JNZ GOBACK1
        MOV 51H,#00H
	INC 53H
	MOV A,53H
        XRL A,#0AH
        JNZ GOBACK1
	MOV 53H,#00H
	INC 54H
        MOV A,54H
        XRL A,#06H
        JNZ GOBACK1
	MOV 54H,#00H
        INC 56H
        MOV A,56H
        XRL A,#0AH
        JNZ GOBACK1
	INC 57H
	MOV A,57H
	XRL A,#02H
        JNZ GOBACK
	XRL 56H,#04H
	JNZ GOBACK
	MOV 57H,#00H
     GOBACK:MOV 56H,#00H
     GOBACK1:     RET
        
    INCPAO: INC 59H   
            MOV A,59H 
            MOV  59H,#00H 
            LCALL ADD111
            LJMP  HUILAI
     ADD111:                  ; 跑表加1程序
	INC 60H
	MOV A,60H
        XRL A,#0AH
        JNZ GOBACK11
        MOV 60H,#00H
	INC 61H
	MOV A,61H
        XRL A,#0AH
        JNZ GOBACK11
        MOV 61H,#00H
	INC 63H
	MOV A,63H
        XRL A,#0AH
        JNZ GOBACK11
	MOV 63H,#00H
	INC 64H
        MOV A,64H
        XRL A,#06H
        JNZ GOBACK11
	MOV 64H,#00H
        INC 66H
        MOV A,66H
        XRL A,#0AH
        JNZ GOBACK11
	MOV 66H,#00H
	INC 67H
	MOV A,67H
	XRL A,#06H
        JNZ GOBACK11
        MOV 67H,#00H
     GOBACK11:     RET
END

⌨️ 快捷键说明

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