Codice di esempio IIC

#includere “IIC.h”

//————-tempo di ritardo_us——————————-
RITARDO nullo(u16 t)
{
Mentre (T != 0)
T–;
}

/*void IIC_Start(vuoto) */
{
SDA = 1;
SCL = 1;
RITARDO(RITARDO);
SDA = 0;
RITARDO(RITARDO);
SCL = 0;
}

/* void IIC_Stop(vuoto) */
{
SCL = 0;
SDA = 0;
RITARDO(RITARDO);
SCL = 1;
RITARDO(RITARDO);
SDA = 1;
}

/*
carattere senza segno IIC_Wait_Ack(vuoto) */
{
u8 rec = 0;

RITARDO(RITARDO); //
SDA = 1; //
SCL = 1;
RITARDO(RITARDO);
rec = SDA;
SCL = 0; //
RITARDO(RITARDO);

ritorno rec;
}

/* void IIC_Ack(vuoto) */
{
SCL = 0;
SDA = 0;
RITARDO(RITARDO);
SCL = 1;
RITARDO(RITARDO);
SCL = 0;
RITARDO(RITARDO);
}

/* vuoto IIC_NAck(vuoto) */
{
SCL = 0;
SDA = 1;
RITARDO(RITARDO);
SCL = 1;
RITARDO(RITARDO);
SCL = 0;
RITARDO(RITARDO);
}


/*
void IIC_Send_Byte(u8 txd) */
{
u8 i;

per(io = 0; io < 8; io++)
{
SDA = (txd & 0x80) >> 7; //
txd <<= 1;
RITARDO(RITARDO);
SCL = 1;
RITARDO(RITARDO);
SCL = 0;
RITARDO(RITARDO);
}
}

/*
u8 IIC_Leggi_Byte(vuoto)*/
{
u8 i, rec = 0;

SDA = 1; //
per(io = 0; io < 8; io++)
{
SCL = 0;
RITARDO(RITARDO);
SCL = 1;
rec <<= 1;
Se(SDA) rec |= 1; //
RITARDO(RITARDO);
}

ritorno rec;
}
#includere “XGZP6897D.h”

//u8 temp_a5;

//————-scrivere un byte di dati,Dati dal MASTER allo SLAVER ——————————

//————-Bit di indirizzo SLAVER:01101101——————————-
void Write_One_Byte(u8 indirizzo, u8 idati) //Scrivere “i dati” all'indirizzo dello SCHIAVO di “ind”

{
IIC_Avvio(); //INIZIO IIC
IIC_Send_Byte(0xDA); //Operazione di scrittura IIC,Indirizzo SLAVER

IIC_Wait_Ack();
IIC_Send_Byte(ind); /*indirizzo*/
IIC_Wait_Ack();
IIC_Send_Byte(i dati); /*i dati*/
IIC_Wait_Ack();
IIC_Stop(); //FERMATA IIC
}


//————-Ha letto un byte di dati,Dati dallo SLAVER al MASTER —————————-
u8 Leggi_Un_Byte(u8 indirizzo)
{
u8 i miei dati;
IIC_Avvio();
IIC_Send_Byte(0xDA);
IIC_Wait_Ack();
IIC_Send_Byte(ind);
IIC_Wait_Ack();
IIC_Avvio();
IIC_Send_Byte(0xDB); //Operazione IIC READ
IIC_Wait_Ack();
mieidati = IIC_Read_Byte();
IIC_NAck(); //
IIC_Stop();
restituire i miei dati;
}


//
void XGZP_Start_Conversion()
{

Scrivi_Un_Byte(0x30, 0x0A); //indicare una conversione combinata
Mentre ((Leggi_Un_Byte(0x30) & 0x08) > 0);

}

//————-Scrivi n byte di dati—————————-
u8 software_i2c_Write_nByte(u8 Indirizzo dello schiavo, u8 Indirizzo_REG, solo u8, u8 *buff)
{
int i;

//
IIC_Avvio();

//
IIC_Send_Byte(IndirizzoSlavo);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Indirizzo);
IIC_Wait_Ack();

//
per (io = 0; io < len; io++) {
IIC_Send_Byte(buf[io]);
Se (IIC_Wait_Ack() == FALLITO) {
IIC_Stop();
ritorno FALLITO;
}
}

//
IIC_Stop();
restituire SUCCESSO;
}

//————-Leggi n byte di dati—————————-
u8 software_i2c_Read_nByte(u8 Indirizzo dello schiavo, u8 Indirizzo_REG, solo u8, u8 *buff)
{
//
IIC_Avvio();

//
IIC_Send_Byte(IndirizzoSlavo);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Indirizzo);
IIC_Wait_Ack();

//
IIC_Avvio();

//
IIC_Send_Byte(IndirizzoSlavo + 1);
IIC_Wait_Ack();

//
Mentre (len) {
//
*buf = IIC_Read_Byte();
//
Se (lunghezza == 1)
IIC_NAck();
//
altro
IIC_Ack();
//
bu++;
//
len–;
}

//
IIC_Stop();

restituire SUCCESSO;
}

//————-Legge tre byte di dati di pressione—————————-
u8 Leggi_Pressione_TreByte(u8 *pressione_H, u8 *pressione_M, u8 *pressione_L)
{
tampone u8[3];
risultato u8;

risultato = software_i2c_Read_nByte(0xDA, 0x06, 3, respingente); //

Se(risultato == SUCCESSO) {
*pressione_H = tampone[0]; //
*pressione_M = tampone[1]; //
*pressione_L = tampone[2]; //
restituire SUCCESSO;
} altro {
ritorno FALLITO;
}
}

vuoto principale()
{
Datisensore *p_sensor_data= &dati_sensore; //
p_sensor_data->pressione_k = 8192;

LCD1602_Calore(); //
LCD1602_show_string(3, 0, “Pressione”); //

Mentre(1)
{
Scrivi_Un_Byte(0x30, 0x0A); //indicare una conversione combinata
// Mentre ((Leggi_Un_Byte(0x30) & 0x08) > 0);
Ritardo_ms(10);

//
Se(Leggi_Pressione_TreByte(&p_sensor_data->pressione_H,
&p_sensor_data->pressione_M,
&p_sensor_data->pressione_L) == SUCCESSO)
{
//
p_sensor_data->pressione_AD = (non firmato lungo)((((non firmato lungo)p_sensor_data->pressione_H) << 16) |
(((intero senza segno)p_sensor_data->pressione_M) << 8) |
((carattere non firmato)p_sensor_data->pressione_L));

//
p_sensor_data->pressione = (p_sensor_data->pressione_AD > 8388608) ?
(raddoppiare)((p_sensor_data->pressione_AD – 16777216) / (raddoppiare)(p_sensor_data->pressione_k)) :
(raddoppiare)(p_sensor_data->pressione_AD / (raddoppiare)(p_sensor_data->pressione_k));

//
Se (is_zero_point_set)
{
punto_zero_pressione = p_dati_sensore->pressione; //
is_zero_point_set = 0; //
}

p_sensor_data->pressione -= punto_zero_pressione;

//
Se (p_sensor_data->pressione > 1000.0) {
//
p_sensor_data->pressione /= 1000.0;
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pressione, 2, ” kPa”);
} altro {
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pressione, 2, ” papà”);
}

LCD1602_show_string(3, 1, p_sensor_data->P_buffer);
}
altro
{
//
LCD1602_show_string(3, 1, “ERRORE LEGGERE”);
}

Ritardo_ms(200); //
}
}