Código de amostra IIC

#incluir “IIC.h

//————-atraso time_us——————————-
anular ATRASO(u16 t)
{
enquanto (t != 0)
t–;
}

/*void IIC_Start(vazio) */
{
SDA = 1;
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SDA = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 0;
}

/* void IIC_Stop(vazio) */
{
SCL = 0;
SDA = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SDA = 1;
}

/*
unsigned char IIC_Wait_Ack(vazio) */
{
u8 rec = 0;

ATRASO(TEMPO DE ATRASO); //
SDA = 1; //
SCL = 1;
ATRASO(TEMPO DE ATRASO);
rec = SDA;
SCL = 0; //
ATRASO(TEMPO DE ATRASO);

return rec;
}

/* void IIC_Ack(vazio) */
{
SCL = 0;
SDA = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SCL = 0;
ATRASO(TEMPO DE ATRASO);
}

/* void IIC_NAck(vazio) */
{
SCL = 0;
SDA = 1;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SCL = 0;
ATRASO(TEMPO DE ATRASO);
}


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

para(eu = 0; eu < 8; eu++)
{
SDA = (txd & 0x80) >> 7; //
txd <<= 1;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SCL = 0;
ATRASO(TEMPO DE ATRASO);
}
}

/*
u8 IIC_Read_Byte(vazio)*/
{
u8 i, rec = 0;

SDA = 1; //
para(eu = 0; eu < 8; eu++)
{
SCL = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
rec <<= 1;
se(SDA) rec |= 1; //
ATRASO(TEMPO DE ATRASO);
}

return rec;
}
#incluir “XGZP6897D.h

//u8 temp_a5;

//————-escreva um byte de dados,Dados do MASTER para o SLAVER ——————————

//————-Bit de endereço SLAVER:01101101——————————-
vazio Write_One_Byte(u8 addr, u8 thedata) //Escrever “os dados” para o endereço do SLAVER de “endereço”

{
IIC_Início(); //INÍCIO DA CII
IIC_Send_Byte(0xDA); //Operação IIC WRITE,SLAVER address

IIC_Wait_Ack();
IIC_Send_Byte(endereço); /*endereço*/
IIC_Wait_Ack();
IIC_Send_Byte(os dados); /*os dados*/
IIC_Wait_Ack();
IIC_Stop(); //PARADA DA CII
}


//————-Reaed um byte de dados,Dados do SLAVER para o MASTER —————————-
u8 Read_One_Byte(u8 addr)
{
u8 mydata;
IIC_Início();
IIC_Send_Byte(0xDA);
IIC_Wait_Ack();
IIC_Send_Byte(endereço);
IIC_Wait_Ack();
IIC_Início();
IIC_Send_Byte(0xDB); //Operação IIC READ
IIC_Wait_Ack();
meus dados = IIC_Read_Byte();
IIC_NAck(); //
IIC_Stop();
retornar meus dados;
}


//
void XGZP_Start_Conversion()
{

Write_One_Byte(0x30, 0x0A); //indicar uma conversão combinada
enquanto ((Leitura_Um_Byte(0x30) & 0x08) > 0);

}

//————-Write n Bytes of Data—————————-
u8 software_i2c_Write_nByte(u8 SlaveAddress, u8 REG_Address, u8 len, u8 *buf)
{
int i;

//
IIC_Início();

//
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();

//
para (eu = 0; eu < len; eu++) {
IIC_Send_Byte(buf[eu]);
se (IIC_Wait_Ack() == FAILED) {
IIC_Stop();
return FAILED;
}
}

//
IIC_Stop();
return SUCCESS;
}

//————-Read n Bytes of Data—————————-
u8 software_i2c_Read_nByte(u8 SlaveAddress, u8 REG_Address, u8 len, u8 *buf)
{
//
IIC_Início();

//
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();

//
IIC_Início();

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

//
enquanto (len) {
//
*buf = IIC_Read_Byte();
//
se (len == 1)
IIC_NAck();
//
outro
IIC_Ack();
//
buf++;
//
len–;
}

//
IIC_Stop();

return SUCCESS;
}

//————-Read Three Bytes of Pressure Data—————————-
u8 Read_Pressure_ThreeBytes(u8 *pressure_H, u8 *pressure_M, u8 *pressure_L)
{
u8 buffer[3];
u8 result;

result = software_i2c_Read_nByte(0xDA, 0x06, 3, buffer); //

se(result == SUCCESS) {
*pressure_H = buffer[0]; //
*pressure_M = buffer[1]; //
*pressure_L = buffer[2]; //
return SUCCESS;
} outro {
return FAILED;
}
}

vazio principal()
{
SensorData *p_sensor_data = &sensor_data; //
p_sensor_data->pressure_k = 8192;

LCD1602_Init(); //
LCD1602_show_string(3, 0, “Pressure”); //

enquanto(1)
{
Write_One_Byte(0x30, 0x0A); //indicar uma conversão combinada
// enquanto ((Leitura_Um_Byte(0x30) & 0x08) > 0);
Atraso_ms(10);

//
se(Read_Pressure_ThreeBytes(&p_sensor_data->pressure_H,
&p_sensor_data->pressure_M,
&p_sensor_data->pressure_L) == SUCCESS)
{
//
p_sensor_data->pressure_AD = (não assinado longo)((((não assinado longo)p_sensor_data->pressure_H) << 16) |
(((int não assinado)p_sensor_data->pressure_M) << 8) |
((unsigned char)p_sensor_data->pressure_L));

//
p_sensor_data->pressão = (p_sensor_data->pressure_AD > 8388608) ?
(double)((p_sensor_data->pressure_AD – 16777216) / (double)(p_sensor_data->pressure_k)) :
(double)(p_sensor_data->pressure_AD / (double)(p_sensor_data->pressure_k));

//
se (is_zero_point_set)
{
zero_point_pressure = p_sensor_data->pressão; //
is_zero_point_set = 0; //
}

p_sensor_data->pressure -= zero_point_pressure;

//
se (p_sensor_data->pressão > 1000.0) {
//
p_sensor_data->pressure /= 1000.0;
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pressão, 2, ” kPa”);
} outro {
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pressão, 2, ” Pai”);
}

LCD1602_show_string(3, 1, p_sensor_data->P_buffer);
}
outro
{
//
LCD1602_show_string(3, 1, “READ ERROR”);
}

Atraso_ms(200); //
}
}