📄 x1205.asm
字号:
;***********************************************************************/
;* Copyright Wuhan P&S Info-Service Co., Ltd. */
;***********************************************************************/
;* */
;* This program is the sample of X1205. */
;* */
;* Time : 2003.11.1 */
;* MCU : AT89C52 */
;* Fosc : 11.0592M */
;* */
;***********************************************************************/
;***********************************************
;内部数据RAM初始化定义? *
;***********************************************
;1)内部位寻址区RAM数据定义00H
;I2C 标志
ACK BIT 00H
;2)内部直接寻址区RAM数据定义30H
24
力源公司不为该示例程序承担各种商业和本示例仅供设计参考
法律责任
对应字节为20H 2FH 7FH
7FH
www.icbase.com
; 其中30H
CCR_DDR EQU
TIME0 EQU
TIME1 EQU
;3)MCU 89C52'S I/O PORT DEFINED
SCL
SDA
EQU
EQU
;---------------------------------------------
;(1) I2C PROGRAM |
;---------------------------------------------
;a) COMMON PART
;启动I2C总线子程序
START:
SETB
NOP
SETB
NOP
NOP
NOP
NOP
NOP
CLR
NOP
NOP
NOP
NOP
NOP
CLR
NOP
RET
;结束I2C总线子程序
STOP:
CLR
NOP
SETB
NOP
NOP
3F 对应堆栈指针30H<=SP<=3FH
40H ;时间存储首地址"40H"
70H ;通用寄存器
71H ;通用寄存器
P1.6
P1.7
SDA
SCL
SDA
SCL
SDA
SCL
25 www.icbase.com
SDA
NOP
NOP
NOP
SETB
NOP
NOP
NOP
NOP
RET
;发送应答信号
SDA
SCL
SCL
MACK:
CLR
NOP
NOP
SETB
NOP
NOP
NOP
NOP
NOP
CLR
NOP
NOP
RET
;发送非应答信号
SDA
SCL
SCL
MNACK:
SETB
NOP
NOP
SETB
NOP
NOP
NOP
NOP
NOP
CLR
NOP
NOP
RET
;检验应答子程序
26 www.icbase.com
;返回值,ACK=1时表示有应答
SDA
SCL
ACK
CACK:
SETB
NOP
NOP
SETB
CLR
NOP
NOP
MOV
JC
SETB
C,SDA
CEND
ACK
CEND:
SCL
NOP
CLR
NOP
RET
;发送字节子程序
;字节数据放入ACC
;每发送一字节要调用一次CACK子程序,取应答位
R0, #08H
WRBYTE:
MOV
WLP:
A
WR1
WR0
RLC
JC
SJMP
WLP1:
R0, WLP DJNZ
NOP
RET
SDA;
SCL
WR1:
SETB
NOP
SETB
NOP
NOP
NOP
NOP
NOP
CLR
SJMP
SCL
WLP1
;取数据位
;判断数据位
发送1
27 www.icbase.com
WR0:
CLR
NOP
SETB
NOP
NOP
NOP
NOP
NOP
CLR
SJMP
;读取字节子程序
;读出的值在ACC
;每取一个字节要发送一个应答
RDBYTE:
MOV
RLP:
SETB
NOP
SETB
NOP
NOP
MOV
MOV
CLR
RLCA
MOV
NOP
NOP
NOP
DJNZ
RET
;b)X1205的读写部分子程序
28
;发送SDA 0
SCL
SCL
WLP1
非应答信号
R0, #08H
SDA
接收数据;时钟线为高SCL
;读数据位C, SDA
A, R2
SCL 时间大于4.7us ;将SCL拉低
;进行数据位处理
R2, A
再来一次;未够8位R0, RLP
www.icbase.com
;X1205的写实时时钟程序(依次设置秒/分/时/日/月/年/周/千年)
;秒/分/时/日/月/年/周/千年==>以CCR_DDR为首地址的连续8字节中
;占用R1 CY A R3
WRITE_CCR:
RETWRNCCR
LCALL START
MOV A, #0DEH
LCALL WRBYTE
LCALL CACK
JNB ACK,
MOV A, #00H
LCALL WRBYTE
LCALL CACK
MOV A, #3FH
LCALL WRBYTE
LCALL CACK
MOV A, #02H
LCALL WRBYTE
LCALL CACK
LCALL STOP
RETWRNCCR
LCALL START
MOV A, #0DEH
LCALL WRBYTE
LCALL CACK
JNB ACK,
MOV A, #00H
LCALL WRBYTE
LCALL CACK
MOV A, #3FH
LCALL WRBYTE
LCALL CACK
MOV A, #06H
LCALL WRBYTE
LCALL CACK
LCALL STOP
ACK,
MOV R3, #08H
LCALL START
MOV A, #0DEH
LCALL WRBYTE
LCALL CACK
JNB RETWRNCCR
;启动总线
;X1205器件地址
;发送器件从地址
;无应答则退出
;指定子地址高字节
;指定子地址低字节
;发02H到状态寄存器
;启动总线
;X1205器件地址
;发送器件从地址
;无应答则退出
;指定子地址高字节
;指定子地址低字节
;发06H到状态寄存器
;写入时间初始值秒/分/时/日/月/年/周/千年
;启动总线
;X1205器件地址
;发送器件从地址
;无应答则退出
www.icbase.com
状态寄存器地址
WEL位置1
状态寄存器地址
1 RWEL和WEL位置
29
;指定子地址高字节
;指定子地址低字节(实时时钟地址
A, #00H
A, #30H
R1, #CCR_DDR
;开始写数据
MOV
LCALL WRBYTE
LCALL CACK
MOV
LCALL WRBYTE
LCALL CACK
MOV
WRCCRDA:
MOV A, @R1
LCALL WRBYTE
LCALL CACK
INC R1
DJNZ ;判断写完没有R3, WRCCRDA
RETWRNCCR:
;非易失性写周期10MS
LCALL STOP
LCALL DELAY10MS
LCALL DELAY10MS
RET
A R1
;启动读实时时钟程序
;向X1205器件读秒/分/时/日/月/年/周/千年数据
;;秒/分/时/日/月/年/周/千年==>以CCR_DDR为首地址的连续8字节中
;占用R3 CY
READ_CCR:
;
;启动总线
;X1205器件地址
;发送器件从地址
RETRDNCCR ;无应答则退出
;指定子地址高字节
;指定子地址低字节(实时时钟地址
MOV R3, #08H
LCALL START
MOV A, #0DEH
LCALL WRBYTE
LCALL CACK
JNB ACK,
MOV A, #00H
LCALL WRBYTE
LCALL CACK
MOV A, #30H
LCALL WRBYTE
LCALL CACK
;重新启动总线
;发读指令
ACK,
LCALL START
MOV A, #0DFH
LCALL WRBYTE
LCALL CACK
JNB READ_CCR
30 www.icbase.com
;设置时间存储地址"40H" #CCR_DDR R1,
;读操作开始
A
SACK
MOV
RDN1:
LCALL RDBYTE
MOV @R1,
DJNZ R3,
LCALL MNACK ;最后一字节法非应答信号
RETRDNCCR:
LCALL STOP
LCALL DELAY10MS
RET
SACK:
RDN1
LCALL MACK
INC R1
SJMP
;---------------------------------------------
;(2) DELAY PROGRAM |
;---------------------------------------------
DELAY10MS:
LCALL DELAY5MS
LCALL DELAY5MS
RET
DELAY5MS:
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
LCALL DELAY1MS
RET
DELAY1MS:
MOV TIME1, #02H
DELAY1MS1:
MOV TIME0, #0D9H
DELAY1MS2:
DJNZ TIME0, DELAY1MS2
DJNZ TIME1, DELAY1MS1
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -