|
DATA_READ:
; PCF8574A READ PORT
; IN = R3 ADDRESS (00000XXXB)
; R2 = read_data
SETB read_SDA ;START CONDITION
SETB read_SCL
CALL I2C_DELAY
CLR read_SDA
CALL I2C_DELAY
CLR read_SCL
MOV R2,#0
MOV A,#0
RL A
ANL A,#00001110B
ORL A,#01110001B
CALL read_WRB
JB ERRORF,point0
CALL RDB
JB ERRORF,point2
MOV R2,A
jmp point1
point0: ;send ERROR to rs232
MOV SBUF,#'!'
CALL SEND_DATA
JMP POINT1
POINT2: MOV SBUF,#'?'
CALL SEND_DATA
point1: CLR read_SDA ;STOP CONDITION
SETB read_SCL
CALL I2C_DELAY
SETB read_SDA
;SEND DATA TO RS232
MOV SBUF,R2
CALL SEND_DATA
CPL CLOCK
JMP READ_PORT
RDB:
CPL CLOCK
CLR ERRORF
MOV counter_i2C,#8
RDB1: CALL read_HIGH
MOV C,read_SDA
RLC A
CALL read_LOW
DJNZ counter_I2C,RDB1
SETB read_SDA ;ACKNOWLEDGE BIT (1)
CALL read_HIGH
JB read_SDA,RDB2
SETB ERRORF
RDB2: CALL read_LOW
RET
read_WRB:
CPL CLOCK
CLR ERRORF ;CLEAR ERRORF FIRST
MOV counter_I2C,#8
WRB3: RLC A
MOV read_SDA,C
CALL read_HIGH ;CLOCK
CALL read_LOW
DJNZ counter_I2C,WRB3
SETB read_SDA ;ACKNOWLEDGE BIT
CALL read_HIGH
JNB read_SDA,WRB4
SETB ERRORF
WRB4: CALL read_LOW
RET
I2C_DELay:
NOP ;**** DELAY ****
NOP
CPL CLOCK
NOP
NOP
NOP
RET
read_HIGH:
SETB read_SCL ;**** SCL HIGH + DELAY ****
NOP
CPL CLOCK
NOP
NOP
NOP
NOP
RET
read_LOW:
CLR read_SCL ;**** SCL LOW + DELAY ****
NOP
CPL CLOCK
NOP
NOP
NOP
NOP
RET
E-mail: info@telesys.ru