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

📄 pcf8563.asm

📁 使用时钟芯片pcf8563的时分秒程序 硬件连线说明:开发板(第二版) pcf8563 数据线 p0.7 时钟线 p0.6 74HC164 数据线 p0.2 时钟
💻 ASM
字号:
;=============================================================
;
;         使用时钟芯片pcf8563的时分秒程序
;
;==================================================================
; 硬件连线说明:开发板(第二版)
; pcf8563   数据线   p0.7  时钟线   p0.6
; 74HC164   数据线   p0.2  时钟线   p0.3
;================================================================================
sda_pcf8563    bit   p0.7      ;预定义时钟芯片pcf8563与AT89S51单片机硬件连线  p0.1 错
scl_pcf8563    bit   p0.6      ;                                             p0.2错
sda_74HC164    bit   p0.2      ;预定义数码管显示74HC164与AT89S51单片机硬件连线
scl_74HC164    bit   p0.3      ;

led0   equ   40h     ;预定义数码管显示数据保存单元
led1   equ   41h
led2   equ   42h
led3   equ   43h
led4   equ   44h
led5   equ   45h
led6   equ   46h
led7   equ   47h

second  equ  48h      ;预定义年、月、日、时、分、秒、星期数据保存单元
minute  equ  49h
hour    equ  4ah
day     equ  4bh
month   equ  4ch
year    equ  4dh
week    equ  4eh

ack     bit  30h
;mov led0   #0b
;mov led1   #0b
;mov led2   #0b
;mov led3   #0b
;mov led4   #0b
;mov led5   #0b
;mov led6   #0b
;mov led7   #0b


;==================================================================================
;                              主程序开始
;==================================================================================
ORG  0000H
     AJMP   MAIN
ORG  000BH

main:

      
      call read_pcf8563       ;读时钟芯片的时钟数据
      call separate_1         ;时分秒数据拆分为十位与个位数据, 以便于显示
      call display_1          ;调显示子程序
      call delay              ;调延时子程序
      ajmp main               ;主程序循环
;=================================================================================
;                              主程序结束
;=================================================================================

;***********************************************************************************
;                              读时钟芯片子程序
;***********************************************************************************
read_pcf8563:
       call   start            ;启动总线
       mov    a,#0a2h          ;写操作器件地址
       call   write_byte       ;写入器件地址
       mov    a,#02h           ;选择单元地址
       call   write_byte       ;写入单元地址

       call   start            ;重新启动总线
       mov    a,#0a3h          ;读操作器件地址
       call   write_byte       ;写入器件地址

       call   read_byte        ;读一个字节数据: 秒数据
       anl    a,#7fh           ;屏蔽无效位
       mov    second, a        ;送秒单元保存

       call   read_byte        ;读下一个字节数据: 分数据
       anl    a,#7fh           ;屏蔽无效位
       mov    minute, a        ;送分单元保存

       call   read_byte        ;读下一个字节数据: 小时数据
       anl    a,#3fh           ;屏蔽无效位
       mov    hour, a          ;送小时单元保存
       call   stop             ;结束总线
       reti
;===============================
; 启动总线子程序    开始
;===============================
start:
       clr    scl_pcf8563
       nop
       nop
       nop
       setb   sda_pcf8563
       nop
       nop
       nop
       setb   scl_pcf8563
       nop
       nop
       nop
       clr    sda_pcf8563
       nop
       nop
       nop
       clr    scl_pcf8563          ;钳住总线
       ret
;===============================
; 启动总线子程序    结束
;===============================

;===============================
; 关闭总线子程序    开始
;===============================
stop:
       clr    scl_pcf8563
       nop
       nop
       nop
       clr    sda_pcf8563
       nop
       nop
       nop
       setb   scl_pcf8563
       nop
       nop
       nop
       setb   sda_pcf8563
       nop
       nop
       nop
       clr    scl_pcf8563
       ret
;===============================
; 关闭总线子程序    结束
;===============================

;===============================
; 写一个字节子程序    开始
;===============================
write_byte:
       setb   rs0
       setb   rs1
       mov    r7,#8
       clr    scl_pcf8563

lwr:   rlc    a
       mov    sda_pcf8563, c
       nop
       nop
       nop
       setb   scl_pcf8563
       nop
       nop
       nop
       clr    scl_pcf8563
       nop
       nop
       nop
       djnz   r7, lwr
       setb   sda_pcf8563
       nop
       nop
       nop
       setb   scl_pcf8563
       nop
       nop
       nop
       mov    ack, sda_pcf8563
       clr    scl_pcf8563
       clr    rs0
       clr    rs1
       ret
;===============================
; 写一个字节子程序    结束
;===============================

;===============================
; 读一个字节子程序    开始
;===============================
read_byte:
       setb   rs0
       setb   rs1
       mov    r7,#8
       setb   sda_pcf8563
       clr    scl_pcf8563
       nop
       nop
       nop
lread:
       setb   scl_pcf8563
       nop
       nop
       nop
       mov    c, sda_pcf8563
       rlc    a
       nop
       nop
       nop
       clr    scl_pcf8563
       nop
       nop
       nop
       djnz   r7, lread
       clr    sda_pcf8563
       nop
       nop
       nop
       setb   scl_pcf8563
       nop
       nop
       nop
       clr    scl_pcf8563
       clr    rs0
       clr    rs1
       ret
;===============================
; 写一个字节子程序    结束
;===============================

;***********************************************************************************
;                              读时钟芯片子程序结束
;***********************************************************************************


;***********************************************************************************
;  (时分秒数据拆分为十位与个位数据)   拆分子程序    开始
;***********************************************************************************
separate_1:
       mov   a, second             ;拆秒的个位
       anl   a, #0fh
       mov   led0,a
       mov   a, second             ;拆秒的十位
       anl   a, #0f0h
       swap  a
       mov   led1,a

       mov   a, minute             ;拆分的个位
       anl   a, #0fh
       mov   led3,a
       mov   a, minute             ;拆分的十位
       anl   a, #0f0h
       swap  a
       mov   led4,a

       mov   a, hour               ;拆小时的个位
       anl   a, #0fh
       mov   led6,a
       mov   a, hour               ;拆小时的十位
       anl   a, #0f0h
       swap  a
       mov   led7,a
       ret
;***********************************************************************************
;  (时分秒数据拆分为十位与个位数据)   拆分子程序    结束
;***********************************************************************************


;***********************************************************************************
;                             显示子程序    开始
;***********************************************************************************

DISPLAY_1:
      MOV   DPTR,#TAB              ;设置显示代码数据首地址
LP1:
      MOV     A,LED0               ;要显示的数字放入A中
      MOVC    A,@A+DPTR            ;查表, 得到显示代码
      ACALL   SHIFT                ;要显示代码数据, 通过移位子程序送出

      MOV     A,LED1
      MOVC    A,@A+DPTR
      ACALL   SHIFT
  ;以下的少了==========================================
MOV     A,LED2           
      MOVC    A,@A+DPTR
      ACALL   SHIFT

MOV     A,LED3
      MOVC    A,@A+DPTR
      ACALL   SHIFT

MOV     A,LED4
      MOVC    A,@A+DPTR
      ACALL   SHIFT

MOV     A,LED5
      MOVC    A,@A+DPTR
      ACALL   SHIFT

MOV     A,LED6
      MOVC    A,@A+DPTR
      ACALL   SHIFT

MOV     A,LED7
      MOVC    A,@A+DPTR
      ACALL   SHIFT
 ;以上的少了===========================================================
 
      RET
;-------------------------------------
;    显示代码数据
;---------------------------------------
TAB:
DB  11H,0D7H,32H,92H,0D4H,98H,
DB  18H,0D3H,10H,90H,50H,1CH,
DB  39H,16H,38H, 78H, 0FFH


;=======================================
;        移位子程序  开始
;=======================================
SHIFT:      push  a
            MOV     R2,#8
            CLR     C
DL:         CLR     SCL_74hc164
            RLC     A
            MOV     SDA_74hc164, C
            SETB    SCL_74hc164
            DJNZ    R2,DL
            pop a
            RET

;=======================================
;        移位子程序  结束
;=======================================


;***********************************************************************************
;                             显示子程序    结束
;***********************************************************************************


;***********************************************************************************
;                             延时子程序    开始
;***********************************************************************************
DELAY:
      MOV  R7,#100
LOOP7:MOV  R6,#100
LOOP6:

      mov  r5,#100
      djnz r5, $

      DJNZ  R6,LOOP6
      DJNZ  R7,LOOP7
      RET
;***********************************************************************************
;                             显示子程序    结束
;***********************************************************************************

end



















⌨️ 快捷键说明

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