Código de amostra IIC
#incluir “IIC.h”
//————-atraso time_us——————————-
anular ATRASO(u16t)
{
enquanto (t != 0)
t–;
}
/*nulo IIC_Start(vazio) */
{
SDA = 1;
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SDA = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 0;
}
/* nulo IIC_Stop(vazio) */
{
SCL = 0;
SDA = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SDA = 1;
}
/*
caractere não assinado 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);
retornar recomendação;
}
/* anular IIC_Ack(vazio) */
{
SCL = 0;
SDA = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SCL = 0;
ATRASO(TEMPO DE ATRASO);
}
/* vazio IIC_NAck(vazio) */
{
SCL = 0;
SDA = 1;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
ATRASO(TEMPO DE ATRASO);
SCL = 0;
ATRASO(TEMPO DE ATRASO);
}
/*
vazio IIC_Send_Byte(u8 txd) */
{
u8 eu;
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 eu, rec = 0;
SDA = 1; //
para(eu = 0; eu < 8; eu++)
{
SCL = 0;
ATRASO(TEMPO DE ATRASO);
SCL = 1;
rec <<= 1;
se(IASD) rec |= 1; //
ATRASO(TEMPO DE ATRASO);
}
retornar recomendação;
}
#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(endereço u8, u8 os dados) //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,Endereço ESCRAVO
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(endereço u8)
{
u8 meus dados;
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;
}
//
vazio XGZP_Start_Conversion()
{
Write_One_Byte(0x30, 0x0A); //indicar uma conversão combinada
enquanto ((Leitura_Um_Byte(0x30) & 0x08) > 0);
}
//————-Escreva n bytes de dados—————————-
u8 software_i2c_Write_nByte(u8 SlaveAddress, u8 REG_Address, apenas u8, u8 *buf)
{
int eu;
//
IIC_Início();
//
IIC_Send_Byte(Endereço Escravo);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();
//
para (eu = 0; eu < lento; eu++) {
IIC_Send_Byte(bufante[eu]);
se (IIC_Wait_Ack() == FALHA) {
IIC_Stop();
retornar FALHA;
}
}
//
IIC_Stop();
retornar SUCESSO;
}
//————-Leia n bytes de dados—————————-
u8 software_i2c_Read_nByte(u8 SlaveAddress, u8 REG_Address, apenas u8, u8 *buf)
{
//
IIC_Início();
//
IIC_Send_Byte(Endereço Escravo);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();
//
IIC_Início();
//
IIC_Send_Byte(Endereço Escravo + 1);
IIC_Wait_Ack();
//
enquanto (lento) {
//
*buf = IIC_Read_Byte();
//
se (le == 1)
IIC_NAck();
//
outro
IIC_Ack();
//
buf++;
//
lento–;
}
//
IIC_Stop();
retornar SUCESSO;
}
//————-Leia três bytes de dados de pressão—————————-
u8 Read_Pressure_ThreeBytes(u8 *pressão_H, u8 *pressão_M, u8 *pressão_L)
{
buffer u8[3];
resultado u8;
resultado = software_i2c_Read_nByte(0xDA, 0x06, 3, buffer); //
se(resultado == SUCESSO) {
*pressão_H = buffer[0]; //
*pressão_M = buffer[1]; //
*pressão_L = buffer[2]; //
retornar SUCESSO;
} outro {
retornar FALHA;
}
}
vazio principal()
{
SensorData *p_sensor_data = &dados_do_sensor; //
p_sensor_data->pressão_k = 8192;
LCD1602_Calor(); //
LCD1602_show_string(3, 0, “Pressão”); //
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->pressão_H,
&p_sensor_data->pressão_M,
&p_sensor_data->pressão_L) == SUCESSO)
{
//
p_sensor_data->pressão_AD = (não assinado longo)((((não assinado longo)p_sensor_data->pressão_H) << 16) |
(((int não assinado)p_sensor_data->pressão_M) << 8) |
((caractere não assinado)p_sensor_data->pressão_L));
//
p_sensor_data->pressão = (p_sensor_data->pressão_AD > 8388608) ?
(dobro)((p_sensor_data->pressão_AD – 16777216) / (dobro)(p_sensor_data->pressão_k)) :
(dobro)(p_sensor_data->pressão_AD / (dobro)(p_sensor_data->pressão_k));
//
se (is_zero_point_set)
{
pressão_ponto_zero = p_sensor_data->pressão; //
is_zero_point_set = 0; //
}
p_sensor_data->pressão -= pressão_ponto_zero;
//
se (p_sensor_data->pressão > 1000.0) {
//
p_sensor_data->pressão /= 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, “ERRO DE LEITURA”);
}
Atraso_ms(200); //
}
}