📄 程序功能本程序是利用文件240x.asm中的子程序对eeprom 240x进行多字节读写的操作.txt
字号:
; 错误标志位C,若错误标志位C为高电平则表示总线不可用.
;占用资源:C.
;占用堆栈:0字节.
;子程序调用:无.
;说明:当SCL为高电平时,SDA由高变低.
I2C_START: SETB I2C_SDA
SETB I2C_SCL
;判断总线是否可用
JNB I2C_SDA,I2C_ER1 ;不为高则跳转
JNB I2C_SCL,I2C_ER1 ;不为高则跳转
NOP ;保证启动建立时间大于4.7us (start
setup time)
CLR I2C_SDA ;保证启动保持时间大于4.0us (start hold
time)
NOP
NOP
NOP
NOP
NOP
CLR I2C_SCL
CLR C ;清错误标志位(总线可用)
SJMP I2C_OK1
I2C_ER1: SETB C ;置错误标志位(总线不可用)
I2C_OK1: RET
;***********************I2C_STOP*******************************
;程序功能:本程序实现在虚拟I2C总线上发送结束位。
;入口参数:SCL在入口时应为低电平.
;出口参数:SDA,SCL都为高电平.
;占用资源:无.
;占用堆栈:0字节.
;子程序调用:无.
;说明:当SCL为高电平时,SDA由低变高。
I2C_STOP: CLR I2C_SDA
NOP ;保证SCL低电平时间大于4.7us(clock pulse
width low)
NOP ;以及数据建立时间大于200ns(data in
setup time)
SETB I2C_SCL
NOP ;保证结束建立时间大于4.7us(stop setup
time)
NOP
NOP
NOP
NOP
SETB I2C_SDA
RET
;**********************I2C_TACK*******************************
;程序功能:本程序实现向虚拟I2C总线上发送应答位。
;入口参数:SCL在入口时应为低电平.
;出口参数:SDA,SCL都为低电平.
;占用资源:无.
;占用堆栈:0字节.
;子程序调用:无.
I2C_TACK: CLR I2C_SDA ;发送应答位
NOP ;保证SCL低电平时间大于4.7us(clock pulse
width low)
NOP ;以及数据建立时间大于200ns(data in
setup time)
SETB I2C_SCL ;产生一个时钟周期
NOP ;保证SCL高电平时间大于4.0us(clock pulse
width high)
NOP
NOP
NOP
CLR I2C_SCL
RET
;**********************I2C_TNACK******************************
;程序功能:本程序实现向虚拟I2C总线上发送非应答位。
;入口参数:SCL在入口时应为低电平.
;出口参数:SDA为高电平,SCL为低电平.
;占用资源:无.
;占用堆栈:0字节.
;子程序调用:无.
I2C_TNACK: SETB I2C_SDA ;发送非应答位
NOP ;保证SCL低电平时间大于4.7us(clock pulse
width low)
NOP ;以及数据建立时间大于200ns(data in
setup time)
SETB I2C_SCL ;产生一个时钟周期
NOP ;保证SCL高电平时间大于4.0us(clock pulse
width high)
NOP
NOP
NOP
CLR I2C_SCL
RET
;**********************I2C_CACK*******************************
;程序功能:本程序实现从虚拟I2C总线上检查应答位。
;入口参数:SCL在入口时应为低电平.
;出口参数:应答位存在C中,SCL为低电平.
;占用资源:C.
;占用堆栈:0字节.
;子程序调用:无.
I2C_CACK: SETB I2C_SDA ;置I2C_SDA为输入方式
NOP ;保证SCL低电平时间大于4.7us(clock
pulse width low)
NOP ;以及保证tAA大于0.1us(clock low to
data out valid)
SETB I2C_SCL
NOP ;保证SCL高电平时间大于4.0us(clock
pulse width high)
NOP
NOP
NOP
MOV C,I2C_SDA ;接收应答位
CLR I2C_SCL ;拉低时钟线
RET
;***********************I2C_WRBYT******************************
;程序功能:本程序实现向虚拟I2C总线上发送一字节数据.
;入口参数:A存待发送单字节数据,SCL在入口时应为低电平.
;出口参数:SCL为低电平.
;占用资源:A,PSW,R0.
;占用堆栈:0字节.
;子程序调用:无.
I2C_WRBYT: MOV R0,#08H ;计8位
I2C_WLP: RLC A
MOV I2C_SDA,C
;保证SCL低电平时间大于4.7us(clock
pulse width low)
NOP ;以及数据建立时间大于200ns(data in
setup time)
SETB I2C_SCL ;产生一个时钟周期
NOP ;等待接收器件读取
NOP ;保证SCL高电平时间大于4.0us(clock
pulse width high)
NOP
NOP
CLR I2C_SCL ;拉低时钟线以便再次发送
DJNZ R0,I2C_WLP ;是否发完8位
RET
;***********************I2C_RDBYT******************************
;程序功能:本程序实现从虚拟I2C总线上接收一字节数据.
;入口参数:SCL在入口时应为低电平.
;出口参数:A存放接收到的单字节数据,SCL为低电平.
;占用资源:A,PSW,R0.
;占用堆栈:0字节.
;子程序调用:无.
I2C_RDBYT: MOV R0,#08H ;计数8位
SETB I2C_SDA ;置1以便输入
I2C_RLP: NOP ;保证SCL低电平时间大于4.7us(clock pulse
width low)
;保证SCL低电平时间大于4.7us(clock pulse width low)
NOP ;以及保证tAA大于0.1us(clock low to data
out valid)
;以及数据建立时间大于200ns(data in setup time)
NOP
SETB I2C_SCL ;拉高时钟线,以便输入
NOP ;保证SCL高电平时间大于4.0us(clock
pulse width high)
NOP
MOV C,I2C_SDA
RLC A
CLR I2C_SCL ;拉低时钟线,以便发送器发送
DJNZ R0,I2C_RLP
RET
;****************DELAYNMS***************************************
;程序功能:本程序实现延时Nms.
;入口参数:DELAYMS_NUM存放延时的毫秒数.
;出口参数:无.
;占用资源:R3
;占用堆栈:0字节.
;子程序调用:无.
;说明:1,本程序适用于晶振频率为12MHZ时,即单周期指令用时1us的模式,
; 时间计算公式为(249*4+1+1+2)*(DELAYMS_NUM)+2=1000*(DELAYMS_NUM)+2
; 2,未加上调用该子程序的指令执行的时间,如 LCALL DELAYNMS
; 3,使用该子程序前需定义符号DELAYMS_NUM,例DELAYMS_NUM DATA 55H
DELAYNMS: MOV R3,#0F9H ;1us
LOOP500: NOP
NOP
DJNZ R3,LOOP500 ;2us
NOP
DJNZ DELAYMS_NUM,DELAYNMS ;2us
RET ;2us
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -