Code:
#if defined __PCH__
#byte SSPSTAT = 0xFC7
#byte SSPBUF = 0xFC9
#elif defined __PCM__
#byte SSPSTAT = 0x94
#byte SSPBUF = 0x13
#endif
#bit DA_BIT = SSPSTAT.5
#bit RW_BIT = SSPBUF.0
#inline
int8 my_i2c_isr_state(void)
{
static int8 i2c_state = 0x03;
int8 retval;
if(!DA_BIT) // If address byte was received
{
i2c_state = 0; // Then clear state.
if(RW_BIT) // If it is a Read address
bit_set(i2c_state, 7); // Then set bit 7 of state, i.e. i2c_state = 0x80
}
retval = i2c_state;
i2c_state++;
return(retval);
}
Đây là hàm i2c_isr_state() mình lấy từ diễn đàn ccscinfo. Bạn đọc nó thì sẽ hiểu rõ biến state: khi nào state = 1, 2, ....
Ta so sánh giá với 0x80. Theo mình là vì 0x80 = 128 = 256/2. Vì state có độ lớn 1 byte. Do đó vùng giá trị của nó được chia đôi. 1/2byte giá trị là dành cho i2c_write() và 1/2byte giá trị là dành cho i2c_read().