下载请于:http://download.csdn.net/detail/chenqiai0/4483389(完全代码以及详解)-------有疑问可以留言,希望多多交流
org 0x00ljmp startorg 30Hstart: 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 hdelay: mov R0,#5 //2个周期 here: djnz R0,here //djnz 寄存器减1,不为零就转移 3个周期retI2C_start: clr P3.7 //scl lcall delay setb P3.6 lcall delay setb P3.7 lcall delay clr P3.6 lcall delayretI2C_stop: clr P3.7 //scl lcall delay clr P3.6 lcall delay setb P3.7 lcall delay setb P3.6 lcall delayretI2C_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 delayretwrite_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 delayretread_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 retwrite_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_stopretread_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_byteretinit_I2C: setb P3.6 lcall delay setb P3.7 lcall delayret//选中小灯init_led: clr P1.0 setb P1.1 setb P1.2 clr P1.4 setb P1.3retend
- 1楼chenqiai0昨天 23:06
- 欢迎交流