📄 iicnet1.a51.bak
字号:
; Outputs : None
; Register : None
; Return : None
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICDelay:
MOV IICDelayCo,#80H ;延时用计数器清零
IICDelay_01:
CPL WDT ;喂狗
DJNZ IICDelayCo,IICDelay_01;判断延时计算器是否结束
RET
;---------------------------------------------------------------------------------
; Name : IICStart
; Function : 产生iic数据传送起始信号
; Calls : None
; Input : None
; Outputs : None
; Register : None
; Return : None
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICStart:
SETB SDA ;置SDA为高电平状态
SETB SCL ;置SCL为高电平状态
ACALL IICDelay ;传送半位延时
CLR SDA ;发出起始数据信号
ACALL IICDelay ;传送半位延时
CLR SCL ;处理时钟信号
RET ;返回
;---------------------------------------------------------------------------------
; Name : IICStop
; Function : 产生iic数据传送结束信号
; Calls : None
; Input : None
; Outputs : None
; Register : None
; Return : None
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICStop:
SETB SCL ;置SCL为高电平状态
CLR SDA ;置SDA为低电平状态
ACALL IICDelay ;传送半位延时
SETB SDA ;发出起始数据信号
ACALL IICDelay ;传送半位延时
RET ;返回
;---------------------------------------------------------------------------------
; Name : IICWaitAck
; Function : 产生iic数据传送起始信号等待从机(或接收器)返回一个响应信号ACK
; Calls : None
; Input : None
; Outputs : None
; Register : C
; Return : IICReAckB(1-操作成功,0-操作失败)
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICWaitAck:
CLR SCL ;置SCL为低电平状态
SETB SDA ;置SDA为高电平状态,释放SDA信号线
ACALL IICDelay ;传送半位延时
SETB SCL ;置SCL为高电平状态,准备判断SDA
ACALL IICDelay ;传送半位延时
MOV IICWAD,#IICWAD_C ;初始化检测失败次数延时
IICWAITACK_01:
MOV C,SDA
JNC IICWAITACK_03 ;SDA为低电平,返回了响应信号
;否则等待新的开始数据传输信号
DJNZ IICWAD,IICWAITACK_01;检测失败次数不为0循环再检测
IICWAITACK_02: ;返回信号错误处理
CLR IICReAckB
AJMP IICWAITACK_04
IICWAITACK_03:
SETB IICReAckB
IICWAITACK_04:
CLR SDA ;响应信号ACK或开始数据传输
;信号出现,将SDA置为低电平状态
CLR SCL ;将SCL置为低电平状态
IICWAITACK_END:
RET ;返回
;---------------------------------------------------------------------------------
; Name : IICAck
; Function : 向 IIC总线发出一个响应信号ACK
; Calls : None
; Input : None
; Outputs : None
; Register : None
; Return : None
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICAck:
CLR SCL ;置SCL为低电平状态
CLR SDA ;置SDA为低电平状态
ACALL IICDelay ;传送半位延时
SETB SCL ;释放SCL
ACALL IICDelay ;传送半位延时
CLR SCL
RET ;返回
;---------------------------------------------------------------------------------
; Name : IICNoAck
; Function : 向从机或接收器发出一个响应非信号ACK,使数据传送过程结束
; Calls : None
; Input : None
; Outputs : None
; Register : None
; Return : None
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICNoAck:
CLR SCL ;置SCL为低电平状态
SETB SDA ;置SDA为低电平状态
ACALL IICDelay ;传送半位延时
SETB SCL ;释放SCL
ACALL IICDelay ;传送半位延时
RET ;返回
;---------------------------------------------------------------------------------
; Name : IICSendByte
; Function : 向IIC总线发送一个8位数据
; Calls : None
; Input : None
; Outputs : None
; Register : A C
; Return : None
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICSendByte:
MOV IICRCo,#08H ;一个字节共发送8位数据
IICSendByte_01: ;位发送起始
CLR SCL ;处理时钟线使进入更改数据周期
RLC A ;移位输出数据到进位
MOV SDA,C ;进位数据输出到数据引脚
ACALL IICDelay ;半位延时
SETB SCL ;处理时钟线使进入数据有效周期
ACALL IICDelay ;半位延时
DJNZ IICRCo,IICSendByte_01;位发送计数
CLR SCL ;发送完毕时钟线处理
RET ;返回
;---------------------------------------------------------------------------------
; Name : IICRecByet
; Function : 向IIC总线接收一个8位数据
; Calls : None
; Input : None
; Outputs : None
; Register : A C
; Return : IICData
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICRecByte:
CLR SCL
MOV IICRCo,#08H ;一个字节共发送8位数据
CLR A ;初始化寄存器
SETB SDA ;释放SDA
IICRecByte_01: ;位发送起始
CLR SCL ;处理时钟线使进入更改数据周期
ACALL IICDelay ;半位延时
SETB SCL ;处理时钟线使进入数据有效周期
ACALL IICDelay ;半位延时
MOV C,SDA ;接收SDA数据到进位
RLC A ;进位数据移位到累加器
SETB SDA ;确认释放SDA
DJNZ IICRCo,IICRecByte_01;位发送计数
MOV IICData,A
RET ;返回
;**********************************************************
;24c512
;**********************************************************
;---------------------------------------------------------------------------------
; Name : IICWr512
; Function : 向24C512的特定地址写入一个字节数据
; Calls : IICStart IICSendByte IICWaitAck
; Input : #C512Wr C512Ad0 C512Ad1 C512Data
; Outputs : None
; Register : A
; Return : IICReAckB(1-操作成功,0-操作失败)
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICWr512:
ACALL IICStart ;启动iic传送
;发送寻址数据
MOV A,#C512Wr ;读取要操作的器件地址和操作方向(读/写)到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
JNB IICReAckB,IICWr512END ;无应答跳转结束传送,有应答继续传送
;发送要读写的地址
MOV A,C512Ad1 ;取要读写的高8位地址到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
JNB IICReAckB,IICWr512END ;无应答跳转结束传送,有应答继续传送
MOV A,C512Ad0 ;取要读写的低8位地址到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
JNB IICReAckB,IICWr512END;无应答跳转结束传送,有应答继续传送
;写入数据(连续批量写入数据时可以修改该处)
MOV A,C512Data ;取要写入的数据到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
IICWr512END: ;无应答转入点
ACALL IICStop ;发送iic结束通讯
RET ;返回(IICReAckB)
;---------------------------------------------------------------------------------
; Name : IICRd512
; Function : 向24C512的特定地址读出一个字节数据
; Calls : IICStart IICSendByte IICRecByte IICWaitAck
; Input : #C512Wr C512Ad0 C512Ad1 #C512Re
; Outputs : IICData
; Register : A
; Return : IICReAckB(1-操作成功,0-操作失败)
; Date : 20060420 Heng
;---------------------------------------------------------------------------------
IICRd512:
ACALL IICStart ;启动iic传送
;发送寻址数据
MOV A,#C512Wr ;读取要操作的器件地址和操作方向(读/写)到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
JNB IICReAckB,IICRd512END ;无应答跳转结束传送,有应答继续传送
;发送要读写的地址
MOV A,C512Ad1 ;取要读写的高8位地址到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
JNB IICReAckB,IICRd512END ;无应答跳转结束传送,有应答继续传送
MOV A,C512Ad0 ;取要读写的低8位地址到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
JNB IICReAckB,IICRd512END;无应答跳转结束传送,有应答继续传送
ACALL IICStart ;启动iic传送
;发送寻址数据
MOV A,#C512Rd ;读取要操作的器件地址和操作方向(读/写)到累加器
ACALL IICSendByte ;发送累加器中的数据
CLR IICReAckB ;清零返回应答位
ACALL IICWaitAck ;等待应答动作
JNB IICReAckB,IICRd512END;无应答跳转结束传送,有应答继续传送
;读出数据(连续批量读出数据时可以修改该处)
ACALL IICRecByte ;发送累加器中的数据
ACALL IICNoAck ;发送不应答
IICRd512END: ;无应答转入点
ACALL IICStop ;发送iic结束通讯
RET ;返回(IICReAckB)
;*********************************************************************************
;结束
;*********************************************************************************
ORG 07FDH
LJMP 0000H
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -