📄 ea1010_061022.asm
字号:
;/***********************************
;标号:F_iic_Write6
;功能:发送6字节子程序
;入口:要写的数据放在起始地址为CB_IIC_Display的数组中
;出口:无
;堆栈使用:6
;影响资源:Acc
;调用子程序:F_iic_Start..........2
; F_iic_SendBit........2
; F_iic_Tryresponsion..2
;其他: 如果那一个没写对(没响应)重写
;***********************************/
F_iic_Write6:
PUSH B
PUSH PSW
F_iic_Write6A:
LCALL F_iic_Start ;总线启动
MOV R0,#CB_IIC_Display
MOV RB_IICWRCounter,#7
L_iic_Write6:
mov A,@R0
LCALL F_iic_SendBit
LCALL F_iic_Tryresponsion
JNB Fg_Ack,F_iic_Write6A ;不应答重来
INC R0
DJNZ RB_IICWRCounter,L_iic_Write6
POP PSW
POP B
RET
;/***********************************
;标号:F_iic_ReadSign
;功能:读通讯信息
;入口: 无
;出口:读出的数据放在RB_IIC_BUFF
;堆栈使用:6
;影响资源:Acc
;调用子程序:F_iic_Start...........2
; F_iic_SendBit.........2
; F_iic_ReadBit.........2
; F_iic_Tryresponsion....2
;其他:
;***********************************/
F_iic_ReadSign:;
PUSH B
PUSH PSW
L_iic_Read1A:
LCALL F_iic_Start
MOV A,#55H
LCALL F_iic_SendBit ;发送器件从地址
LCALL F_iic_Tryresponsion ;检测是否应答
JNB Fg_Ack,L_iic_Read1A ;不应答(Fg_Ack=0)重来
LCALL F_iic_ReadBit ;进行读字节操作
LCALL F_iic_Responsion ;发送应答信号
MOV RB_IIC_BUFF,A
ANL A,#0F0H
CJNE A,#50H, L_iic_Read1A
; MOV A,RB_IIC_BUFF
POP PSW
POP B
RET
;/*********************************************************
; 标号:F_iicVerify20
; 功能:计算校验程序 计算起始地址为CB_IIC_Display的20连续字节的异或结果
;入口:无
;出口: RB_iicVerify
;堆栈使用:2
;影响资源:acc,r0
;调用子程序:无
;*********************************************************/
F_iicVerify20:
CLR A;
MOV R0,#CB_IIC_Display
MOV R3,#20
L_iicVerify: INC R0
XRL A,@R0
DJNZ R3,L_iicVerify
MOV RB_iicVerify,A
RET
;/************************************************************
; 标号:F_iicVerify5
; 功能:计算校验程序 计算起始地址为CB_IIC_Display的5连续字节的异或结果
;入口:无
;出口: RB_iicVerify
;堆栈使用:2
;影响资源:acc,r0
;调用子程序:无
;************************************************************/
F_iicVerify5:
CLR A;
MOV R0,#CB_IIC_Display
MOV R3,#5
L_iicVerify5: INC R0
XRL A,@R0
DJNZ R3,L_iicVerify5
INC R0
MOV @R0,A
RET
;/***********************************
;标号:F_iic_Start
;功能:启动I2C总线子程序
;入口:无
;出口:无
;堆栈使用:2
;影响资源:无
;调用子程序:无
;其他:当SCL=1时,SDA由高电平跳变到低电平,为“开始”信号
;***********************************/
F_iic_Start:
SETB P_iic_SDA
LCALL F_iicDelay
MOV C,P_iic_SDA
JNB P_iic_SDA,F_iic_Start ;如果数据线被钳制,返回等待
SETB P_iic_SCL ;起始条件建立时间大于4.7us
LCALL F_iicDelay
JNB P_iic_SCL,F_iic_Start ;如果时钟线被钳制,返回等待
CLR P_iic_SDA ;起始条件锁定时大于4us
LCALL F_iicDelay
CLR P_iic_SCL ;钳住总线,准备发数据
NOP
NOP
RET
;/***********************************
;标号:F_iic_Stop
;功能:结束I2C总线子程序
;入口:无
;出口:无
;堆栈使用:2
;影响资源:无
;调用子程序:无
;其他:当SCL=1时,SDA由低电平跳变为高电平,为“结束”信号
;***********************************/
F_iic_Stop:
CLR P_iic_SDA
NOP
SETB P_iic_SCL ;发送结束条件的时钟信号
;结束总线时间大于4us
LCALL F_iicDelay
SETB P_iic_SDA ;结束总线
;保证一个终止信号和起始信号的空闲时间大于4.7us
LCALL F_iicDelay
RET
;/***********************************
;标号:F_iic_Responsion
;功能:发送应答信号子程序
;入口:无
;出口:无
;堆栈使用:2
;影响资源:无
;调用子程序:无
;其他:主器件每传送一个一字节后插入一个认可位ACK,在这个时钟内主器件释放SDA线,
; 从器件响应信号将SDA拉成低电平,使SDA在该时钟的高电平期间稳定为低电平。
; 从器件响应结束后SDA为高进入下一个传送周期
;***********************************/
F_iic_Responsion:
CLR P_iic_SDA;将SDA置0
NOP
NOP
NOP
SETB P_iic_SCL ;保持数据时间,即SCL为高时间大于4.7us
LCALL F_iicDelay
CLR P_iic_SCL
NOP
NOP
NOP
RET
;/***********************************
;标号:F_iic_Tryresponsion
;功能:检查应答位子程序
;入口:无
;出口:Fg_Ack=1时表示有应答
; Fg_Ack=0时表示无应答
;堆栈使用:2
;影响资源:无
;调用子程序:无
;其他:主器件每传送一个一字节后插入一个认可位ACK,在这个时钟内主器件释放SDA线,
; 从器件响应信号将SDA拉成低电平,使SDA在该时钟的高电平期间稳定为低电平。
; 从器件响应结束后SDA为高进入下一个传送周期
;***********************************/
F_iic_Tryresponsion:
SETB P_iic_SDA
LCALL F_iicDelay
SETB P_iic_SCL
CLR Fg_Ack
LCALL F_iicDelay
MOV C,P_iic_SCL
JNC L_Tryresponsion
MOV C,P_iic_SDA
JC L_Tryresponsion
SETB Fg_Ack ;判断应答位
L_Tryresponsion:
LCALL F_iicDelay
CLR P_iic_SCL
LCALL F_iicDelay
RET
;/***********************************
;标号:F_iic_SendBit
;功能:发送字节子程序(只是发送数据不作其他判断)
;入口:acc
;出口:无
;堆栈使用:2
;影响资源:Acc,B,Psw(Cy)
;调用子程序:无
;其他:字节数据放入ACC,左移,每次取C中的内容发送出去
;每发送一字节要调用一次F_iic_Tryresponsion子程序,(必须)取应答位
;***********************************/
F_iic_SendBit:
MOV B,#08H
L_WLP :
RLC A ;取数据位
JC L_WR1
SJMP L_WR0 ;判断数据位
L_WLP1 :
NOP
NOP
DJNZ B,L_WLP
NOP
NOP
; ACALL F_iicDelay
RET
L_WR1 :
SETB P_iic_SDA ;发送1
LCALL F_iicDelay
SETB P_iic_SCL
LCALL F_iicDelay
L_WR10 :
JB P_iic_SCL,L_WR11 ;如果时钟线被钳制,等待
DJNZ R3,L_WR10
L_WR11 :
CLR P_iic_SCL
AJMP L_WLP1
L_WR0 :
CLR P_iic_SDA ;发送0
LCALL F_iicDelay
SETB P_iic_SCL
LCALL F_iicDelay
L_WR00 :
JB P_iic_SCL,L_WR01 ;如果时钟线被钳制,等待
DJNZ R3,L_WR00
L_WR01 :
CLR P_iic_SCL
LJMP L_WLP1
;/***********************************
;标号:F_iic_ReadBit
;功能:读取字节子程序(只是读取数据不作其他判断)
;入口:无
;出口:acc
;堆栈使用:2
;影响资源:Acc,B,Psw(Cy)
;调用子程序:无
;其他:读出的值在ACC,每取一字节要发送一个应答/非应答信号,
; 即必须在调用后必须跟LCALL F_iic_(UN)Tryresponsion
;***********************************/
F_iic_ReadBit:
MOV B,#08H
L_RLP:
SETB P_iic_SDA
ACALL F_iicDelay
SETB P_iic_SCL ;时钟线为高,接收数据位
ACALL F_iicDelay
L_RLP0 :
JB P_iic_SCL,L_RLP1 ;如果时钟线被钳制,等待
DJNZ R3,L_RLP0
L_RLP1 :
MOV C,P_iic_SDA ;读取数据位
CLR P_iic_SCL ;将SCL拉低,时间大于4.7us
RLC A ;进行数据位的处理
ACALL F_iicDelay
DJNZ B,L_RLP ;未够8位,重来
RET
;/***********************************
;标号:F_iicDelay
;功能:延时子程序,在IIC内部操作中使用,以调整波特率
;入口:
;出口:
;堆栈使用:2
;***********************************/
F_iicDelay:
MOV R3,#4
F_iicDelay1:
DJNZ R3,F_iicDelay1
RET
;/***********************************
;标号:F_DelayLED
;功能:延时子程序,同时控制指示灯闪烁
;入口: RB_IICDelayLed,每个单位延时约33mS
;出口:
;堆栈使用:2
;***********************************/
F_DelayLED:
mov R4,#00
mov R3,#00
F_iicDelay2: ; //约33ms
DJNZ R3,F_iicDelay2
DJNZ R4,F_iicDelay2
MOV A,p3
CPL A
MOV p3,A
DJNZ RB_IICDelayLed,F_DelayLED
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -