Przykładowy kod IIC

#włączać “IIC.h”

//————-czas opóźnienia_us——————————-
nieważne OPÓŹNIENIE(u16 t)
{
chwila (T != 0)
T–;
}

/*unieważnij IIC_Start(próżnia) */
{
SDA = 1;
SCL = 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
SDA = 0;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 0;
}

/* unieważnij IIC_Stop(próżnia) */
{
SCL = 0;
SDA = 0;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
SDA = 1;
}

/*
unsigned char IIC_Wait_Ack(próżnia) */
{
u8 rec = 0;

OPÓŹNIENIE(CZAS ZWŁOKI); //
SDA = 1; //
SCL = 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
rec = SDA;
SCL = 0; //
OPÓŹNIENIE(CZAS ZWŁOKI);

powrót rec;
}

/* unieważnij IIC_Potwierdzenie(próżnia) */
{
SCL = 0;
SDA = 0;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 0;
OPÓŹNIENIE(CZAS ZWŁOKI);
}

/* unieważnij IIC_NAck(próżnia) */
{
SCL = 0;
SDA = 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 0;
OPÓŹNIENIE(CZAS ZWŁOKI);
}


/*
unieważnij IIC_Send_Byte(u8 txd) */
{
u8 ja;

Do(ja = 0; I < 8; ja++)
{
SDA = (txd & 0x80) >> 7; //
txd <<= 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 1;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 0;
OPÓŹNIENIE(CZAS ZWŁOKI);
}
}

/*
u8 IIC_Read_Byte(próżnia)*/
{
u8 ja, rec = 0;

SDA = 1; //
Do(ja = 0; I < 8; ja++)
{
SCL = 0;
OPÓŹNIENIE(CZAS ZWŁOKI);
SCL = 1;
rec <<= 1;
Jeśli(SDA) rec |= 1; //
OPÓŹNIENIE(CZAS ZWŁOKI);
}

powrót rec;
}
#włączać “XGZP6897D.h”

//u8 temp_a5;

//————-napisz jeden bajt danych,Dane od MASTER do SLAVER ——————————

//————-Bit adresu SLAVER:01101101——————————-
unieważnij zapis_jeden_bajt(adres u8, dane u8) //Pisać “dane” na adres NIEWOLNIKA “adres”

{
IIC_Start(); //ROZPOCZĘCIE IIC
IIC_Wyślij_bajt(0xDD); //Operacja IIC WRITE,Adres SLAVER

IIC_Wait_Ack();
IIC_Wyślij_bajt(adres); /*adres*/
IIC_Wait_Ack();
IIC_Wyślij_bajt(dane); /*dane*/
IIC_Wait_Ack();
IIC_Zatrzymaj(); //ZATRZYMANIE IIC
}


//————-Odczytano jeden bajt danych,Dane z SLAVER do MASTER —————————-
u8 Odczyt_Jeden_bajt(adres u8)
{
moje dane u8;
IIC_Start();
IIC_Wyślij_bajt(0xDD);
IIC_Wait_Ack();
IIC_Wyślij_bajt(adres);
IIC_Wait_Ack();
IIC_Start();
IIC_Wyślij_bajt(0xDB); //Operacja ODCZYTU IIC
IIC_Wait_Ack();
mojedane = IIC_Read_Byte();
IIC_NAck(); //
IIC_Zatrzymaj();
zwróć moje dane;
}


//
unieważnij XGZP_Start_Conversion()
{

Zapisz_jeden_bajt(0x30, 0x0A); //wskazują łączną konwersję
chwila ((Odczyt_Jeden_bajt(0x30) & 0x08) > 0);

}

//————-Zapisz n bajtów danych—————————-
u8 software_i2c_Write_nByte(u8 Adres niewolnika, u8 Adres_REG, tylko u8, u8 *buf)
{
int;

//
IIC_Start();

//
IIC_Wyślij_bajt(Adres niewolnika);
IIC_Wait_Ack();

//
IIC_Wyślij_bajt(REG_Adres);
IIC_Wait_Ack();

//
Do (ja = 0; I < dł; ja++) {
IIC_Wyślij_bajt(buf[I]);
Jeśli (IIC_Wait_Ack() == NIEUDANE) {
IIC_Zatrzymaj();
powrót NIEUDANY;
}
}

//
IIC_Zatrzymaj();
zwrócić SUKCES;
}

//————-Przeczytaj n bajtów danych—————————-
u8 software_i2c_Read_nByte(u8 Adres niewolnika, u8 Adres_REG, tylko u8, u8 *buf)
{
//
IIC_Start();

//
IIC_Wyślij_bajt(Adres niewolnika);
IIC_Wait_Ack();

//
IIC_Wyślij_bajt(REG_Adres);
IIC_Wait_Ack();

//
IIC_Start();

//
IIC_Wyślij_bajt(Adres niewolnika + 1);
IIC_Wait_Ack();

//
chwila (dł) {
//
*buf = IIC_Read_Byte();
//
Jeśli (Len == 1)
IIC_NAck();
//
w przeciwnym razie
IIC_Potwierdzenie();
//
buf++;
//
dł–;
}

//
IIC_Zatrzymaj();

zwrócić SUKCES;
}

//————-Odczytaj trzy bajty danych dotyczących ciśnienia—————————-
u8 Read_Pressure_ThreeBytes(u8 *ciśnienie_H, u8 *ciśnienie_M, u8 *ciśnienie_L)
{
bufor u8[3];
wynik u8;

wynik = software_i2c_Read_nByte(0xDD, 0x06, 3, bufor); //

Jeśli(wynik == SUKCES) {
*ciśnienie_H = bufor[0]; //
*ciśnienie_M = bufor[1]; //
*ciśnienie_L = bufor[2]; //
zwrócić SUKCES;
} w przeciwnym razie {
powrót NIEUDANY;
}
}

pusty główny()
{
Dane czujnika *p_sensor_data = &dane_czujnika; //
p_sensor_data->ciśnienie_k = 8192;

LCD1602_Ciepło(); //
LCD1602_show_string(3, 0, “Ciśnienie”); //

chwila(1)
{
Zapisz_jeden_bajt(0x30, 0x0A); //wskazują łączną konwersję
// chwila ((Odczyt_Jeden_bajt(0x30) & 0x08) > 0);
Opóźnienie_ms(10);

//
Jeśli(Read_Pressure_ThreeBytes(&p_sensor_data->ciśnienie_H,
&p_sensor_data->ciśnienie_M,
&p_sensor_data->ciśnienie_L) == SUKCES)
{
//
p_sensor_data->ciśnienie_AD = (długi bez znaku)((((długi bez znaku)p_sensor_data->ciśnienie_H) << 16) |
(((bez znaku int)p_sensor_data->ciśnienie_M) << 8) |
((znak bez znaku)p_sensor_data->ciśnienie_L));

//
p_sensor_data->ciśnienie = (p_sensor_data->ciśnienie_AD > 8388608) ?
(podwójnie)((p_sensor_data->ciśnienie_AD – 16777216) / (podwójnie)(p_sensor_data->ciśnienie_k)) :
(podwójnie)(p_sensor_data->ciśnienie_AD / (podwójnie)(p_sensor_data->ciśnienie_k));

//
Jeśli (is_zero_point_set)
{
ciśnienie_punktu zerowego = p_dane_czujnika->nacisk; //
is_zero_point_set = 0; //
}

p_sensor_data->ciśnienie -= ciśnienie punktu zerowego;

//
Jeśli (p_sensor_data->nacisk > 1000.0) {
//
p_sensor_data->ciśnienie /= 1000.0;
float_to_str(p_sensor_data->P_bufor, p_sensor_data->nacisk, 2, ” kPa”);
} w przeciwnym razie {
float_to_str(p_sensor_data->P_bufor, p_sensor_data->nacisk, 2, ” Rocznie”);
}

LCD1602_show_string(3, 1, p_sensor_data->P_bufor);
}
w przeciwnym razie
{
//
LCD1602_show_string(3, 1, “CZYTAJ BŁĄD”);
}

Opóźnienie_ms(200); //
}
}