高手请帮忙!!!24C02关机时间长就没用,连续开机有记忆!!!
ID EQU 30H
K1 BIT P3.3
K2 BIT P3.4
L1 BIT P2.0
L2 BIT P2.1
L3 BIT P2.2
L4 BIT P2.3
L5 BIT P2.4
L6 BIT P2.5
L7 BIT P2.6
SDA EQU P1.5
SCL EQU P1.6
Address EQU 08H
I2CData EQU 09H
ORG 00H
START:
MOV P1,0FFH
MOV P2,0FFH
MOV SP,#60H
CLR P1.5
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A ;读出数据
LCALL DELAY20MS
cjne A,#8,TT ;
TT: JNC TT1
AJMP TT2
TT1: MOV ID,#00
TT2:
KK1:
JB K1,KK2
LCALL DELAY20MS ;10MS:可靠性低
JB K1,KK2
INC ID
MOV A,ID
CJNE A,#07,REL
MOV ID,#-1H
KK2: JB K2,REL
LCALL DELAY20MS ;10MS:可靠性低
JB K2,REL
DEC ID
MOV A,ID
CJNE A,#-1,REL
MOV ID,#06H ;07H:ERR
;RET:err
REL:
JNB K1,$
JNB K2,$
MOV Address,#00H
MOV I2CData,ID
CALL I2C_WRITE ;写入数据
LCALL DELAY20MS
MOV A,ID
CJNE A,#00H,IS0
ORL P2,#01111111B ;***
CLR L1 ;***
LJMP KK1 ;START:ERR
IS0: CJNE A,#01H,IS1
ORL P2,#01111111B ;***
CLR L2 ;***
LJMP KK1 ;START:ERR
IS1: CJNE A,#02H,IS2
ORL P2,#01111111B ;***
CLR L3 ;***
LJMP KK1 ;START:ERR
IS2: CJNE A,#03H,IS3
ORL P2,#01111111B ;***
CLR L4 ;***
LJMP KK1 ;START:ERR
IS3: CJNE A,#04H,IS4
ORL P2,#01111111B ;***
CLR L5 ;***
LJMP KK1 ;START:ERR
IS4: CJNE A,#05H,IS5
ORL P2,#01111111B ;***
CLR L6 ;***
LJMP KK1 ;START:ERR
IS5: CJNE A,#06H,IS6
ORL P2,#01111111B ;***
CLR L7 ;***
LJMP KK1 ;START:ERR
IS6: LJMP START
/*------------------------------------------------------
写一个字节 Address地址 I2CDatata写入的数据
------------------------------------------------------*/
I2C_WRITE:
I2C_WRITE_A:
LCALL I2C_START
MOV A,#10100000B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_WRITE_A ;=1,表示无确认,再次发送
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,I2CData
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
/*------------------------------------------------------
读一个字节 Address地址 Data读出的数据
------------------------------------------------------*/
I2C_READ:
I2C_READ_A:
LCALL I2C_START
MOV A,#10100000B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_A ;=1,表示无确认,再次发送
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
I2C_READ_B:
LCALL I2C_START
MOV A,#10100001B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_B
LCALL I2C_RECEIVE8BIT
MOV I2CData,A
LCALL I2C_ACK
LCALL I2C_STOP
RET
;发送开始信号
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;发送结束信号
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
;发送接收确认信号
I2C_ACk:
SETB SDA
SETB SCL
NOP
NOP
JB SDA,I2C_ACK0
CLR C
SJMP I2C_ACK_END
I2C_ACK0:
SETB C
I2C_ACK_END:
CLR SCL
RET
;送八位数据
I2C_SEND8BIT:
MOV B,#08H
I2C_SEND8BIT_A:
RLC A
MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,I2C_SEND8BIT_A
RET
;接收八位数据
I2C_RECEIVE8BIT:
MOV B,#08H
CLR A
SETB SDA
I2C_RECEIVE8IT_A:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,I2C_RECEIVE8IT_A
RET
DELAY20MS: MOV R6,#40
LOOP1: MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP1
RET
END
发表时间:2006年8月19日18:44:33