下载请于: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