📄 24c01.asm
字号:
;24c02测试成功2008.03.15
;shenjian
;数据定义
sda bit p2.0 ; 数据线定义
scl bit p2.1 ; 时钟线定义
SLAW equ 0a0h ;
slar equ 0a1h ;
MRD equ 3eh ; 读数据首地址
MTD equ 3dh ; 写数据首地址
NUMBYT equ 3ch ; 读写数据位数
ad24c01 equ 3fh ;储存器地址
;<<<<<<<<<<<<<<<<<<<<<<<<<I2C 软件包
;占用R7,A,C,R1,R0
;mov mrd,#读取数据首址
;mov numbyt,#读取数据位数
;mov ad24c01,#要读取器件的启始地址
;acall RDNBYT
;
;mov mtd,#写入数据首址
;mov numbyt,#写入数据位数
;mov ad24c01,#写入数据首址
;acall WRNBYT
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<START
STA:SETB SDA
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<STOP
STOP:CLR SDA
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<MACK
MACK:CLR SDA
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<MNACK
MNACK:SETB SDA
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
reT
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<CACK
CACK:SETB SDA
SETB SCL
CLR F0
MOV C,SDA
JNC CEND
SETB F0
CEND:CLR SCL
NOP
RET
;*************************************************************************
;*
;* 名称:WRBYT
;* 功能:写一个字节到IIC ,不包括START,STOP操作
;* 调用函数:
;* 输入:A=要写的值
;* 输出:
;* 使用寄存器:R7,A,C
;*
;*************************************************************************
WRBYT:MOV R7, #08H
WLP: RLC A
MOV SDA, C
SETB SCL
NOP
NOP
NOP
CLR SCL
DJNZ R7, WLP
RET
;*************************************************************************
;*
;* 名称:WRNBYT
;* 功能:写N个数到IIC
;* 调用函数:WRBYT,STA,CACK,STOP
;* 输入:NUMBYT=输出数个数,AD24C01=24C01的片内地址,MTD的值;
;* 输出:输出数在从MTD开始的缓冲区中
;* 使用寄存器:R7,A,C,R1,R0
;*
;*************************************************************************
WRNBYT:LCALL STA
MOV R0,NUMBYT
MOV A,#SLAW
LCALL WRBYT
LCALL CACK
JB F0, WRNBYT
MOV A,AD24C01
LCALL WRBYT
LCALL CACK
JB F0, WRNBYT
MOV R1, MTD
WRDA: MOV A, @R1
LCALL WRBYT
LCALL CACK
JB F0, WRNBYT
INC R1
DJNZ R0, WRDA
LCALL STOP
RET
;*************************************************************************
;*
;* 名称:RDBYT
;* 功能:从IIC中读一个字节到单片机中
;* 调用函数:
;* 输入:
;* 输出:A=要读的值
;* 使用寄存器:R7,A,C
;*
;*************************************************************************
RDBYT:MOV R7, #08H
RLP:SETB SDA
SETB SCL
NOP
NOP
MOV C, SDA
RLC A
CLR SCL
NOP
NOP
DJNZ R7, RLP
RET
;*************************************************************************
;*
;* 名称:RDNBYT
;* 功能:从IIC中读N个数到单片机中
;* 调用函数:WRBYT,STA,CACK,STOP
;* 输入:NUMBYT=从IIC中读出数个数,AD24C01=24C01的片内地址, MRD的值;
;* 输出:读入数在从#MRD开始的缓冲区中
;* 使用寄存器:R7,A,C,R1,R0
;*
;*************************************************************************
RDNBYT:LCALL STA
MOV R0, NUMBYT
MOV A, #SLAW
LCALL WRBYT
LCALL CACK
JB F0, RDNBYT
MOV A,AD24C01
LCALL WRBYT
LCALL CACK
JB F0, RDNBYT
LCALL STA
MOV A,#SLAR
LCALL WRBYT
LCALL CACK
JB F0, RDNBYT
MOV R1, MRD
RDDA:LCALL RDBYT
MOV @R1, A
DJNZ R0, ACK
LCALL MNACK
LCALL STOP
RET
ACK:LCALL MACK
INC R1
SJMP RDDA
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -