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

📄 pcf8365.asm

📁 日历时钟显示汇编程序,注释很详细,保证能很快看懂
💻 ASM
字号:
;日历时钟显示实验程序 
ACK     BIT    10H        ;应答标志位
SLA     DATA   50H        ;器件从地址
SUBA    DATA   51H        ;器件子地址
NUMBYTE DATA   52H        ;读/写的字节数
SDA     EQU    P1.3       ;I2C总线定义
SCL     EQU    P1.2
MTD     EQU    30H        ;发送数据缓冲区(30h-3fh)
MRD     EQU    40H        ;接收数据缓冲区 (40h-4fh)
dispptr EQU    60H
SECOND  EQU    60H        ;秒钟个位
SECOND1 EQU    61H        ;秒钟十位
SPACE   EQU    62H
minute  equ    63h        ;分钟个位
minute1 EQU    64H        ;分钟十位
SPACE1  EQU    65H
hour    equ    66h        ;小时个位
hour1    equ   67h        ;小时十位
;定义器件地址
CS124WCXX EQU  0A0H
;-------------------------------------------------
       ORG  0000H
       AJMP MAIN

;--------------------------------------------------
;主程序
;--------------------------------------------------
       ORG  0080H
MAIN:  MOV  R4,#0F0H      ;延时,等待其他芯片复位
       DJNZ R4,$
       LCALL SEND8563
LOOP8563:
       LCALL RCV8563      ;读时钟
       LCALL DL1MS
       LCALL DLCX        ;显示
       AJMP  LOOP8563
;----------------------------------------------------
;读时钟:下面的程序将秒~年共七个字节的时间信息读出并
;放入MRD 为首址的接收缓冲区中。
;注意时间读出后需进行整理屏蔽无效位方能得出正确的信息。
;---------------------------------------------------
RCV8563:
       MOV SLA,#0A2H     ;;取器件地址
       MOV SUBA,#02H     ;;取读时间的首字节地址从秒开始读
       MOV NUMBYTE,#07H  ;;读七个时间信息
       LCALL IRDNBYTE    ;;读取时间并放入接收缓冲区中
       MOV A,MRD         ;;取秒字节
       ANL A,#7FH        ;;屏蔽无效位
       MOV MRD,A
       MOV A, MRD+1      ;;取分钟字节
       ANL A,#7FH        ;;屏蔽无效位
       MOV MRD+1,A
       MOV A, MRD+2      ;;取小时字节
       ANL A,#3FH        ;;屏蔽无效位
       MOV MRD+2,A
       MOV A, MRD+3      ;;取天字节
       ANL A,#3FH        ;;屏蔽无效位
       MOV MRD+3,A
       MOV A, MRD+4      ;;取星期字节
       ANL A,#07H        ;;屏蔽无效位
       MOV MRD+4,A
       MOV A,MRD+5       ;;取月字节
       ANL A,#1FH        ;;屏蔽无效位
       MOV MRD+5,A
       RET
;------------------------------------------------------
;写时钟下面的程序将2000年6月21日星期3下午3 点(15 点)
;59 分30 秒的时间写入PCF8563。
;------------------------------------------------------
SEND8563:
      ACALL LOAD8563    ;;将时间装入发送缓冲区(MTD) 中
      MOV SLA,#0A2H    ;;取器件地址
      MOV SUBA,#00H    ;;取写入寄存器的首字节地址从00H 开始写
      MOV NUMBYTE,#09H ;;写七个时间信息和2 个控制命令
      LCALL IWRNBYTE    ;;写时间
      RET
LOAD8563:
      MOV MTD,#00H     ;;启动时钟
      MOV MTD+1,#1FH   ;;设置报警及定时器中断,定时器中断为脉冲形式
      MOV MTD+2,#30H   ;;以下分别将秒至年的时间写入发送缓冲区中
      MOV MTD+3,#59H
      MOV MTD+4,#15H
      MOV MTD+5,#20H
      MOV MTD+6,#02H
      MOV MTD+7,#06H
      MOV MTD+8,#00H
      RET

;-------------------------------------
;向指定子地址写入N个数据
;--------------------------------------
IWRNBYTE:
       MOV   A,NUMBYTE
       MOV   R3,A
       LCALL START
       MOV   A,SLA
       LCALL WRBYTE
       LCALL CACK
       JNB   ACK,RETWRN
       MOV   A,SUBA
       LCALL WRBYTE
       LCALL CACK
       MOV   R1,#MTD
WRDA:  MOV   A,@R1
       LCALL WRBYTE
       LCALL CACK
       JNB   ACK,IWRNBYTE
       INC   R1
       DJNZ  R3,WRDA
RETWRN:
       LCALL STOP
       RET
;-----------------------------------------
;检查应答位子程序
;----------------------------------------
CACK:  SETB  SDA
       NOP
       NOP
       SETB SCL
       CLR  ACK
       NOP
       NOP
       MOV C,SDA
       JC  CEND
       SETB ACK
CEND:  NOP
       CLR  SCL
       NOP
       RET
;----------------------------------------------
;结束总线子程序
;----------------------------------------------
STOP:  CLR SDA
       NOP
       SETB SCL
       NOP
       NOP
       NOP
       NOP
       NOP
       SETB SDA
       NOP
       NOP
       NOP
       NOP
       NOP
       RET
;-----------------------------------------------
;启动总线子程序
;-----------------------------------------------
START: SETB SDA
       NOP
       SETB SCL
       NOP
       NOP
       NOP
       NOP
       NOP
       CLR  SDA
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       CLR SCL
       NOP
       RET
;----------------------------------------------
;发送字节子程序
;-----------------------------------------------
WRBYTE:
       MOV R0,#08H
WLP:   RLC A
       JC WR1
       SJMP WR0
WLP1:  DJNZ R0,WLP
       NOP
       RET
WR1:   SETB SDA
       NOP
       SETB SCL
       NOP
       NOP
       NOP
       CLR SCL
       NOP
       SJMP WLP1
WR0:   CLR SDA
       NOP
       SETB SCL
       NOP
       NOP
       NOP
       NOP
       CLR SCL
       SJMP WLP1
;------------------------------------------------
;向器件指定子地址读取N个数据
;------------------------------------------------
IRDNBYTE:
       MOV R3,NUMBYTE
       LCALL START
       MOV A,SLA
       LCALL WRBYTE     ;发送器件从地址
       LCALL CACK
       JNB  ACK,RETRDN
       MOV  A,SUBA
       LCALL WRBYTE
       LCALL CACK
       LCALL START
       MOV A,SLA
       INC A
       LCALL WRBYTE
       LCALL CACK
       JNB  ACK,IRDNBYTE
       MOV  R1,#MRD
RDN1:  LCALL  RDBYTE
       MOV  @R1,A
       DJNZ R3,SACK
       LCALL MNACK
RETRDN:LCALL STOP
       RET
SACK:  LCALL MACK
       INC  R1
       SJMP RDN1
;-------------------------------------------------
;无子地址器件读写字节数据
;------------------------------------------------
IRDBYTE:
       LCALL START
       MOV A,SLA
       INC  A
       LCALL WRBYTE
       LCALL CACK
       JNB  ACK,RETRDB
       LCALL RDBYTE
       LCALL MNACK
RETRDB:LCALL  STOP
       RET
;------------------------------------------------
;读取字节子程序
;-------------------------------------------------
RDBYTE:MOV  R0,#08H
RLP:   SETB SDA
       NOP
       SETB SCL
       NOP
       NOP
       MOV C,SDA
       MOV A,R2
       CLR SCL
       RLC A
       MOV R2,A
       NOP
       NOP
       NOP
       DJNZ R0,RLP
       RET
;-------------------------------------------------
;发送应答信号子程序
;-------------------------------------------------
MACK:  CLR SDA
       NOP
       NOP
       SETB SCL
       NOP
       NOP
       NOP
       NOP
       NOP
       CLR SCL
       NOP
       NOP
       RET
;------------------------------------------------
;发送非应答信号
;-------------------------------------------------
MNACK:  SETB  SDA
        NOP
        NOP
        SETB  SCL
        NOP
        NOP
        NOP
        NOP
        NOP
        CLR   SCL
        NOP
        NOP
        RET
;-------------------------------------------------
;//显示程序
;60h-67h:显示缓冲区;
;-------------------------------------------------
DLCX:    MOV A,MRD    ;处理秒钟
         ANL A,#0fH
         MOV SECOND,A
         MOV A,MRD
         SWAP A
         ANL A,#0FH
         MOV SECOND1,A

         MOV A,MRD+1   ;处理分钟
         ANL A,#0fH
         MOV MINUTE,A
         MOV A,MRD+1
         SWAP A
         ANL A,#0FH
         MOV MINUTE1,A

         MOV A,MRD+2    ;处理秒钟
         ANL A,#0fH
         MOV HOUR,A
         MOV A,MRD+2
         SWAP A
         ANL A,#0FH
         MOV HOUR1,A

         MOV SPACE,#0AH
         MOV SPACE1,#0AH

DISP:    MOV R3,#8
DISPLOOP2:
         mov r2,#8
disploop0:
         mov r1,#01h
         mov r0,#67h
         mov dptr,#tab
disploop1:
         mov  a,@r0
         movc a,@a+dptr
         mov  p0,a
         mov  p2,r1
         lcall dl1ms
         lcall dl1ms
         DEC  r0
         mov  a,r1
         RL   a
         mov  r1,a
         djnz r2,disploop1
         DJNZ R3,DISPLOOP2
DL1MS:
LOOP1:   MOV R6,#0FH
LOOP2:   NOP
         NOP
         DJNZ R6,LOOP2
         RET



tab:   db 03h,09FH,25h,0Dh,099h,49h,41h,01Fh,01h,09h,0FDH

END

⌨️ 快捷键说明

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