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

📄 f8563a.asm

📁 单片机C语言教程
💻 ASM
字号:
;*****************************************************************
; 这是被CALL8563.c调用的PCF8563汇编程序,文件名为F8563A.ASM
; 功能:本程序是PCF8563的时钟日历读写程序, 单片机的 P1.0,P1.1分别
;       和PCF8563的SDA、SCL脚相连。
;*****************************************************************
   NAME PCF8563A
   ?PR?_a_func3?PCF8563A     SEGMENT CODE
   ?DT?_a_func3?PCF8563A     SEGMENT DATA OVERLAYABLE
   ?DT?PCF8563A              SEGMENT DATA
   PUBLIC   chai3
   PUBLIC   ?_a_func3?BYTE
   PUBLIC    _a_func3
   RSEG  ?DT?_a_func3?PCF8563A
   ?_a_func3?BYTE:
	 aa:   DS 1
   RSEG  ?DT?PCF8563A
	 chai3:DS 1
   RSEG  ?PR?_a_func3?PCF8563A
	 _a_func3:

SDA    EQU P1.0
SCL    EQU P1.1

SEC    DATA 30H ;秒寄存器
MIN    DATA 31H ;分寄存器
HOUR   DATA 32H ;时寄存器
DAY    DATA 33H ;日寄存器
WEEK   DATA 34H ;周寄存器
MONTH  DATA 35H ;月寄存器
YEAR   DATA 36H ;年寄存器

         MOV aa,R7       ;R7中放传递进来的字符型数,00为读,FFH为写
         MOV A,aa
         JNZ CAT1
         NOP             ; 读PCF8563-读出时钟芯片当前值
         LCALL READTIME  
         RET
CAT1:    NOP             ; 写PCF8563-当前时钟日历值设定
         LCALL SET1  
         RET
; PCF8563当前时间设定子程序
SETTIME:
       MOV R1,#0AH  ;检查是否为第一次启动,是则初始化时间
       LCALL READDATA  
       ANL A,#3FH
       CJNE A,#08,SET1
       RET
SET1:
      MOV 38H,SEC  ;时间初始化-将秒至年的时间写入发送缓冲区
      MOV 39H,MIN
      MOV 3AH,HOUR
      MOV 3BH,DAY
      MOV 3CH,WEEK
      MOV 3DH,MONTH
      MOV 3EH,YEAR
      LCALL WRITEM ;调用写多个字节数据程序
      MOV R2,#00H  ;设置PCF8563的控制寄存器00H为00H,以普通模式运行
      MOV R3,#0H   
      LCALL WRITEDATA  ;写单个字节数据程序
      MOV R2,#08H  ;设置PCF8563的寄存器0AH为08H,8:00报警
      MOV R3,#0AH  
      LCALL WRITEDATA  
      MOV R2,#12H  ;设置PCF8563的寄存器01H为12H,报警有效
      MOV R3,#01H  
      LCALL WRITEDATA 
      MOV R2,#081H ;设置PCF8563的频率寄存器0DH为81H,输出频率为1024Hz
      MOV R3,#0DH  
      LCALL WRITEDATA  
      MOV R2,#081H ;设置PCF8563的寄存器0EH为81H,启动定时器,定时器频率64Hz
      MOV R3,#0EH 
      LCALL WRITEDATA  
      MOV R2,#64H  ;设置PCF8563的寄存器0FH为64H,定时器倒计数值为64
      MOV R3,#0FH 
      LCALL WRITEDATA  
      RET

;读出时钟芯片当前值子程序
READTIME:
      MOV R1,#02H      ;取待读寄存器地址
      MOV R3,#7        ;读7个时钟信息
      LCALL READDATA1  ;调读多个字节数据程序
      MOV A,40H        ;取秒字节
      ANL A,#7FH       ;屏蔽无效位
      MOV SEC,A        ;送秒寄存器
      MOV A,41H        ;取分字节
      ANL A,#7FH       ;屏蔽无效位
      MOV MIN,A        ;送分寄存器
      MOV A,42H        ;取小时字节
      ANL A,#3FH       ;屏蔽无效位
      MOV HOUR,A       ;送时寄存器
      MOV A,43H        ;取天字节
      ANL A,#3FH       ;屏蔽无效位
      MOV DAY,A        ;送天寄存器
      MOV A,44H        ;取星期字节
      ANL A,#07H       ;屏蔽无效位
      MOV WEEK,A       ;送星期寄存器
      MOV A,45H        ;取月字节
      ANL A,#1FH       ;屏蔽无效位
      MOV MONTH,A      ;送月寄存器
      MOV A,46H        ;取年字节
      ANL A,#0FFH      ;屏蔽无效位
      MOV YEAR,A       ;送年寄存器
      RET
SETNUM:MOV 30H,#00H    ;时间日历初始值
       MOV 31H,#59H    ;时间初值:07-07-07,星期一 07:59:00
       MOV 32H,#07H
       MOV 33H,#01H
       MOV 34H,#01H
       MOV 35H,#07H
       MOV 36H,#07H
       RET
DELAY:                ;延时程序 
       NOP
       NOP
       NOP
       RET
;启动位程序
BSTART:SETB SDA       ;发出一个启始位
       SETB SCL
       LCALL DELAY
       CLR SDA
       LCALL DELAY
       CLR SCL
       RET
;停止位程序:     
BSTOP:                ;发出一个停止位
        CLR SDA
        CLR SCL
        LCALL DELAY
        SETB SCL
        LCALL DELAY
        SETB SDA
        LCALL DELAY
        RET
WAITACK:MOV R7,#20    ;等待应答
        SETB SDA
        LCALL DELAY
        SETB SCL
        LCALL DELAY
FLAG1:  MOV C,SDA
        JNC FLAG2
        DJNZ R7,FLAG1
        LCALL BSTOP
FLAG2:  CLR SCL
        LCALL DELAY
        RET

WRITEACK:;输出ACK ,每个字节传输完成,输出ack=0,结束读数据,ack=1;
        MOV SDA,C
        LCALL DELAY
        SETB SCL
        LCALL DELAY
        CLR SCL
        RET
;读一个字节数据程序:入口 R1放待读数据地址
READDATA:
      LCALL BSTART ;START
      MOV A,#0A2H  ;写命令
      LCALL SENDBYTE
      MOV A,R1     ;写地址
      LCALL SENDBYTE
      LCALL BSTART ;START
      MOV A,#0A3H  ;读命令
      LCALL SENDBYTE
      LCALL READBYTE
      SETB C
      LCALL WRITEACK
      LCALL BSTOP
      RET
;读多个字节数据程序:入口 R1放待读数据首地址,R3中放要读数据个数      
READDATA1:
      LCALL BSTART ;START
      MOV A,#0A2H  ;写命令
      LCALL SENDBYTE
      MOV A,R1     ;写地址
      LCALL SENDBYTE
      LCALL BSTART ;START
      MOV A,#0A3H  ;读命令
      LCALL SENDBYTE
      MOV R1,#40H  ;40H为数据暂存区首址
      MOV B,R3     ;R3中放要读个数
      DEC B
LOOP: LCALL READBYTE
      MOV A,R2
      MOV @R1,A
      INC R1
      CLR C
      LCALL WRITEACK
      DJNZ B,LOOP
      LCALL READBYTE
      MOV A,R2
      MOV @R1,A
      SETB C
      LCALL WRITEACK
      LCALL BSTOP
      RET
;写字节程序:
SENDBYTE: MOV R0,#08H
LOOP1:    RLC A
          MOV SDA,C
          SETB SCL
          LCALL DELAY
          CLR SCL
          DJNZ R0,LOOP1
          LCALL WAITACK
          RET

;读字节子程序:
READBYTE: MOV R0,#08H;
          CLR A
          SETB SDA
LOOP4:    SETB SCL
          MOV C,SDA
          RLC A
          CLR SCL
          LCALL DELAY
          DJNZ R0,LOOP4
          MOV R2,A
          RET

;写单个字节数据程序:入口 R3放待写数据地址,R2中放待写数据
WRITEDATA:
       LCALL BSTART
       MOV A,#0A2H
       LCALL SENDBYTE ;SEND THE CONTROL BYTE
       MOV A,R3 ;SEND THE ADDRESS 
       LCALL SENDBYTE
       MOV A,R2 ;WRITE THE CONTENT
       LCALL SENDBYTE
       LCALL BSTOP
       RET
;写多个字节数据程序:R3中放待写寄存器首地址,R1中放待写数据首址,
;B中放待写入数据个数       
WRITEM:    
       MOV R3,#02H
       MOV R1,#38H
       MOV B,#7
LOOP2: MOV A,@R1
       MOV R2,A
       LCALL WRITEDATA
       INC R1
       INC R3
       DJNZ B,LOOP2
       RET
       END

⌨️ 快捷键说明

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