📄 iic.asm
字号:
;*****************************************************
;
; This programme is for study Ver2.0.0 beta
; I2C reader/writer programme for MCS-51's
; For PHILIPS PCF8563 timer-chip
;This programme mast be run in 12MHz standard settings
; Designer: Mr.Koii
; Copyright 2002 koiistudio
; 2003.03.31 at Changsha. H.N. P.R.China
;
;*****************************************************
;*****************************************************
;参数定义
;*****************************************************
scl bit p1.6 ;时钟引脚
sda bit p1.7 ;数据引脚
;*****************************************************
;时钟数据设置
;*****************************************************
timer_set: mov r0,#date_data ;时钟相关设置
mov @r0,#0 ;Control status 1
inc r0
mov @r0,#11h ;Control status 2
inc r0
mov @r0,#00h ;Seconds
inc r0
mov @r0,#15h ;Minutes
inc r0
mov @r0,#15h ;Hours
inc r0
mov @r0,#30h ;Days
inc r0
mov @r0,#07h ;Weekdays
inc r0
mov @r0,#03h ;Months
inc r0
mov @r0,#03h ;Years
inc r0
mov @r0,#80h ;Minute alarm
inc r0
mov @r0,#80h ;Hour alarm
inc r0
mov @r0,#80h ;Day alarm
inc r0
mov @r0,#80h ;Weekday alarm
inc r0
mov @r0,#83h ;CLKout control
inc r0
mov @r0,#82h ;Timer control
inc r0
mov @r0,#01h ;Timer
call timer_write ;设置时钟
ret
;*****************************************************
;PCF8563应用程序
;写PCF8563
;入口参数:发送缓冲@r1
;*****************************************************
timer_write: call iicstart
mov a,#0a2h ;器件地址和写指令
call iicwbyte
call iiccack
jc return_0
mov a,#0 ;字节子地址
call iicwbyte
call iiccack
jc return_0
mov r1,#date_data ;数据
mov r0,#16 ;字节数
iicwrite0: mov a,@r1 ;数据
call iicwbyte
call iiccack
jc return_0
inc r1
djnz r0,iicwrite0
call iicstop
ret
return_0: call beep3
call iicstop
mov a,#0e5h
ret
;*****************************************************
;读PCF8563
;出口参数:接收缓冲@r1
;*****************************************************
iicread: call iicstart
mov a,#0a3h ;器件地址和读命令
call iicwbyte
call iiccack
jc retrdn
mov r1,#date_data
mov r0,#15 ;共读取16个字节数据
iicread0: call iicrbyte
call iicack
inc r1
djnz r0,iicread0
call iicrbyte
call iicnack
call iicstop
mov r0,#digital_byte ;时间数据存入显存
mov a,#date_data
add a,#2
mov r1,a
mov a,@r1 ;秒
anl a,#0fh
mov @r0,a
inc r0
mov a,@r1 ;十秒
swap a
anl a,#0fh
mov @r0,a
inc r0
inc r1
mov a,@r1
anl a,#0fh ;分
mov @r0,a
inc r0
mov a,@r1
swap a
anl a,#0fh ;十分
mov @r0,a
inc r0
inc r1
mov a,@r1
anl a,#0fh ;时
mov @r0,a
inc r0
mov a,@r1
swap a
anl a,#0fh ;十时
mov @r0,a
inc r0
mov @r0,#20h
inc r0
mov @r0,#20h
ret
retrdn: call beep3
call iicstop
ret
;*****************************************************
;iic写字节
;入口条件:被写数据acc
;*****************************************************
iicwbyte: mov r2,#08H
wlp: rlc a
jc wr1
clr sda ;发送0
setb scl
nop
nop
clr scl
djnz r2,wlp
ret
wr1: setb sda ;发送1
setb scl
nop
nop
clr scl
clr sda
djnz r2,wlp
ret
;*****************************************************
;iic读字节
;出口参数:所读数据acc
;*****************************************************
iicrbyte: mov r2,#08h
iicr2: setb sda
setb scl
nop
mov c,sda
clr scl
rlc a
djnz r2,iicr2
clr sda
mov @r1,a
ret
;*****************************************************
;iic起始位
;*****************************************************
iicstart: setb sda
nop
setb scl
nop
nop
clr sda
nop
nop
clr scl
ret
;*****************************************************
;停止位
;*****************************************************
iicstop: clr sda
nop
setb scl
nop
nop
setb sda
nop
nop
ret
;*****************************************************
;iic应答
;*****************************************************
iicack: clr sda
nop
setb scl
nop
nop
clr scl
ret
;*****************************************************
;iic非应答
;*****************************************************
iicnack: setb sda
nop
setb scl
nop
nop
clr scl
ret
;*****************************************************
;iic检查应答
;*****************************************************
iiccack: setb sda
nop
setb scl
nop
mov c,sda
clr scl
clr sda
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -