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

📄 clock-mine.asm

📁 电子钟的单片机实现,这里配合时钟芯片令时间更加准确,LCD界面更加人性化
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        SETB E                  ;E=1 ;显示完成,程序停车

        MOV DPTR,#NUM_TAB
        MOV A,C_HOU0
        MOVC A,@A+DPTR
        MOV P0,A                ;写入时个位
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车

        MOV P0,#0C9H            ;写入显示起始地址(第2行第10个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

        MOV A,C_WEK
        CJNE A,#0,C_WEK1
        MOV P0,#01010011B       ;写入字母S
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01010101B       ;写入字母U
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01001110B       ;写入字母N
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        LJMP OUT
C_WEK1:
        CJNE A,#1,C_WEK2
        MOV P0,#01001101B        ;写入字母M
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01001111B        ;写入字母O
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01001110B        ;写入字母N
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        LJMP OUT
C_WEK2:
        CJNE A,#2,C_WEK3
        MOV P0,#01010100B        ;写入字母T
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01010101B        ;写入字母U
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01000101B        ;写入字母E
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        LJMP OUT
C_WEK3:
        CJNE A,#3,C_WEK4
        MOV P0,#01010111B        ;写入字母W
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01000101B        ;写入字母E
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01000100B        ;写入字母D
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        LJMP OUT
C_WEK4:
        CJNE A,#4,C_WEK5
        MOV P0,#01010100B        ;写入字母T
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01001000B        ;写入字母H
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01010101B        ;写入字母U
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        LJMP OUT
C_WEK5:
        CJNE A,#5,C_WEK6
        MOV P0,#01000110B       ;写入字母F
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01010010B        ;写入字母R
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01001001B        ;写入字母I
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        LJMP OUT
C_WEK6:
        CJNE A,#6,C_WEK7
        MOV P0,#01010011B       ;写入字母S
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01000001B        ;写入字母A
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        MOV P0,#01010100B        ;写入字母T
        SETB RS                 ;RS=1
        CLR RW                  ;RW=0 ;准备写入数据
        CLR E                   ;E=0 ;执行显示命令
        LCALL DELAY_LCD         ;判断液晶模块是否忙?
        SETB E                  ;E=1 ;显示完成,程序停车
        LJMP OUT
C_WEK7:
       MOV P0,#01000001B       ;写入字母A
       SETB RS                 ;RS=1
       CLR RW                  ;RW=0 ;准备写入数据
       CLR E                   ;E=0 ;执行显示命令
       LCALL DELAY_LCD         ;判断液晶模块是否忙?
       SETB E                  ;E=1 ;显示完成,程序停车
       MOV P0,#01001100B       ;写入字母L
       SETB RS                 ;RS=1
       CLR RW                  ;RW=0 ;准备写入数据
       CLR E                   ;E=0 ;执行显示命令
       LCALL DELAY_LCD         ;判断液晶模块是否忙?
       SETB E                  ;E=1 ;显示完成,程序停车
       MOV P0,#01001100B       ;写入字母L
       SETB RS                 ;RS=1
       CLR RW                  ;RW=0 ;准备写入数据
       CLR E                   ;E=0 ;执行显示命令
       LCALL DELAY_LCD         ;判断液晶模块是否忙?
       SETB E                  ;E=1 ;显示完成,程序停车
OUT:
        MOV P0,#8CH            ;写入显示起始地址(第1行第12个位置)
        LCALL ENABLE_LCD       ;调用写入命令子程序

        JNB ALARM,DIS_OFF      ;闹钟标志有效显示ON,否则显示OFF
        MOV P0,#01001110B      ;写入N
        SETB RS                ;RS=1
        CLR RW                 ;RW=0 ;准备写入数据
        CLR E                  ;E=0 ;执行显示命令
        LCALL DELAY_LCD        ;判断液晶模块是否忙?
        SETB E                 ;E=1 ;显示完成,程序停车
        MOV P0,#00100000B      ;写入空值
        SETB RS                ;RS=1
        CLR RW                 ;RW=0 ;准备写入数据
        CLR E                  ;E=0 ;执行显示命令
        LCALL DELAY_LCD        ;判断液晶模块是否忙?
        SETB E                 ;E=1 ;显示完成,程序停车
        LJMP OUT2
        DIS_OFF:
        MOV P0,#01000110B      ;写入F
        SETB RS                ;RS=1
        CLR RW                 ;RW=0 ;准备写入数据
        CLR E                  ;E=0 ;执行显示命令
        LCALL DELAY_LCD        ;判断液晶模块是否忙?
        SETB E                 ;E=1 ;显示完成,程序停车
        MOV P0,#01000110B      ;写入F
        SETB RS                ;RS=1
        CLR RW                 ;RW=0 ;准备写入数据
        CLR E                  ;E=0 ;执行显示命令
        LCALL DELAY_LCD        ;判断液晶模块是否忙?
        SETB E
OUT2:
        RET

;日历初始化
LOAD8563:
     MOV R0, #XmtDat    ;发送缓冲区首地址送R0
     MOV @R0, #00H      ;秒初值
     INC R0
     MOV @R0, #30H      ;分初值
     INC R0
     MOV @R0, #12H      ;时初值
     INC R0
     MOV @R0, #09H      ;日初值
     INC R0
     MOV @R0, #05H      ;星期初值
     INC R0
     MOV @R0, #05H      ;世纪及月初值(21世纪)
     INC R0
     MOV @R0, #08H      ;年初值
     MOV ByteCnt, #07H	;传送7字节
     MOV SlvAdr, #0A2H	;PCF8563日历时钟器件地址为A2H
     MOV SubAdr, #02H	;从日历时钟的02H单元开始
     LCALL SendData	;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
                        ;PCF8563日历芯片内日历时间单元
     RET

;闹钟初始化(闹钟无效)
LOADCLOCK:
     MOV R0,#XmtDat     ;发送缓冲区首地址送R0
     MOV @R0,#80H       ;闹钟分初值
     INC R0
     MOV @R0,#80H       ;闹钟时初值
     INC R0
     MOV @R0,#80H       ;闹钟时初值
     INC R0
     MOV @R0,#80H       ;闹钟星期初值
     INC R0
     MOV ByteCnt,#04H	;传送4字节
     MOV SlvAdr,#0A2H	;PCF8563日历时钟器件地址为A2H
     MOV SubAdr,#09H	;从日历时钟的09H单元开始
     LCALL SendData	;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
                        ;PCF8563日历芯片内日历时间单元
     MOV R0,#XmtDat     ;发送缓冲区首地址送R0
     MOV @R0,#00000000B ;初始化状态控制寄存器2
     MOV ByteCnt,#01H	;传送1字节
     MOV SlvAdr,#0A2H	;PCF8563日历时钟器件地址为A2H
     MOV SubAdr,#01H	;从日历时钟的09H单元开始
     LCALL SendData	;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
                        ;PCF8563日历芯片内日历时间单元
     RET

;压缩式BCD转非压缩式BCD,且把接收缓冲区的内容放入显示缓冲区
LCDBUF:
       MOV A,RcvDat
       ANL A,#7FH        ;屏蔽数据无关位
       ANL A,#0FH
       MOV SEC0,A        ;秒低四位送显示缓冲区
       MOV A,Rcvdat
       ANL A,#7FH        ;屏蔽数据无关位
       SWAP A
       ANL A,#0FH
       MOV SEC1,A        ;秒高四位送显示缓冲区
       MOV A,RcvDat+1
       ANL A,#7FH        ;屏蔽数据无关位
       ANL A,#0FH
       MOV MIN0,A        ;分低四位送显示缓冲区
       MOV A,Rcvdat+1
       ANL A,#7FH        ;屏蔽数据无关位
       SWAP A
       ANL A,#0FH
       MOV MIN1,A        ;分高四位送显示缓冲区
       MOV A,RcvDat+2
       ANL A,#3FH        ;屏蔽数据无关位
       ANL A,#0FH
       MOV HOU0,A        ;时低四位送显示缓冲区
       MOV A,Rcvdat+2
       ANL A,#3FH        ;屏蔽数据无关位
       SWAP A
       ANL A,#0FH
       MOV HOU1,A        ;时高四位送显示缓冲区
       MOV A,RcvDat+3
       ANL A,#3FH        ;屏蔽数据无关位
       ANL A,#0FH
       MOV DAY0,A        ;日低四位送显示缓冲区
       MOV A,Rcvdat+3
       ANL A,#3FH        ;屏蔽数据无关位
       SWAP A
       ANL A,#0FH
       MOV DAY1,A        ;日高四位送显示缓冲区
       MOV A,RcvDat+4
       ANL A,#07H        ;屏蔽数据无关位
       MOV WEK,A         ;星期送显示缓冲区
       MOV A,RcvDat+5
       ANL A,#1FH        ;屏蔽数据无关位
       ANL A,#0FH
       MOV MON0,A        ;月低四位送显示缓冲区
       MOV A,Rcvdat+5
       ANL A,#1FH        ;屏蔽数据无关位
       SWAP A
       ANL A,#0FH
       MOV MON1,A        ;月高四位送显示缓冲区
       MOV A,RcvDat+6
       ANL A,#0FH
       MOV YER0,A        ;年低四位送显示缓冲区
       MOV A,Rcvdat+6
       SWAP A
       ANL A,#0FH
       MOV YER1,A        ;年高四位送显示缓冲区
       RET

;把时钟的压缩式BCD转非压缩式BCD,且把接收缓冲区的内容放入闹钟显示缓冲区
C_LCDBUF:
       MOV A,RcvDat
       ANL A,#7FH        ;屏蔽数据无关位
       ANL A,#0FH
       MOV C_MIN0,A      ;分低四位送显示缓冲区
       MOV A,Rcvdat
       ANL A,#7FH        ;屏蔽数据无关位
       SWAP A
       ANL A,#0FH
       MOV C_MIN1,A      ;分高四位送显示缓冲区
       MOV A,RcvDat+1
       ANL A,#3FH        ;屏蔽数据无关位
       ANL A,#0FH
       MOV C_HOU0,A      ;时低四位送显示缓冲区
       MOV A,Rcvdat+1
       ANL A,#3FH        ;屏蔽数据无关位
       SWAP A
       ANL A,#0FH
       MOV C_HOU1,A      ;时高四位送显示缓冲区
       MOV A,RcvDat+3
       ANL A,#07H        ;屏蔽数据无关位
       MOV C_WEK,A        ;星期送显示缓冲区
       RET

;LCD写入控制命令的子程序
ENABLE_LCD:
        CLR RS
        CLR RW
        CLR E                   ;执行指令
        LCALL DELAY_LCD
        SETB E
        RET

;判断液晶显示器是否忙的子程序
DELAY_LCD:
        MOV P0,#0FFH
        CLR RS
        SETB RW
        CLR E                   ;执行指令
        NOP
        SETB E
        JB P0.7,DELAY_LCD       ;如果P0.7为高电平表示忙就循环等待
        RET



;------------------------串行EEPROM、日历时钟读写子程序------------
; 发送数据子程序
;名称:SendData
;描述:发送ByteCnt 个字

⌨️ 快捷键说明

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