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

📄 alarm_clock3.asm

📁 用51系列单片机实现电子闹钟的功能
💻 ASM
字号:
LED7A_CTRL    EQU    P1.0
LED7B_CTRL    EQU    P1.1
LED7C_CTRL    EQU    P1.2
LED7D_CTRL    EQU    P1.3

LED7_STATUS   EQU    P0

LED7A_DATA    EQU    70H
LED7B_DATA    EQU    71H
LED7C_DATA    EQU    72H
LED7D_DATA    EQU    73H

LED7_NUM      EQU    74H

KEY_STATUS    EQU    P2
DATA_TEST     EQU    75H
KEY_DATA      EQU    76H
CHECK_TIME    EQU    77H

LED7_DOT      EQU    P0.7
TIME_DOT      EQU    6FH
DOT_STATUS    EQU    20H.0

TIME_SECOND   EQU    60H
TIME_MINUTE   EQU    61H
TIME_HOUR     EQU    62H

DS1302_CLK    EQU    P1.5
DS1302_IO     EQU    P1.6
DS1302_RST    EQU    P1.7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

              ORG     0000H
              SJMP    START

              ORG     000BH
              LJMP    LED7_SCAN

              ORG     0023H
              LJMP    SRE


START:        MOV     SP,#30H
              MOV     TMOD,#00100001B
              MOV     SCON,#01010000B
              MOV     PCON,#0
              MOV     TH1,#0E6H
              MOV     TL1,#0E6H
              MOV     7BH,#1
              MOV     7AH,#7
              MOV     7CH,#0
              MOV     7DH,#0
              MOV     7EH,#0FFH
              MOV     7FH,#04H
              MOV     63H,#1
              CLR     21H.0
              MOV     TH0,#0ECH
              MOV     TL0,#78H
              SETB    ET0
              SETB    TR0
              SETB    TR1
              SETB    ES
              SETB    EA

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN:


              MOV    LED7A_DATA,#0
              MOV    LED7B_DATA,#0
              MOV    LED7C_DATA,#0
              MOV    LED7D_DATA,#0

              LCALL   KEYCHECK


              MOV    A,LED7A_DATA
              ANL    A,#0FH
              SWAP   A
              MOV    55H,A
              MOV    A,LED7B_DATA
              ANL    A,#0FH
              ORL    A,55H
              MOV    TIME_HOUR,A

              MOV    A,LED7C_DATA
              ANL    A,#0FH
              SWAP   A
              MOV    55H,A
              MOV    A,LED7D_DATA
              ANL    A,#0FH
              ORL    A,55H
              MOV    TIME_MINUTE,A

              MOV	TIME_SECOND, #00H		       ;设置时间秒值
              CLR       EA
 	      CALL	DS1302_SET				;DS1302设置时间
              CLR	DOT_STATUS
              SETB      EA

S0:           MOV       A,63H
              CJNE      A,#0,S1
              MOV       A,7DH
              ANL       A,#0FH
              MOV       LED7B_DATA,A
              MOV       A,7DH
              SWAP      A
              ANL       A,#0FH
              MOV       LED7A_DATA,A

              MOV       A,7CH
              ANL       A,#0FH
              MOV       LED7D_DATA,A
              MOV       A,7CH
              SWAP      A
              ANL       A,#0FH
              MOV       LED7C_DATA,A
              LCALL     DELAY
              LCALL     DELAY
              LCALL     DELAY
              LCALL     DELAY
              LCALL     DELAY
              MOV       63H,#1



S1:
	       LCALL	DS1302_GET				;DS1302获取时间

S2:
	       MOV	 A, TIME_MINUTE			        ;将时间分显示在LED上
	       ANL	 A, #0FH
	       MOV	 LED7D_DATA,A
	       MOV	 A, TIME_MINUTE
	       SWAP	 A
	       ANL	 A,#0FH
      	       MOV	 LED7C_DATA,	A
               MOV	 A, TIME_HOUR		              	;将时间时显示在LED上
	       ANL	 A, #0FH
	       MOV	 LED7B_DATA,A
	       MOV	 A, TIME_HOUR
	       SWAP	 A
               ANL	 A,#0FH
               MOV	 LED7A_DATA,	A

               CALL	DELAY

               MOV     A, TIME_MINUTE
               CJNE    A,7CH,S0
               MOV     A,TIME_HOUR
               CJNE    A,7DH,S0

               MOV     7BH,#0
               SJMP    $





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYCHECK:     MOV    R7,#0

KEYCHECK0:    MOV    DATA_TEST,#0EFH
              MOV    CHECK_TIME,#4
              MOV    KEY_DATA,#10


KEYCHECK1:    MOV    KEY_STATUS,DATA_TEST
              MOV    A,DATA_TEST
              RL     A
              MOV    DATA_TEST,A
              MOV    A,KEY_STATUS
              ANL    A,#0FH
              CJNE   A,#0FH,KEYCHECK2                    ;有键按下则跳到KEYCHECK2
              SJMP   KEYCHECK3

KEYCHECK2:    MOV    A,KEY_DATA
              DEC    A
              MOV    DPTR,#KEY_TAB
              MOVC   A,@A+DPTR
              CJNE   A,KEY_STATUS,KEYCHECK4
              MOV    A,KEY_DATA
              DEC    A


KC0:          CJNE   R7,#0,KC1
              MOV    LED7A_DATA,A
              SJMP   KC4

KC1:          CJNE   R7,#1,KC2
              MOV    LED7B_DATA,A
              SJMP   KC4

KC2:          CJNE   R7,#2,KC3
              MOV    LED7C_DATA,A
              SJMP   KC4

KC3:          MOV    LED7D_DATA,A
              LJMP   CHECK_END

KC4:          INC    R7
              LCALL  DELAY
              LCALL  DELAY
              LJMP   KEYCHECK0

KEYCHECK3:    DJNZ   CHECK_TIME,KEYCHECK1
              MOV    CHECK_TIME,#4
              MOV    DATA_TEST,#0EFH
              SJMP   KEYCHECK1

KEYCHECK4:    DJNZ   KEY_DATA,KEYCHECK2
              MOV    KEY_DATA,#10
              SJMP   KEYCHECK0

CHECK_END:    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LED7_SCAN:    PUSH   ACC
              PUSH   PSW
              PUSH   DPL
              PUSH   DPH
              MOV    DPTR,#LED7_TAB

              MOV    A,LED7_NUM

              CJNE   A,#0,SCAN1
              SETB   LED7D_CTRL
              MOV    A,LED7A_DATA
              MOVC   A,@A+DPTR
              CLR    LED7A_CTRL
              SJMP   SCAN4

SCAN1:        CJNE   A,#1,SCAN2
              SETB   LED7A_CTRL
              MOV    A,LED7B_DATA
              MOVC   A,@A+DPTR
              CLR    LED7B_CTRL
              SJMP   SCAN4

SCAN2:        CJNE   A,#2,SCAN3
              SETB   LED7B_CTRL
              MOV    A,LED7C_DATA
              MOVC   A,@A+DPTR
              CLR    LED7C_CTRL
              SJMP   SCAN4

SCAN3:
              SETB   LED7C_CTRL
              MOV    A,LED7D_DATA
              MOVC   A,@A+DPTR
              CLR    LED7D_CTRL
              MOV    LED7_NUM,#0
              SJMP   SCAN5

SCAN4:        INC    LED7_NUM
SCAN5:        MOV    LED7_STATUS,A

SCAN6:        DJNZ   TIME_DOT,SCAN7
              MOV    TIME_DOT,#100
              CPL    DOT_STATUS

SCAN7:        JB     DOT_STATUS,SCAN8
              CLR    LED7_DOT
              SJMP   ENDSC

SCAN8:        SETB   LED7_DOT

ENDSC:        MOV    A,7BH

              CJNE   A,#0,END0


              DEC    7EH
              MOV    A,7EH
              CJNE   A,#0,NEXT
              MOV    7EH,#0FFH
              DEC    7FH
              MOV    A,7FH
              CJNE   A,#0,NEXT
              MOV    7FH,#04H

              DEC    7AH
              MOV    A,7AH
              CJNE   A,#0,NEXT


SCAN9:        MOV    7AH,#20


NEXT:         MOV    A,7AH
              MOV    DPTR,#TONETAB
              MOVC   A,@A+DPTR
              MOV    79H,A
              MOV    A,79H
              MOV    DPTR,#HTAB
              MOVC   A,@A+DPTR
              MOV    TH0,A
              MOV    A,79H
              MOV    DPTR,#LTAB
              MOVC   A,@A+DPTR
              MOV    TL0,A





              CPL    P3.7
              SJMP   END1



END0:         MOV    TH0,#0ECH
              MOV    TL0,#78H



END1:         POP    DPH
              POP    DPL
              POP    PSW
              POP    ACC
              RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SRE:          CLR    EA
              MOV    A,SBUF
              CLR    RI
              MOV    63H,#0

              JB     21H.0,SRE1

              MOV    7DH,A

              SJMP   END_SRE

SRE1:         MOV    7CH,A


END_SRE:      CPL    21H.0
              MOV    64H,04FH
              DJNZ   64H,$
              SETB   EA
              RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DS1302_SET:
          CLR    DS1302_RST
          CLR    DS1302_CLK
          SETB   DS1302_RST
          MOV    B, #8EH
          LCALL  DS1302_WRITE
          MOV    B, #00H
          LCALL  DS1302_WRITE
          SETB   DS1302_CLK
          CLR    DS1302_RST

          MOV    R0, #TIME_SECOND
          MOV    R7, #7
          MOV    R1, #80H
DS1302_SET_1:
		  CLR    DS1302_RST
          CLR    DS1302_CLK
          SETB   DS1302_RST
          MOV    B, R1
          LCALL  DS1302_WRITE
          MOV    A, @R0
          MOV    B, A
          LCALL  DS1302_WRITE
          INC    R0
          INC    R1
          INC    R1
          SETB   DS1302_CLK
          CLR    DS1302_RST
          DJNZ   R7, DS1302_SET_1

          CLR    DS1302_RST
          CLR    DS1302_CLK
          SETB   DS1302_RST
          MOV    B, #8EH
          LCALL  DS1302_WRITE
          MOV    B, #80H
          LCALL  DS1302_WRITE
          SETB   DS1302_CLK
          CLR    DS1302_RST
          RET

;*****************************************************************************************
;*****************************************************************************************
DS1302_GET:
          MOV    R0, #TIME_SECOND
          MOV    R7, #7
          MOV    R1, #81H
DS1302_GET_1:
		  CLR    DS1302_RST
          CLR    DS1302_CLK
          SETB   DS1302_RST
          MOV    B, R1
          LCALL  DS1302_WRITE
          LCALL  DS1302_READ
          MOV    @R0, A
          INC    R0
          INC    R1
          INC    R1
          SETB   DS1302_CLK
          CLR    DS1302_RST
          DJNZ   R7, DS1302_GET_1
          RET

;***************************************************************************************
;*****************************************************************************************
DS1302_WRITE:
          MOV    R6, #8
DS1302_WRITE_1:
		  MOV    A, B
          RRC    A
          MOV    DS1302_IO, C
          SETB   DS1302_CLK
          CLR    DS1302_CLK
		  MOV    B, A
          DJNZ   R6, DS1302_WRITE_1
          RET

;*****************************************************************************************
DS1302_READ:
          MOV    R6, #8
DS1302_READ_1:
		  MOV    C, DS1302_IO
          RRC    A
          SETB   DS1302_CLK
          CLR    DS1302_CLK
          DJNZ   R6, DS1302_READ_1
          RET


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:        MOV     R3,#0FFH
DEL:          MOV     R4,#0FFH
              DJNZ    R4,$
              DJNZ    R3,DEL
              RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEY_TAB:
	      DB      07EH, 0E7H, 0D7H, 0B7H, 077H, 0EBH, 0DBH, 0BBH, 07BH, 0EDH
	      DB      0DDH, 0BDH, 07DH, 0EEH, 0DEH, 0BEH



LED7_TAB:
	      DB      0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
	      DB      088H,083H,0C6H,0A1H,086H,08EH,0FFH

HTAB:         DB     0FDH,0FEH,0FEH,0FEH,0FEH,0FEH,0FEH,0FFH,0FFH,0FFH
              DB     0FFH,0FFH,0FFH,0FFH,0FDH,0FEH

LTAB:         DB     082H,022H,056H,085H,09AH,0C1H,0E4H,003H,011H,02BH
              DB     042H,04DH,061H,072H,0C8H,006H


TONETAB:      DB    1,2,3,4,3,2,1,2,3,5,6,5,4,1,2,3,6,5,2,3,6,5,4,1,2,3
              DB    2,1,4,5,6,7,2,3,1,2,2,3,5,1,2,2,3,1,1,2
              END

⌨️ 快捷键说明

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