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

📄 clock-mine.asm

📁 电子钟的单片机实现,这里配合时钟芯片令时间更加准确,LCD界面更加人性化
💻 ASM
📖 第 1 页 / 共 5 页
字号:
     LJMP KEY4OVER


KEY44:
      JB DOWN,KEY5            ;日减1程序
      LCALL DELAY250MS
      JB DOWN,KEY5
      MOV A,DAY0
      CJNE A,#0,D4
      MOV A,DAY1
      CJNE A,#0,D0
      MOV DAY0,#1
      MOV DAY1,#3
      LJMP KEY44OVER
D0:
      MOV DAY0,#9
      DEC DAY1
      LJMP KEY44OVER
D4:
      DEC DAY0
KEY44OVER:
      JB DOWN,KEY5
      LJMP KEY44OVER

;**************月调整程序*******************
KEY5:
     MOV A,COUNT             ;月加1
     CJNE A,#6,KEY6
     JB UP,KEY55
     LCALL DELAY250MS
     JB UP,KEY55
     INC MON0
     MOV A,MON1
     CJNE A,#1,MUNTCOUNT
     MOV A,MON0
     CJNE A,#3,KEY5OVER
     MOV MON0,#1
     MOV MON1,#00H
     LJMP KEY5OVER
MUNTCOUNT:
     MOV A,MON0
     CJNE A,#10,KEY5OVER
     MOV MON0,#00H
     INC MON1
KEY5OVER:
     JB UP,KEY55
     LJMP KEY5OVER


KEY55:
     JB DOWN,KEY6;月减1
     LCALL DELAY250MS
     JB DOWN, KEY6
     MOV A,MON0
     CJNE A,#0,M2
     MOV A,MON1
     CJNE A,#0,M3
     MOV MON0,#2
     MOV MON1,#1
     LJMP KEY55OVER
M3:
     MOV MON0,#9
     DEC MON1
     LJMP KEY55OVER
M2:
     DEC MON0
KEY55OVER:
     JB DOWN,KEY6
     LJMP KEY55OVER


;****************年调整程序*******************
KEY6:
     MOV A,COUNT;年加1
     CJNE A,#7,KEY7
     JB UP,KEY66
     LCALL DELAY250MS
     JB UP,KEY66
     INC YER0
     MOV A,YER0
     CJNE A,#10,KEY6OVER
     MOV YER0,#00H
     INC YER1
     MOV A,YER1
     CJNE A,#10,KEY66OVER
     MOV YER1,#00H
KEY6OVER:
     JB UP,KEY66
     LJMP KEY6OVER


KEY66:
     JB DOWN,KEY7;年减1
     LCALL DELAY250MS
     JB DOWN, KEY7
     MOV A,YER0
     CJNE A,#0,Y3
     MOV YER0,#9
     MOV A,YER1
     CJNE A,#0,Y4
     MOV YER1,#9
     LJMP KEY66OVER

Y4:
     DEC YER1
     LJMP KEY66OVER
Y3:
     DEC YER0
KEY66OVER:
     JB DOWN,KEY7
     LJMP KEY66OVER

;**************************确认键*********************

KEY7:
      JB CONF,KEY77
      LCALL DELAY250MS
      JB CONF,KEY77
      LCALL PCF8563BUF            ;把拆分的时间日期数字合并为压缩式BCD,并写入PCF8563
      MOV ByteCnt,#07H	          ;接收7字节
      MOV SlvAdr,#0A2H	          ;PCF8563日历时钟器件地址为A2H
      MOV SubAdr,#02H 	          ;从日历时钟的02H单元开始
      LCALL ReceData              ;调用读EEPROM多字节读入过程,将信息读入接收缓冲区
      LCALL LCDBUF                ;把时间缓冲区的内容按十位与个位分开存放
      SETB ENTER
KEY77:
      LCALL DISPLAY
      LJMP KEY

;*******************闹钟时间日期星期设置程序****************
C_KEY:
    JNB ENTER,C_CONTINUE    ;按下确认键就保存退出设置
    CLR ENTER
    LJMP CON4
C_CONTINUE:
    JB SW,C_KEY1            ;调整程序
    LCALL DELAY250MS
    JB SW,C_KEY1
C_IN:
    INC COUNT
    MOV A,COUNT
    CJNE A,#5,C_KEYOVER
    MOV COUNT,#00H
    LJMP CON4               ;一个循环后退出设置程序
C_KEYOVER:
    JB SW,C_KEYOVER1
    LJMP C_KEYOVER
C_KEYOVER1:
    JB UP,C_KEY1
    LJMP C_KEYOVER1
;*************闹钟分钟调整程序*********************
C_KEY1:
     MOV A,COUNT              ;分钟加1程序
     CJNE A,#1,C_KEY2
     JB UP,C_KEY11
     LCALL DELAY250MS
     JB UP,C_KEY11
     INC C_MIN0
     MOV A,C_MIN0
     CJNE A,#10,C_KEY1OVER
     MOV C_MIN0,#00H
     INC C_MIN1
     MOV A,C_MIN1
     CJNE A,#6,C_KEY1OVER
     MOV C_MIN1,#00H
     LJMP C_KEY1OVER
C_KEY1OVER:
     JB UP,C_KEY11
     LJMP C_KEY1OVER

C_KEY11:
      JB DOWN,C_KEY2              ;分钟减1程序
      LCALL DELAY250MS
      JB DOWN,C_KEY2
      MOV A,C_MIN0
      CJNE A,#0,C_AAA
      MOV C_MIN0,#9
      MOV A,C_MIN1
      CJNE A,#0,C_AAAA
      MOV C_MIN1,#5
      LJMP C_KEY11OVER
C_AAAA:
      DEC C_MIN1
      LJMP C_KEY11OVER
C_AAA:
      DEC C_MIN0
C_KEY11OVER:
      JB DOWN,C_KEY2
      LJMP C_KEY11OVER

;***********闹钟时调整程序******************
C_KEY2:
     MOV A,COUNT              ;时加1程序
     CJNE A,#2,C_KEY3
     JB UP,C_KEY22
     LCALL DELAY250MS
     JB UP,C_KEY22
     INC C_HOU0
     MOV A,C_HOU1
     CJNE A,#2,C_HOURS
     MOV A,C_HOU0
     CJNE A,#4,C_KEY2OVER
     MOV C_HOU0,#00H
     MOV C_HOU1,#00H
     LJMP C_KEY2OVER
C_HOURS:
     MOV A,C_HOU0
     CJNE A,#10,C_KEY2OVER
     MOV C_HOU0,#00H
     INC C_HOU1
C_KEY2OVER:
     JB UP,C_KEY22
     LJMP C_KEY2OVER


C_KEY22:
      JB DOWN,C_KEY3             ;时钟减1程序
      LCALL DELAY250MS
      JB DOWN,C_KEY3
      MOV A,C_HOU0
      CJNE A,#0,C_H4
      MOV A,C_HOU1
      CJNE A,#0,C_H5
      MOV C_HOU0,#3
      MOV C_HOU1,#2
      LJMP C_KEY22OVER
C_H5:
      MOV C_HOU0,#9
      DEC C_HOU1
      LJMP C_KEY22OVER
C_H4:
      DEC C_HOU0
C_KEY22OVER:
      JB DOWN,C_KEY3
      LJMP C_KEY22OVER

;************闹钟星期调整程序****************
C_KEY3:
     MOV A,COUNT                 ;星期加1程序
     CJNE A,#3,C_KEY4
     JB UP,C_KEY33
     LCALL DELAY250MS
     JB UP,C_KEY33
     INC C_WEK
     MOV A,C_WEK
     CJNE A,#8,C_KEY3OVER
     MOV C_WEK,#00H
C_KEY3OVER:
     JB UP,C_KEY33
     LJMP C_KEY3OVER

C_KEY33:
     JB DOWN,C_KEY4              ;星期减1程序
     LCALL DELAY250MS
     JB DOWN,C_KEY4
     MOV A,C_WEK
     CJNE A,#0,C_A2
     MOV C_WEK,#7
     LJMP C_KEY33OVER
C_A2:
     DEC C_WEK
C_KEY33OVER:
     JB DOWN,C_KEY4
     LJMP C_KEY33OVER

;************闹钟开关调整程序****************
C_KEY4:
     MOV A,COUNT
     CJNE A,#4,C_KEY5
     JB UP,C_KEY44
     LCALL DELAY250MS
     JB UP,C_KEY44
     CPL ALARM
C_KEY4OVER:
     JB UP,C_KEY44
     LJMP C_KEY4OVER

C_KEY44:
     JB DOWN,C_KEY5
     LCALL DELAY250MS
     JB DOWN,C_KEY5
     CPL ALARM
C_KEY44OVER:
     JB DOWN,C_KEY5
     LJMP C_KEY44OVER
;**************************确认键*********************
C_KEY5:
      JB CONF,C_KEY55
      LCALL DELAY250MS
      JB CONF,C_KEY55
      LCALL CLOCKBUF              ;把拆分的闹钟时间数字合并为压缩式BCD,并写入PCF8563
      MOV ByteCnt,#04H	          ;接收4字节
      MOV SlvAdr,#0A2H	          ;PCF8563日历时钟器件地址为A2H
      MOV SubAdr,#09H 	          ;从日历时钟的09H单元开始
      LCALL ReceData              ;调用读EEPROM多字节读入过程,将信息读入接收缓冲区
      JNB ALARM,C_OUT
      MOV XmtDat,#00000010B       ;允许闹钟中断
      MOV ByteCnt, #01H	          ;传送1字节
      MOV SlvAdr, #0A2H	          ;PCF8563日历时钟器件地址为A2H
      MOV SubAdr, #01H	          ;从日历时钟的01H单元开始
      LCALL SendData	          ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
                                  ;PCF8563日历芯片内日历时间单元
      MOV A,C_WEK
      CJNE A,#7,C_OUT
      MOV XmtDat,#10000111B       ;禁止星期闹钟
      MOV ByteCnt, #01H	          ;传送1字节
      MOV SlvAdr, #0A2H	          ;PCF8563日历时钟器件地址为A2H
      MOV SubAdr, #0CH	          ;从日历时钟的01H单元开始
      LCALL SendData	          ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
                                  ;PCF8563日历芯片内日历时间单元
C_OUT:
      LCALL C_LCDBUF              ;把闹钟时间缓冲区的内容按十位与个位分开存放
      SETB ENTER
C_KEY55:
      LCALL C_DISPLAY
      LJMP C_KEY


;非压缩式BCD转压缩式BCD
PCF8563BUF:
           MOV A,SEC1
           SWAP A
           ORL A,SEC0
           MOV XmtDat,A

           MOV A,MIN1
           SWAP A
           ORL A,MIN0
           MOV XmtDat+1,A

           MOV A,HOU1
           SWAP A
           ORL A,HOU0
           MOV XmtDat+2,A

           MOV A,DAY1
           SWAP A
           ORL A,DAY0
           MOV XmtDat+3,A

           MOV XmtDat+4,WEK

           MOV A,MON1
           SWAP A
           ORL A,MON0
           MOV XmtDat+5,A

           MOV A,YER1
           SWAP A
           ORL A,YER0
           MOV XmtDat+6,A

           MOV ByteCnt, #07H	  ;传送7字节
           MOV SlvAdr, #0A2H	  ;PCF8563日历时钟器件地址为A2H
           MOV SubAdr, #02H	  ;从日历时钟的02H单元开始
           LCALL SendData	  ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
                                  ;PCF8563日历芯片内日历时间单元
RET

CLOCKBUF:
         MOV A,C_MIN1
         SWAP A
         ORL A,C_MIN0
         MOV XmtDat,A

         MOV A,C_HOU1
         SWAP A
         ORL A,C_HOU0
         MOV XmtDat+1,A

         MOV ByteCnt, #02H	  ;传送2字节
         MOV SlvAdr, #0A2H	  ;PCF8563日历时钟器件地址为A2H
         MOV SubAdr, #09H	  ;从日历时钟的09H单元开始
         LCALL SendData	          ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入

⌨️ 快捷键说明

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