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

📄 clock-mine.asm

📁 电子钟的单片机实现,这里配合时钟芯片令时间更加准确,LCD界面更加人性化
💻 ASM
📖 第 1 页 / 共 5 页
字号:
     CLR E                   ;E=0 ;执行显示命令
     LCALL DELAY_LCD         ;判断液晶模块是否忙?
     SETB E                  ;E=1 ;显示完成,程序停车

     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,#00100000B       ;写入空值
     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 ;显示完成,程序停车

     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,#00100000B       ;写入空值
     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 ;显示完成,程序停车

     RET


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

        MOV DPTR,#NUM_TAB
        MOV A,SEC1
        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 DPTR,#NUM_TAB
        MOV A,SEC0
        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,#0C3H            ;写入显示起始地址(第2行第4个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

        MOV DPTR,#NUM_TAB
        MOV A,MIN1
        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 DPTR,#NUM_TAB
        MOV A,MIN0
        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,#0C0H            ;写入显示起始地址(第2行第1个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

        MOV DPTR,#NUM_TAB
        MOV A,HOU1
        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 DPTR,#NUM_TAB
        MOV A,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,#8BH             ;写入显示起始地址(第1行第12个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

        MOV A,WEK
        CJNE A,#0,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 CONTINUE
WEK1:
        CJNE A,#1,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 CONTINUE
WEK2:
        CJNE A,#2,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 CONTINUE
WEK3:
        CJNE A,#3,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 CONTINUE
WEK4:
        CJNE A,#4,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 CONTINUE
WEK5:
        CJNE A,#5,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 CONTINUE
WEK6:
        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 ;显示完成,程序停车
CONTINUE:
        MOV P0,#88H             ;写入显示起始地址(第1行第9个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

        MOV DPTR,#NUM_TAB
        MOV A,DAY1
        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 DPTR,#NUM_TAB
        MOV A,DAY0
        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,#85H             ;写入显示起始地址(第1行第6个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

        MOV DPTR,#NUM_TAB
        MOV A,MON1
        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 DPTR,#NUM_TAB
        MOV A,MON0
        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,#82H             ;写入显示起始地址(第1行第3个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

        MOV DPTR,#NUM_TAB
        MOV A,YER1
        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 DPTR,#NUM_TAB
        MOV A,YER0
        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 ;显示完成,程序停车
RET

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

        MOV DPTR,#NUM_TAB
        MOV A,C_MIN1
        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 DPTR,#NUM_TAB
        MOV A,C_MIN0
        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,#0C0H            ;写入显示起始地址(第2行第1个位置)
        LCALL ENABLE_LCD        ;调用写入命令子程序

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

⌨️ 快捷键说明

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