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

📄 sz613.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

  BEEP   BIT  p1.0

  MSCNT  EQU  30H   ;中断次数

  SECONDBUF EQU 31H
  MINUTEBUF EQU 32H
  HOURBUF   EQU 33H
  MONTHBUF  EQU 34H
  DAYBUF    EQU 35H

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


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

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

                CLR  LS164_AB
	            CLR  LS164_CLK

                MOV  TMOD,#01H ; 方式1

	 	        MOV  TH0,#0H  ;初值
           	    MOV  TL0,#0H

        	    MOV  MSCNT,#15H
	 	        SETB EA
	 	        SETB ET0
                SETB TR0

LOOP:            
                 LCALL    DISP
                 AJMP     LOOP
TIMER0:
	 	 PUSH  PSW
	 	 PUSH  ACC
             	 SETB  PSW.3
		 MOV   TH0,#0H
		 MOV   TL0,#0H
		 MOV   A,MSCNT
		 DEC   A
		 MOV   MSCNT,A
		 JNZ   RET1
         ; 微调
          CLR   EA
          MOV   TH0,#0BH
	      MOV   TL0,#0DCH
          SETB  EA
          MOV   MSCNT,#14

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

         ;  MOV     A,      DAYBUF
         ;  CJNE    A,      #31,HADD1
         ;  MOV     DAYBUF, #0

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

RET1:            LCALL    KEYINPUT
                 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
      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,#0FH,KEYRET
      MOV DISPFLAG,#0
      CLR F0
K1RET:
      JMP KEYRET




K2:
     JB KEY2,KEYRET
     LCALL DELAY10US
     JB KEY2,KEYRET
     LCALL DELAY10US
     MOV A,DISPFLAG

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,K2X
		 MOV  R5,MINUTEBUF
		 CJNE R5,#59,MINADD
		 MOV  MINUTEBUF,#0
		 AJMP KEYRET
MINADD:
         INC  MINUTEBUF
         AJMP KEYRET

K2X:  ; 显示日期和秒
       ADD A,#1
	   CJNE A,#3,KEYRET
	   MOV DISPFLAG,#0
       MOV DISPFLAG,A
       
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,KFC

                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
;显示 "分"
KFC:            CJNE  @R1,#0CH,KFRET

                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
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
                 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 + -