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

📄 sz616a.asm

📁 一个本人编写的时钟程序
💻 ASM
字号:

  LED1        BIT  p1.3  ;4位数码管选通引脚
  LED2        BIT  p1.4
  LED3        BIT  p1.6
  LED4        BIT  p1.7
  LED2DZ      BIT  P1.5  ;小数点

  LS164_AB    BIT  p3.0 ;74LS164数据线
  LS164_CLK   BIT  p3.1 ;74LS164时钟线

  KEY1      BIT  p3.5 ;按键1
  KEY2      BIT  p3.7 ;按键2
  DISPFLAG   EQU  40H  ;显示标识

  DISPBUF   EQU  20H
  DISPBUF1  EQU  50H ;定时缓冲

  BEEP   BIT  p1.0

  MSCNT  EQU  30H   ;中断次数

  SECONDBUF  EQU 31H
  MINUTEBUF  EQU 32H
  HOURBUF    EQU 33H
  MONTHBUF   EQU 34H
  DAYBUF     EQU 35H
  MINUTEBUF1 EQU 36H
  HOURBUF1   EQU 37H

		        ORG  0000h
		        JMP  START
	            ORG  000Bh
                JMP  TIMER0
                ORG  0100H


START:
                MOV  SP,#5FH
                CLR  LED2DZ
CLRDISPBUF: ; 清显示缓冲区
                MOV  R2,#0FH
                MOV  R0,#DISPBUF+1
CLRDISPBUFLOOP:
                MOV  @R0,#0H
                INC  R0
                DJNZ R2,CLRDISPBUFLOOP

                MOV  DISPFLAG,#0H;初始时显示"时,分"

                CLR  LS164_AB
	            CLR  LS164_CLK

                MOV  TMOD,#01H ; 方式1

	 	        MOV  TH0,#1FH  ;初值
           	    MOV  TL0,#00H
        	    MOV  MSCNT,#16
	 	        SETB EA
	 	        SETB ET0
                SETB TR0



LOOP:           ; LCALL    KEYINPUT
                 LCALL    DISP
                 AJMP     LOOP
TIMER0:
	 	 PUSH  PSW
	 	 PUSH  ACC
         SETB  PSW.3 ;  去掉后闪烁明显
		 MOV   TH0,#1FH
		 MOV   TL0,#00H
		 MOV   A,MSCNT
		 DEC   A
		 MOV   MSCNT,A
		 JNZ   RET1
         ; 微调
          CLR   EA
          MOV   TH0,#1FH
	      MOV   TL0,#00H
          SETB  EA
          MOV   MSCNT,#15

         ; 秒走
         MOV     A,      SECONDBUF
         CJNE    A,      #1,SADD1
         MOV     SECONDBUF, #0
         ; 分走
         MOV     A,      MINUTEBUF
         CJNE    A,      #1,MADD1
         MOV     MINUTEBUF, #0
         ; 小时走
         MOV     A,      HOURBUF
         CJNE    A,      #3,HADD1
         MOV     HOURBUF, #0

         ; 定时
		 AJMP   RET1

SADD1:    ; 秒加1
                INC   SECONDBUF
                AJMP   RET1
MADD1:    ; 分加1
                INC   MINUTEBUF
                AJMP  RET1
HADD1:    ; 小时加1
                INC   HOURBUF

RET1:           LCALL    KEYINPUT

			;	PUSH ACC
				MOV 55H,HOURBUF
				XRL 55H,#3
				MOV R1,55H
				CJNE R1,#0,RET2

				MOV 56H,MINUTEBUF
				XRL 56H,#1
				MOV R2,56H
				CJNE R2,#0,RET2

		    ;   MOV A,HOURBUF
			;	XRL A,HOURBUF1
			;	JNZ RET2
			;	MOV A,MINUTEBUF
			;	XRL A,MINUTEBUF1
			;	JNZ RET2
				CLR  BEEP


RET2:
               ;  POP    ACC
                 POP    ACC
                 POP    PSW

	             RETI

; 74LS164芯片工作原理程序
Send74LS164:
	      	MOV	R1,#8
Send2LS164_Loop:
	    	RLC  A
	        MOV  LS164_AB,C
	        SETB LS164_CLK
	        CLR  LS164_CLK
	        DJNZ r1,Send2LS164_Loop
            RET

KEYINPUT:


 	   JB F0,K1RET

K1:   JB KEY1,K2
      LCALL DELAY10MS
      JB KEY1,K2
      LCALL DELAY10MS

	    JB BEEP,K1S
	    SETB BEEP
	    JMP K1RET
K1S:
       MOV A,DISPFLAG

       CJNE  A,#1,CLRSECONDBUF
	   AJMP  KEYRET

	   CJNE  A,#2,DISPFLAGADD
CLRSECONDBUF:
       MOV SECONDBUF,#0

DISPFLAGADD:
      ADD A,#3
      MOV DISPFLAG,A
      SETB F0
WAIT: JNB KEY1,WAIT
      CJNE A,#15H,K1RET
      MOV DISPFLAG,#0
      CLR F0

K2:
     JB KEY2,K1RET
     LCALL DELAY10US
     JB KEY2,K1RET
     LCALL DELAY10US
     MOV A,DISPFLAG
	 AJMP K2X

K1RET:
      JMP KEYRET


K2X: CJNE A,#0,DISP1
     ADD A,#1
	 MOV DISPFLAG,A
	 JMP KEYRET

DISP1: CJNE A,#1,DISP2
	   ADD A,#1
	   MOV DISPFLAG,A
	   JMP KEYRET

DISP2: CJNE A,#2,MONADD1
       MOV A,#0
	   MOV DISPFLAG,A
	   JMP KEYRET


MONADD1: ; 月加1
          CJNE A,#3,DAYADD1
          MOV R5, MONTHBUF
          CJNE R5,#12,MONADD
          MOV MONTHBUF,#1
		  AJMP KEYRET
MONADD:
         INC  MONTHBUF
		 AJMP KEYRET

DAYADD1: ; 日加1
         CJNE A,#6,HOURADD1
		 MOV  R5,DAYBUF
		 CJNE R5,#31,DAYADD
		 MOV  DAYBUF,#1
		 AJMP KEYRET
DAYADD:
         INC  DAYBUF
         AJMP KEYRET

HOURADD1: ; 小时加1
         CJNE A,#9,MINADD1
		 MOV  R5,HOURBUF
		 CJNE R5,#23,HOURADD
		 MOV  HOURBUF,#0
		 AJMP KEYRET
HOURADD:
         INC  HOURBUF
         AJMP KEYRET

MINADD1:  ; 分钟加1
         CJNE A,#0CH,HOUR1ADD1
		 MOV  R5,MINUTEBUF
		 CJNE R5,#59,MINADD
		 MOV  MINUTEBUF,#0
		 AJMP KEYRET
MINADD:
         INC  MINUTEBUF
         AJMP KEYRET

HOUR1ADD1: ; 定时小时加1
                 CJNE A,#0FH,MIN1ADD1
		 MOV  R5,HOURBUF1
		 CJNE R5,#23,HOUR1ADD
		 MOV  HOURBUF1,#0
		 AJMP KEYRET
HOUR1ADD:
         INC  HOURBUF1
         LJMP KEYRET

MIN1ADD1:  ; 定时分钟加1
         CJNE A,#12H,KEYRET
		 MOV  R5,MINUTEBUF1
		 CJNE R5,#59,MIN1ADD
		 MOV  MINUTEBUF1,#0
		 AJMP KEYRET
MIN1ADD:
         INC  MINUTEBUF1
KEYRET:

RET

;显示程序
DISP:
                MOV    R1,#DISPFLAG
                LCALL  UPDATEDISPBUF
;初始显示 "时间"
KF0:            CJNE   @R1,#0,KF1

	 	MOV    R0,#DISPBUF+1
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED4
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+2
                LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED3
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+3
                LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED2
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+4
                LCALL GET_LED1
                LCALL Send74LS164
                LCALL SELECT_LED1
                LCALL DELAY10MS
                AJMP  KFRET
;显示 "日期"
KF1:            CJNE  @R1,#1,KF2

                MOV    R0,#DISPBUF+5
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED4
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+6
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED3
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+7
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED2
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+8
	 	LCALL GET_LED1
                LCALL Send74LS164
                LCALL SELECT_LED1
                LCALL DELAY10MS
                AJMP  KFRET
;显示 "秒"
KF2:            CJNE  @R1,#2,KF3

                MOV    R0,#DISPBUF+9
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED4
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+0AH
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED3
                LCALL DELAY10MS
                AJMP  KFRET
;显示 "月"
KF3:            CJNE  @R1,#3,KF6

                MOV    R0,#DISPBUF+7
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED2
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+8
	 	LCALL GET_LED1
                LCALL Send74LS164
                LCALL SELECT_LED1
                LCALL DELAY10MS
                AJMP  KFRET
;显示 "日"
KF6:            CJNE  @R1,#6,KF9

                MOV    R0,#DISPBUF+5
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED4
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+6
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED3
                LCALL DELAY10MS
                AJMP  KFRET
;显示 "小时"
KF9:            CJNE  @R1,#9,KF0C

                MOV    R0,#DISPBUF+3
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED2
                LCALL DELAY10MS

                MOV    R0,#DISPBUF+4
	 	LCALL GET_LED1
                LCALL Send74LS164
                LCALL SELECT_LED1
                LCALL DELAY10MS
                AJMP  KFRET
;显示 "分"
KF0C:            CJNE  @R1,#0CH,KF0F

                MOV    R0,#DISPBUF+1
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED4
                LCALL DELAY10MS


                MOV    R0,#DISPBUF+2
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED3
                LCALL DELAY10MS
 KF0F:            CJNE  @R1,#0FH,KF12

                MOV    R0,#DISPBUF1+1
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED2
                LCALL DELAY10MS

                MOV    R0,#DISPBUF1+2
	 	LCALL GET_LED1
                LCALL Send74LS164
                LCALL SELECT_LED1
                LCALL DELAY10MS

KF12:            CJNE  @R1,#12H,KFRET

                MOV    R0,#DISPBUF1+3
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED4
                LCALL DELAY10MS


                MOV    R0,#DISPBUF1+4
	 	LCALL GET_LED234
                LCALL Send74LS164
                LCALL SELECT_LED3
                LCALL DELAY10MS

KFRET:
                RET

UPDATEDISPBUF:     ;1秒钟重新为 "秒,分,小时" 重新填显示缓冲
                 MOV     A,              SECONDBUF
                 MOV     B,              #10
                 DIV     AB
                 MOV     DISPBUF+9,        B
                 MOV     DISPBUF+0AH,      A

                 MOV     A,              MINUTEBUF
                 MOV     B,              #10
                 DIV     AB
                 MOV     DISPBUF+1,        B
                 MOV     DISPBUF+2,        A

                 MOV     A,              HOURBUF
                 MOV     B,              #10
                 DIV     AB
                 MOV     DISPBUF+3,         B
                 MOV     DISPBUF+4,         A

                 MOV     A,              MONTHBUF
                 MOV     B,              #10
                 DIV     AB
                 MOV     DISPBUF+7,         B
                 MOV     DISPBUF+8,         A

			     MOV     A,              DAYBUF
                 MOV     B,              #10
                 DIV     AB
                 MOV     DISPBUF+5,         B
                 MOV     DISPBUF+6,         A

		  ; 更新定时缓冲
                   MOV     A,              HOURBUF1
                  MOV     B,              #10
                  DIV     AB
                  MOV     DISPBUF1+1,         B
                  MOV     DISPBUF1+2,         A

                  MOV     A,              MINUTEBUF1
                  MOV     B,              #10
                  DIV     AB
                  MOV     DISPBUF1+3,         B
                  MOV     DISPBUF1+4,         A

                   RET



SELECT_LED1:;选通数码管1
                CLR   LED1
                SETB  LED2
                SETB  LED3
                SETB  LED4
                RET

SELECT_LED2:;选通数码管1
                CLR   LED2
                SETB  LED1
                SETB  LED3
                SETB  LED4
                RET

SELECT_LED3:;选通数码管1
                CLR   LED3
                SETB  LED1
                SETB  LED2
                SETB  LED4
                RET

SELECT_LED4:;选通数码管1
                CLR   LED4
                SETB  LED1
                SETB  LED2
                SETB  LED3
                RET

GET_LED234:
	 	MOV    DPTR,#SAG_LED234
		MOV    A,@R0
	 	MOVC   A,@A+DPTR
                RET
GET_LED1:
	 	MOV    DPTR,#SAG_LED1
		MOV    A,@R0
	 	MOVC   A,@A+DPTR
                RET



DELAY10MS:  ;延时10毫秒
MOV R7,#10
D53: MOV R6,#200
D54:
NOP
NOP
NOP
NOP
NOP

DJNZ R6,D54
DJNZ R7,D53
RET

DELAY10US:
            MOV       R7,#5
            DJNZ      R7,$
            RET

SAG_LED1: ;LED1段码
DB  01010000b,11111001b,00110100b,10110000b,10011001b,10010010b,00010010b,11111000b,00010000b,10010000b,0ffh
SAG_LED234: ;LED234段码
DB  11000000b,11111001b,10100100b,10110000b,10011001b,10010010b,10000010b,11111000b,10000000b,10010000b,0ffh
  ;  0         1         2         3         4         5         6         7         8         9
TABLE_extra:
DB  11111110B,11111101B,11111011B,11110111B,11101111B,11011111B,10111111B,0h,0ffh,0ffh,0ffh
               END

⌨️ 快捷键说明

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