Código de muestra de la CII
#incluir “IIC.h”
//————-tiempo de retraso_us——————————-
anular DEMORA(u16t)
{
mientras (t != 0)
t–;
}
/*anular IIC_Start(vacío) */
{
ASD = 1;
SCL = 1;
DEMORA(DELAY_TIME);
ASD = 0;
DEMORA(DELAY_TIME);
SCL = 0;
}
/* anular IIC_Stop(vacío) */
{
SCL = 0;
ASD = 0;
DEMORA(DELAY_TIME);
SCL = 1;
DEMORA(DELAY_TIME);
ASD = 1;
}
/*
carácter sin firmar IIC_Wait_Ack(vacío) */
{
u8 rec = 0;
DEMORA(DELAY_TIME); //
ASD = 1; //
SCL = 1;
DEMORA(DELAY_TIME);
rec = SDA;
SCL = 0; //
DEMORA(DELAY_TIME);
volver rec;
}
/* anular IIC_Ack(vacío) */
{
SCL = 0;
ASD = 0;
DEMORA(DELAY_TIME);
SCL = 1;
DEMORA(DELAY_TIME);
SCL = 0;
DEMORA(DELAY_TIME);
}
/* anular IIC_NAck(vacío) */
{
SCL = 0;
ASD = 1;
DEMORA(DELAY_TIME);
SCL = 1;
DEMORA(DELAY_TIME);
SCL = 0;
DEMORA(DELAY_TIME);
}
/*
anular IIC_Send_Byte(u8 txd) */
{
u8 yo;
para(yo = 0; i < 8; yo ++)
{
ASD = (txd & 0x80) >> 7; //
txd <<= 1;
DEMORA(DELAY_TIME);
SCL = 1;
DEMORA(DELAY_TIME);
SCL = 0;
DEMORA(DELAY_TIME);
}
}
/*
u8 IIC_Read_Byte(vacío)*/
{
u8 yo, rec = 0;
ASD = 1; //
para(yo = 0; i < 8; yo ++)
{
SCL = 0;
DEMORA(DELAY_TIME);
SCL = 1;
rec <<= 1;
si(ASD) rec |= 1; //
DEMORA(DELAY_TIME);
}
volver rec;
}
#incluir “XGZP6897D.h”
//u8 temp_a5;
//————-escribir un byte de datos,Datos del MAESTRO al ESCLAVADOR ——————————
//————-Bit de dirección SLAVER:01101101——————————-
anular Write_One_Byte(dirección u8, u8 los datos) //Escribir “los datos” a la dirección del ESCLAVADOR de “dirección”
{
IIC_Inicio(); //INICIO DE LA CII
IIC_Enviar_Byte(0xDA); //Operación de ESCRITURA IIC,dirección de SLAVER
IIC_Espera_Ack();
IIC_Enviar_Byte(dirección); /*DIRECCIÓN*/
IIC_Espera_Ack();
IIC_Enviar_Byte(los datos); /*los datos*/
IIC_Espera_Ack();
IIC_Detener(); //PARADA DE LA CII
}
//————-Leer un byte de datos,Datos del ESCLAVADOR al MAESTRO —————————-
u8 Lectura_Un_Byte(dirección u8)
{
u8 mis datos;
IIC_Inicio();
IIC_Enviar_Byte(0xDA);
IIC_Espera_Ack();
IIC_Enviar_Byte(dirección);
IIC_Espera_Ack();
IIC_Inicio();
IIC_Enviar_Byte(0xDB); //Operación de lectura de la CII
IIC_Espera_Ack();
misdatos = IIC_Read_Byte();
IIC_NAck(); //
IIC_Detener();
devolver mis datos;
}
//
anular XGZP_Start_Conversion()
{
Escritura_Un_Byte(0x30, 0x0A); //indicar una conversión combinada
mientras ((Lectura_un_byte(0x30) & 0x08) > 0);
}
//————-Escribir n bytes de datos—————————-
u8 software_i2c_Write_nByte(Dirección de esclavo u8, u8 REG_Dirección, solo u8, u8 *buf)
{
ent yo;
//
IIC_Inicio();
//
IIC_Enviar_Byte(Dirección de esclavo);
IIC_Espera_Ack();
//
IIC_Enviar_Byte(REG_Dirección);
IIC_Espera_Ack();
//
para (yo = 0; i < len; yo ++) {
IIC_Enviar_Byte(buf[i]);
si (IIC_Espera_Ack() == FALLÓ) {
IIC_Detener();
retorno FALLADO;
}
}
//
IIC_Detener();
regresar ÉXITO;
}
//————-Leer n bytes de datos—————————-
u8 software_i2c_Read_nByte(Dirección de esclavo u8, u8 REG_Dirección, solo u8, u8 *buf)
{
//
IIC_Inicio();
//
IIC_Enviar_Byte(Dirección de esclavo);
IIC_Espera_Ack();
//
IIC_Enviar_Byte(REG_Dirección);
IIC_Espera_Ack();
//
IIC_Inicio();
//
IIC_Enviar_Byte(Dirección de esclavo + 1);
IIC_Espera_Ack();
//
mientras (len) {
//
*buf=IIC_Read_Byte();
//
si (len == 1)
IIC_NAck();
//
demás
IIC_Ack();
//
buf++;
//
len–;
}
//
IIC_Detener();
regresar ÉXITO;
}
//————-Leer tres bytes de datos de presión—————————-
u8 Lectura_Presión_TresBytes(u8 *presión_H, u8 *presión_M, u8 *presión_L)
{
búfer u8[3];
resultado u8;
resultado = software_i2c_Read_nByte(0xDA, 0x06, 3, buffer); //
si(resultado == ÉXITO) {
*presión_H = buffer[0]; //
*presión_M = buffer[1]; //
*presión_L = buffer[2]; //
regresar ÉXITO;
} demás {
retorno FALLADO;
}
}
vacío principal()
{
Datos del sensor *p_sensor_data = &datos_sensores; //
p_sensor_data->presión_k = 8192;
LCD1602_Calor(); //
LCD1602_show_string(3, 0, “Presión”); //
mientras(1)
{
Escritura_Un_Byte(0x30, 0x0A); //indicar una conversión combinada
// mientras ((Lectura_un_byte(0x30) & 0x08) > 0);
retraso_ms(10);
//
si(Lectura_Presión_TresBytes(&p_sensor_data->presión_H,
&p_sensor_data->presión_M,
&p_sensor_data->presión_L) == ÉXITO)
{
//
p_sensor_data->presión_AD = (largo sin firmar)((((largo sin firmar)p_sensor_data->presión_H) << 16) |
(((entero sin firmar)p_sensor_data->presión_M) << 8) |
((carácter sin firmar)p_sensor_data->presión_L));
//
p_sensor_data->presión = (p_sensor_data->presión_AD > 8388608) ?
(doble)((p_sensor_data->presión_AD – 16777216) / (doble)(p_sensor_data->presión_k)) :
(doble)(p_sensor_data->presión_AD / (doble)(p_sensor_data->presión_k));
//
si (is_zero_point_set)
{
presión_punto_cero = p_sensor_data->presión; //
is_zero_point_set = 0; //
}
p_sensor_data->presión -= presión_punto_cero;
//
si (p_sensor_data->presión > 1000.0) {
//
p_sensor_data->presión /= 1000.0;
flotador_a_cadena(p_sensor_data->P_buffer, p_sensor_data->presión, 2, ” kPa”);
} demás {
flotador_a_cadena(p_sensor_data->P_buffer, p_sensor_data->presión, 2, ” Pensilvania”);
}
LCD1602_show_string(3, 1, p_sensor_data->P_buffer);
}
demás
{
//
LCD1602_show_string(3, 1, “LEER ERROR”);
}
retraso_ms(200); //
}
}