用I2C通讯实现点亮一盏小灯(包含应答)-汇编语言

用I2C通信实现点亮一盏小灯(包含应答)---汇编语言

下载请于:http://download.csdn.net/detail/chenqiai0/4483389(完全代码以及详解)-------有疑问可以留言,希望多多交流

org 0x00
ljmp start


org 30H
start:
    lcall init_I2C
	lcall init_led
	main:
		  mov R3,#0x23
		  mov R5,#0x05
		  lcall write_add  //这一句和 lcall read_add需要从stop-》start,所以有一个延时,这个延时时间经过自己计算至少1.5ms
		  mov 0x72,#77  //小于77会发生错误
		  j:
		    lcall delay		   //14周期
		    djnz 0x72,j			  //3个周期
		  lcall read_add
		  mov A,R4
		  xrl A,#0xFF
		  mov P0,A
	h:
	  ljmp h



delay:
  mov R0,#5		   //2个周期
  here:
       djnz R0,here  //djnz 寄存器减1,不为零就转移				3个周期
ret


I2C_start:
   clr    P3.7	//scl
   lcall  delay
   setb   P3.6
   lcall  delay
   setb   P3.7
   lcall  delay
   clr    P3.6
   lcall  delay
ret

I2C_stop:
   clr    P3.7	//scl
   lcall  delay
   clr    P3.6
   lcall  delay
   setb   P3.7
   lcall  delay
   setb   P3.6
   lcall  delay
ret


I2C_respons:
   mov R0,#0x00
   setb P3.7
   lcall  delay
   there:
         jnb P3.6,q
		 inc R0
		 cjne R0,#250,there	 
    q:
	   clr P3.7
	   lcall delay
ret

write_byte:  //void write_byte(uchar date),从C语言看,这个函数需要一个参数
             //我们不妨令R5=date		   (R6=i,A=temp)
  mov A,R5
  mov R6,#0x09
 w_circle: djnz R6,next
  ljmp q1
  next:
	rlc A
	clr P3.7
	lcall delay
	mov P3.6,C
	lcall delay
	setb P3.7
	lcall delay
	ljmp w_circle
  q1:
    clr P3.7
	lcall delay
	setb P3.6
	lcall delay
ret


read_byte:
   //A=k,R6=i
   clr P3.7
   lcall delay
   setb P3.6
   lcall delay

   mov R6,#0x09
   mov A,#0x00
  r_circle:
    djnz R6,next2
    ljmp q2
    next2:
    	setb P3.7
    	lcall delay	
    	rl A
    	jb  P3.6,orl1
		 orl A,#0
		 ljmp orl2
    	orl1:
	     orl A,#1
       orl2:
	    mov R4,A
		clr P3.7
		lcall delay
		ljmp r_circle
  q2:
    clr P3.7
	lcall delay
	setb P3.6
	lcall delay
	setb P3.7
	lcall delay

	
ret

write_add:
   mov 0x70,R5//把原数据保存起来
   lcall I2C_start
   mov R5,#0xa0
   lcall write_byte
   lcall  I2C_respons
   mov 0x71,R3
   mov R5,0x71
   lcall write_byte
   lcall  I2C_respons
   mov R5,0x70
   lcall write_byte
   lcall  I2C_respons
   lcall I2C_stop
ret

read_add:
   lcall I2C_start
   mov R5,#0xa0
   lcall write_byte
   lcall  I2C_respons
   mov 0x71,R3
   mov R5,0x71
   lcall write_byte
   lcall  I2C_respons
    lcall I2C_start
   mov R5,#0xa1
   lcall write_byte
   lcall  I2C_respons
   lcall read_byte
ret


init_I2C:
  setb P3.6
  lcall delay
  setb P3.7
  lcall delay
ret

//选中小灯
init_led:
   clr  P1.0
   setb P1.1
   setb P1.2
   clr  P1.4
   setb P1.3
ret
end


 

 

1楼chenqiai0昨天 23:06
欢迎交流