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

📄 i2c.a

📁 I2c 读写程序他人不需帐号就可自由下载此
💻 A
字号:

/*
 I2C_CLK=P1^3;        //IC卡时钟
 I2C_DAT=P1^4;        //IC卡数据位
 I2C_Power_Control=P2^5;     //IC上电
 Insert_Card=P3^2;   //检测是否有卡插入     
*/

;extrn  data(Driver_Code)
       org 00h
       sjmp M_rute
       org 03h
       ajmp M_rute   

M_rute: 
       PUSH acc
       push 00h
       push 01h
       push 02h
       push 03h
       push 04h
       push 05h
       push 06h
       push 07h
       PUSH PSW
 /*
star:  MOV C,P3.2
       JC  star
 
       MOV R0,#0FFH
LOP1:  MOV R1,#0FFH
LOP2:  DJNZ R1,LOP2        ;延时5ms       
       DJNZ R0,LOP1 


      MOV C,P3.2
      JC star        ;再次判断
 */      
      CLR P1.3            ;CLK=0

      mov r0,#0FFH
 DK:  DJNZ R0,DK         ;延时几ms,使的端口逻辑稳定。

      SETB P2.5           ;上电
      setb P1.4           ;DAT=1;
     
        lcall start_bus

        mov a,#0a0h         ;发送器件地址
WR1:	lcall SendByte
        jc WR1             ;没有应答信号则退出。
                
WR3:    mov a,#02h          ;发送RAM 地址
	lcall SendByte
        jc WR3             ;没有应答信号则退出。
        
        lcall start_bus    ;再次启动I2C总线

WR5:    mov a,#0a1h         ;发送读信号
	call SendByte
        jc WR5             ;没有应答信号则退出。
    ;--------------------------------------------------------------------------------------------
    ;------------------------以下为接收数,用R1接收数据---------------------------------------------
         mov a,#00h
         mov r3,#03h        ;r3为大循环次数,r4为存放地址 
	 mov r0,#05h

big_lop: clr c       
         clr p1.3          ;CLK=0
	 setb p1.4         ;DAT=1,初始化PIO
         mov r2,#08


shl_L:   CLR P1.3            ;clk=0
         NOP
	 NOP
	 NOP
	 setb p1.3           ;clk=1 	                    
	 LCALL Delay_Rute    ;延时      
 	 MOV C,P1.4 
         rlc A            ;存数         
         nop
	 NOP
         NOP
	 djnz r2,shl_L  
      ;-------------------接收完一个数-----------------------------------------
         mov @r0,A
	 INC R0
         nop
	 nop	 
	 clr p1.4            ;DAT=0   发出应答ACK信号
 	 LCALL Delay_Rute    ;延时

	 setb p1.3      ;clk=1
	 lcall Delay_rute
         clr  p1.3
	 nop
	 nop
	 SETB P1.4
         djnz r3,big_lop
  ;------------------------------接收完三个数,然后发送停止信号----------------------------
        clr p1.3       ;     CLK=0
        clr p1.4       ;     DAT=0
 
	setb p1.3      ;     clk=1	//结束条件建立时间大于4us
        call Delay_Rute
        setb p1.4          ; DAt=1发送I2C总线结束命令
	call Delay_Rute
	clr p1.3
        sjmp exit          ;退出中断服务程序
 	 
 


;----------启动总线函数-----------------------
start_bus:     
 
	SETB P1.4           ; I2C_DAT=1
	NOp 
	SETB P1.3            ;I2C_CLK=1
	CALL Delay_Rute	     ;起始建立时间大于4.7us
	CLR P1.4 	     ;发送起始信号 I2C_DAT=0
        CALL Delay_Rute	

	CLR  P1.3            ;钳位  I2C_CLK=0
        CALL Delay_Rute	
	ret
/******************************  ********/


     
Delay_Rute: mov r4,#27h
      Lop_D:DJNZ R4,Lop_D
            RET

 /*void	SendByte(uchar char) 用R1传递参数,位C代表是否有ACK应答信号,R2为循环次数*/

SendByte:clr c        ;清除标志位
         clr p1.3     ;clk=0
         mov r2,#08

sh_L:    RLC A   
         mov p1.4,c     ;置DAT PIO 线
        ; LCALL Delay_Rute    ;延时

	 setb p1.3           ;CLK=1
	 lcall Delay_Rute    ;延时
	 clr p1.3            ;CLK=0
         lcall Delay_Rute 
	 djnz r2,sh_L
        ;******************以下接收应答信号*************/
         lcall Delay_Rute
	 setb p1.4          ;DAT=1,初始化PIO 1.4口
	 clr  p1.3          ;CLK=0
	 lcall Delay_Rute    
	 setb p1.3           
	 lcall Delay_Rute         
	 mov c,p1.4           ;把应答信号存放进位C中。
         nop
	 RET
       ;*********************************退出中断服务程序*************************

exit :  pop psw
        pop 07h     
	pop 06h
	pop 05h
	pop 04h
	pop 03h
	pop 02h
	pop 01h
	pop 00h
	POP ACC
        reti
end

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -