#include unsigned char ad_i2c=0x88; //адрес Slave-модуля в интерфейсе A6 A1A0W char bdata byte; //байт с побитовым доступом 7 0 sbit b0=byte^0; sbit b7=byte^7; char tt[ ]="1234"; // ---------------интерфейс I2C wait(unsigned int x) { while(x--); } sbit scl = P3^4; //физический интерфейс I2C sbit sda = P3^5; #define clk { scl=1; scl=0;} //формирование синхросигнала ведущим #define s_cond { sda=scl=1; sda=0;wait(1); scl=0;} //старт-условие формируется ведущим #define p_cond { sda=0;wait(1); scl=1;wait(1); sda=1;} //пост-условие формируется ведущим #define Ack { sda=1; sda=1;sda=0;} // бит Ack=1 на SDA формируется читающим модулем для подтверждения завершения операции #define w_bit { sda=b7; clk; byte<<=1; } //вывод бита в линию #define r_bit { sda=scl=1; byte<<=1; b0=sda; scl=0; } //чтение бита с линии // ---------------------функции интерфейса w_byte(char y) /* синхронная запись байта ведущим МКК */ { unsigned char i; byte=y; for (i=8;i;i--) w_bit; sda=1;clk; } //читать ACK не обязательно, но синхросигнал для чтения обязательно ? r_byte() /* синхронное чтение байта ведущим МКК */ { unsigned char i; for (i=8;i;i--) r_bit; Ack; } //Протокол записи в Slave по произвольному адресу /* S.адрес.0.A.W_адрес.A.W_data.A.W_data.A.....P S-старт-условие, адрес.0 - байт адреса модуля в I2C с битом 0-признак записи A-Ack - подтверждение чтения приемником W_адрес.- байт адреса в модуле W_data - байт данных Р- пост-условие */ W_text(char x,char *y) // запись байта y по адресу x { char i=0; s_cond; w_byte(ad_i2c); // адрес модуля-запись w_byte(x); // адрес ячейки EEPROM while(1) {if(y[i]==0) break; w_byte(y[i++]); // байт данных } p_cond; } //Протокол чтения из RAMSlave по произвольному адресу /* S.адрес.0.A.W_адрес.A.S.адрес.1.data.A....data.1.P S-старт-условие, адрес.1 - байт адреса модуля в I2C и бит 1-признак чтения A-Ack - подтверждение чтения приемником-Master W_адрес.- байт адреса в модуле КЕС 1- бит подтверждения приема от КЕС Р- пост-условие */ char R_text(char x) // чтение байта по адресу { s_cond; w_byte(ad_i2c); // адрес модуля - запись w_byte(x); // адрес ячейки EEPROM s_cond; w_byte(ad_i2c|1); // адрес модуля-чтение r_byte(); // байт данных p_cond; return(byte); } main() { while(1) {P3=0x30; wait(1); W_text(5,&tt[0]); wait(5); } }