📄 pcf8563.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 + -