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

📄 s.txt

📁 另类电子钟源程序
💻 TXT
字号:
        T_RST Bit P3.4 ;实时时钟复位线引脚
        T_CLK Bit P3.2 ;实时时钟时钟线引脚
        T_IO Bit P3.3 ;实时时钟数据线引脚
        SECOND EQU 30H
        MINUTE EQU 31H
        HOUR EQU 32H
        DAY EQU 33H
        MONTH EQU 34H
        WEEK EQU 35H
        YEARL EQU 36H        


        ORG 0000H
        LJMP start
        ORG  001bH
        AJMP INTT1         ; 定时中断T1入口
start:  LCALL KEY        
        AJMP START
      
        
;*******流水灯*******
KEY0:    MOV R2,#3
RESB:    MOV R1,#8
         MOV A,#0FEH
LOOPSB:  MOV P2,A        
	 RL A
	 LCALL DELAY
	 DJNZ R1,LOOPSB
         DJNZ R2,RESB
 	 mov p2,#0ffh

KS:     MOV P1,#0F0H
        MOV A,P1
        MOV B,A
        ACALL DELAY
        MOV A,P1
        CJNE A,B,DS0
        CJNE A,#0D0H,DS0
        AJMP KEYS1
DS0:    AJMP KS


KEYS1:  MOV R7,#5
REB:    MOV R1,#8
        MOV A,#0FEH
LOOPB:  MOV P2,A        
	RR A
	LCALL DELAY
	DJNZ R1,LOOPB
	DJNZ R7,REB 
        MOV R7,#5
REC:    MOV R1,#9
        MOV A,#0FEH
LOOPC:  MOV P2,A        
	RL  A
	LCALL DELAY
	DJNZ R1,LOOPC
	DJNZ R7,REC
	mov p2,#0ffh


ks1:    MOV P1,#0F0H
        MOV A,P1
        MOV B,A
        ACALL DELAY
        MOV A,P1
        CJNE A,B,DS10
        CJNE A,#0B0H,DS10
        AJMP KEYS13
DS10:   AJMP KS1


KEYS13:   MOV R2,#3
RESB3:    MOV R1,#10
          MOV A,#0FAH
LOOPSB3:  MOV P2,A        
	  RR A
	 LCALL DELAY
	 DJNZ R1,LOOPSB3
         DJNZ R2,RESB3
	 mov p2,#0ffh
KS2:     MOV P1,#0F0H
         MOV A,P1
         MOV B,A
         ACALL DELAY
         MOV A,P1
         CJNE A,B,DS2O
         CJNE A,#070H,DS2O
         AJMP KEYS23
DS2O:    AJMP KS2



KEYS23:      mov r0,#5
retu:        mov   p2, #07eh ; 双亮点向中间移
            lcall delay
	    lcall delay
            mov   p2, #0bdh
            lcall delay
	    lcall delay
            mov   p2, #0dbh
            lcall delay
	    lcall delay
            mov   p2, #0e7h
            lcall delay
	    lcall delay
            djnz r0,retu
            mov p2,#0ffh
            RET


;*******音乐*******
KEY1:  MOV SP,#60H
       MOV TMOD,#10H
      SETB ET1
      SETB EA
      SETB TR1
START0:clr p3.4
      MOV 30H,#00H
NEXTT:MOV A,30H
     MOV DPTR,#TABLE
     MOVC A,@A+DPTR
     MOV R2,A
     JZ ENDD
     ANL A,#0FH
     MOV R5,A
     MOV A,R2
     SWAP A
     ANL A,#0FH
     JNZ SING
     CLR TR1
     AJMP DD1
SING:DEC A
     MOV 22H,A
     RL A
     MOV DPTR,#TABLE1
     MOVC A,@A+DPTR
     MOV TH1,A
     MOV 21H,A
     MOV A,22H
     RL A
     INC A
     MOVC A,@A+DPTR
     MOV TL1,A
     MOV 20H,A
     SETB TR1
DD1: LCALL DELAYY
     INC 30H
     AJMP NEXTT
ENDD:CLR TR1
     AJMP START0
INTT1:PUSH PSW
      PUSH ACC
      MOV TL1,20H
      MOV TH1,21H
      cpl p3.4
      POP ACC
      POP PSW
      RETI




;*******日期**************************************************************        
KEY2:  ;CLR     T_RST
        ;CLR     T_CLK
        MOV SP,#60H                 ;修改堆栈
        MOV SECOND,#00H             ;初始时间设为12:00:00
        MOV MINUTE,#00H
        MOV HOUR,#12H
        MOV DAY,#31h                ;初始日期设为08年1月1日第一周
        MOV MONTH,#05
        MOV WEEK,#20H
        MOV YEARL,#08H
        LCALL SETDS1302
        LCALL GET1302
        LCALL DISPLAY
	
MAIN:   MOV R3,#50
        MOV TMOD,#01H
        MOV TH0,#70H                ;置定时器初值(定时40ms)
        MOV TL0,#00H
        SETB TR0                     ;启动定时器0
LP1:    JBC TF0,LP2                  ;查询计数溢出
        SJMP LP1                     ;未到40 ms继续计数
LP2:    MOV TH0,#0B8H                ;重新置定时器初值
        MOV TL0,#00H
        LCALL DISPLAY                ;显示
        DJNZ R3,LP1                  ;未到1 S继续循环
        LCALL GET1302                ;每过1s从DS1302读取一次时间
        mov     r3,#50
        LCALL JP
        SJMP lp1
        

;数码显示子程序
DISPLAY:
        MOV     DPTR,#DIG_CODE

;显示日
        MOV     P1,#11111000b
        MOV     A,DAY
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY

        MOV     P1,#11110100b
        MOV     A,DAY
        SWAP    A
        ANL     A,#07H
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY
;*******************************************
;显示月
        MOV     P1,#11110010b
        MOV     A,MONTH
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY
        MOV     P1,#11110001b
        MOV     A,MONTH
        SWAP    A
        ANL     A,#03H
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY
        RET       
;---------------------------------------------------------------------------------------------------


JP:    MOV P1,#0F0H
       MOV A,P1
       MOV B,A
       ACALL DELAY
       MOV A,P1
       CJNE A,B,JP0
       CJNE A,#0E0H,JP0
       AJMP JP1
JP0:   AJMP JP
JP1:   MOV SP,#60H                 ;修改堆栈
       MOV SECOND,#00H             ;初始时间设为12:00:00
        MOV MINUTE,#00H
        MOV HOUR,#12H
        MOV DAY,#31h                ;初始日期设为08年1月1日第一周
        MOV MONTH,#05
        MOV WEEK,#20H
        MOV YEARL,#08H
        LCALL SETDS1302
        LCALL GET1302
        LCALL DISPLAY2
	
MAIN2:  MOV R3,#50
        MOV TMOD,#01H
        MOV TH0,#70H                ;置定时器初值(定时40ms)
        MOV TL0,#00H
        SETB TR0                     ;启动定时器0
LP12:   JBC TF0,LP22                  ;查询计数溢出
        SJMP LP12                      ;未到40 ms继续计数
LP22:   MOV TH0,#0B8H                ;重新置定时器初值
        MOV TL0,#00H
        LCALL DISPLAY2                 ;显示
        DJNZ R3,LP12                  ;未到1 S继续循环
        LCALL GET1302                 ;每过1s从DS1302读取一次时间
        mov r3,#50
        
        SJMP lp12
DISPLAY2:
        MOV     DPTR,#DIG_CODE
;*******************************************
;显示分
        MOV     P1,#11111000b
        MOV     A,MINUTE
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY

        MOV     P1,#11110100b
        MOV     A,MINUTE
        SWAP    A
        ANL     A,#07H
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY
;*******************************************
;显示小时
        MOV     P1,#11110010b
        MOV     A,HOUR
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY
        MOV     P1,#11110001b
        MOV     A,HOUR
        SWAP    A
        ANL     A,#03H
        MOVC    A,@A+DPTR
        MOV     P0,A        
        LCALL   DIS_DELAY
        RET
;*******************************************



;******* 年份*******
KEY3:   ;CLR     T_RST
        ;CLR     T_CLK
        MOV SP,#60H                 ;修改堆栈
        MOV SECOND,#00H             ;初始时间设为12:00:00
        MOV MINUTE,#00H
        MOV HOUR,#12H
        MOV DAY,#31h                ;初始日期设为08年1月1日第一周
        MOV MONTH,#05
        MOV WEEK,#20H
        MOV YEARL,#08H
        LCALL SETDS1302
        LCALL GET1302
        LCALL DISPLAY3
MAIN3:  MOV R3,#50
        MOV TMOD,#01H
        MOV TH0,#70H                ;置定时器初值(定时40ms)
        MOV TL0,#00H
        SETB TR0                     ;启动定时器0
LP13:   JBC TF0,LP23                  ;查询计数溢出
        SJMP LP13                      ;未到40 ms继续计数
LP23:   MOV TH0,#0B8H                ;重新置定时器初值
        MOV TL0,#00H
        LCALL DISPLAY3                 ;显示
        DJNZ R3,LP13                   ;未到1 S继续循环
        LCALL GET1302                 ;每过1s从DS1302读取一次时间
        mov   r3,#50
        SJMP LP13

DISPLAY3:
        MOV     DPTR,#DIG_CODE
;*******************************************
;显示年
        MOV     P1,#11111000b
        MOV     A,YEARL
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY

        MOV     P1,#11110100b
        MOV     A,YEARL
        SWAP    A
        ANL     A,#07H
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY


        MOV     P1,#11110010b
        MOV     A,WEEK
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P0,A
        LCALL   DIS_DELAY
        MOV     P1,#11110001b
        MOV     A,WEEK
        SWAP    A
        ANL     A,#03H
        MOVC    A,@A+DPTR
        MOV     P0,A        
        LCALL   DIS_DELAY
        RET
;*******************************************


;---------------------------------------------------------------------------------------------------
;显示延时5ms子程序
DIS_DELAY:
        PUSH PSW
        MOV R7,#10
D1:     MOV R6,#248
D2:     DJNZ R6,$
        DJNZ R7,D1
        POP PSW
        RET
;---------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------
;设置DS1302初始时间,并启动计时
SETDS1302:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH          ;写控制命令字
        LCALL   INPUTBYTE       
        MOV     B,#00H          ;写保护关闭
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST

        MOV     R0,#SECOND      ;内存中的时间首地址
        MOV     R1,#80H         ;DS1302中的时间首地址
        MOV     R7,#7           ;字节数

SETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1            ;写命令字
        LCALL   INPUTBYTE
        MOV     A,@R0           ;设置时间
        MOV     B,A
        LCALL   INPUTBYTE       
        INC     R0
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,SETLOOP

        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH
        LCALL   INPUTBYTE
        MOV     B,#80H          ;开写保护
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        RET

;---------------------------------------------------------------------------------------------------
;从DS1302读取时间
GET1302:
        MOV     R0,#SECOND     
        MOV     R1,#81H        ;DS1302中读时间的首地址
        MOV     R7,#7
GETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1
        LCALL   INPUTBYTE       ;写命令字
        LCALL   OUTPUTBYTE      ;读时间
        MOV     @R0,A           ;将从DS1302中读取的时间从内存中保存
        INC     R0              ;修改地址指针
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,GETLOOP
        RET

;---------------------------------------------------------------------------------------------------
;向DS1302写一个字节
INPUTBYTE:
        MOV     R4,#8
INPUTLOOP:
        MOV     A,B
        RRC     A
        MOV     B,A
        MOV     T_IO,C
        SETB    T_CLK
        NOP
        ;NOP
        ;NOP
        CLR     T_CLK
        DJNZ    R4,INPUTLOOP
        RET
;---------------------------------------------------------------------------------------------------
;从DS1302读一个字节
OUTPUTBYTE:
        clr     a
        clr     c
        MOV     R4,#8
OUTPUTLOOP:
        
        NOP
        ;NOP
        MOV     C,T_IO
        RRC     A
        SETB    T_CLK
        NOP
        ;NOP
        ;NOP
        CLR     T_CLK
        DJNZ    R4,OUTPUTLOOP
        RET

KEY:   MOV P1,#0F0H
       MOV A,P1
       MOV B,A
       ACALL DELAY
       MOV A,P1
       CJNE A,B,D0
       CJNE A,#0E0H,K1
       AJMP KEY0
K1:    CJNE A,#0D0H,K2
       AJMP KEY1
K2:    CJNE A,#0B0H,k3
       AJMP KEY2
K3:    CJNE A,#070H,D0
       AJMP KEY3
D0:    RET


	
DELAY:  MOV R6,#200
   DL1:  MOV R5,#250
        DJNZ R5,$
	DJNZ R6,DL1
	RET

DEL1:  MOV R7,#02
    DL2:MOV R6,#0FFH
       DJNZ R6,$
       DJNZ R7,DL2
       RET
DELAYY:MOV R7,#02
DELAY0:MOV R4,#187
DELAY1:MOV R3,#248
       DJNZ R3,$
       DJNZ R4,DELAY1
       DJNZ R7,DELAY0
       DJNZ R5,DELAYY
       RET
;---------------------------------------------------------------------------------------------------
;字符显示码表
DIG_CODE:
        DB 14H,0d7H,4cH,45H,87H,25H,24H,57H,04H,05H

TABLE:
        DB 02H,82H
	DB 16H,32H,54H,02H,52H
	DB 0A6H,32H,54H,02H,52H
	DB 64H,74H,0B6H,64H
	DB 52H,5CH,32H,22H
	DB 16H,12H,14H,32H,22H
	DB 16H,12H,14H,22H,32H
	DB 26H,12H,94H,22H,32H
	DB 2CH
	DB 32H,52H
	DB 36H,22H,14H,54H
	DB 0ACH,92H,0A2H
	DB 96H,0A2H,96H,82H
	DB 3CH,54H
	DB 36H,22H,14H,54H
	DB 0ACH,92H,0A2H
	DB 16H,12H,14H,22H,32H
	DB 2CH,02H,82H
	DB 16H,32H,56H,12H
	DB 0A6H,32H,56H,52H
	DB 66H,72H,0B6H,62H
	DB 62H,52H,58H,32H,22H
	DB 16H,12H,14H,32H,22H
	DB 16H,12H,14H,22H,32H
	DB 26H,92H,0A4H,12H,22H
	DB 1CH
	DB 00

TABLE1:
      DW 64580,64684,64777,64820
	DW 64898,64968,65030,64260
	DW 64400,64524,65058,63835,64021

        END

⌨️ 快捷键说明

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