⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ea1010_061022.asm

📁 keil-c开发
💻 ASM
📖 第 1 页 / 共 5 页
字号:

;/***********************************
;标号: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 + -