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

📄 sz617.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  ;显示标识
  KEY1FLAG  BIT  P3.2
  KEY2FLAG  BIT  P3.3

  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;初始时显示"时,分"
                MOV  KEY1FLAG,#01H
                MOV  KEY2FLAG,#02H

                CLR  LS164_AB
	        CLR  LS164_CLK

                MOV  TMOD,#01H ; 方式1

                MOV  TH0,#0H  ;初值
                MOV  TL0,#0H
                MOV  MSCNT,#15
                    SETB EA
                    SETB ET0
                    SETB TR0
                    MOV MINUTEBUF1,#1


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,#0H
	      MOV   TL0,#0H
          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

         ; 定时
		 AJMP   RET1

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

RET1:           LCALL    KEYINPUT

			 	PUSH ACC

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


RET2:
                 POP    ACC
RET3:
                 POP    ACC
                 POP    PSW

	             RETI



; **********************************************************************
; 键盘扫描子程序
;  KEY1FLAG -- KEY1 按下标识
;  KEY2FLAG -- KEY2 按下标识
;  K1 -- KEY1 相关子程序
;  K2 -- KEY2 相关子程序
; **********************************************************************
KEYINPUT:

 	   JB KEY1FLAG,IFKEY1UP
	   JB KEY2FLAG,JMPIFKEY2UP

K1:   JB KEY1,K2
      LCALL DELAY10US
      JB KEY1,K2
      LCALL DELAY10US
; 蜂鸣器停止
	    JB BEEP,K1S
	    SETB BEEP
	    JMP KRET1

K1S:
       MOV A,DISPFLAG

       CJNE  A,#1,CLRSECONDBUF
	   AJMP  KEYRET
CLRSECONDBUF:
	   CJNE  A,#2,DISPFLAGADD
       MOV SECONDBUF,#0
	   AJMP KRET1

DISPFLAGADD:
      ADD A,#3
      MOV DISPFLAG,A
	  SETB KEY1FLAG
	  CJNE A,#15H,KRET1
          MOV DISPFLAG,#0
          AJMP KRET1 
IFKEY1UP:  ; KEY1 是否松开
          JNB KEY1,KRET1
	  LCALL DELAY10US
          JNB KEY1,KRET1
	  LCALL DELAY10US
          CLR KEY1FLAG

K2:
     JB KEY2,KRET1
     LCALL DELAY10US
     JB KEY2,KRET1
     LCALL DELAY10US
     MOV A,DISPFLAG
	 AJMP K2S

KRET1:
      LJMP KEYRET
JMPIFKEY2UP:
      LJMP IFKEY2UP

K2S: CJNE A,#0,DISP1
         ADD A,#1
	 MOV DISPFLAG,A
	 SETB KEY2FLAG
	 AJMP KEYRET
;显示日期
DISP1: CJNE A,#1,DISP2
	   ADD A,#1
	   MOV DISPFLAG,A
	   SETB KEY2FLAG
	   AJMP KEYRET
;显示秒
DISP2: CJNE A,#2,MONADD1
           MOV A,#0
	   MOV DISPFLAG,A
	   SETB KEY2FLAG 
	   AJMP 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
		 AJMP KEYRET
IFKEY2UP:	; KEY2 是否松开
         JNB  KEY2,KEYRET
		 LCALL DELAY10US
	     JNB  KEY2,KEYRET
		 LCALL DELAY10US
	 	 CLR  KEY2FLAG
KEYRET:
RET

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

; **********************************************************************
; 显示缓冲更新子程序
; **********************************************************************
UPDATEDISPBUF:    
                 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:;选通数码管2
                CLR   LED2
                SETB  LED1
                SETB  LED3
                SETB  LED4
                RET

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

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

GET_LED234:	;查表数码管234
	 	MOV    DPTR,#SAG_LED234
		MOV    A,@R0
	 	MOVC   A,@A+DPTR
        RET
GET_LED1: ;查表数码管1
	 	MOV    DPTR,#SAG_LED1
		MOV    A,@R0
	 	MOVC   A,@A+DPTR
        RET

; **********************************************************************
; 四位数码管显示子程序
; DISPFLAG -- 显示选择标识
; **********************************************************************
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





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

DJNZ R6,D54
DJNZ R7,D53
RET

DELAY10US: ;延时10纳秒
            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 + -