Vzorčna koda IIC
#vključiti “IIC.h”
//————-čas zakasnitve_us——————————-
neveljaven DELAY(u16 t)
{
medtem ko (t != 0)
t–;
}
/*void IIC_Start(praznina) */
{
SDA = 1;
SCL = 1;
ZAMUDA(DELAY_TIME);
SDA = 0;
ZAMUDA(DELAY_TIME);
SCL = 0;
}
/* void IIC_Stop(praznina) */
{
SCL = 0;
SDA = 0;
ZAMUDA(DELAY_TIME);
SCL = 1;
ZAMUDA(DELAY_TIME);
SDA = 1;
}
/*
nepodpisani znak IIC_Wait_Ack(praznina) */
{
u8 rec = 0;
ZAMUDA(DELAY_TIME); //
SDA = 1; //
SCL = 1;
ZAMUDA(DELAY_TIME);
rec = SDA;
SCL = 0; //
ZAMUDA(DELAY_TIME);
vrni zap;
}
/* neveljaven IIC_Ack(praznina) */
{
SCL = 0;
SDA = 0;
ZAMUDA(DELAY_TIME);
SCL = 1;
ZAMUDA(DELAY_TIME);
SCL = 0;
ZAMUDA(DELAY_TIME);
}
/* neveljaven IIC_NAck(praznina) */
{
SCL = 0;
SDA = 1;
ZAMUDA(DELAY_TIME);
SCL = 1;
ZAMUDA(DELAY_TIME);
SCL = 0;
ZAMUDA(DELAY_TIME);
}
/*
void IIC_Send_Byte(u8 txd) */
{
u8 i;
za(jaz = 0; i < 8; i++)
{
SDA = (txd & 0x80) >> 7; //
txd <<= 1;
ZAMUDA(DELAY_TIME);
SCL = 1;
ZAMUDA(DELAY_TIME);
SCL = 0;
ZAMUDA(DELAY_TIME);
}
}
/*
u8 IIC_Read_Byte(praznina)*/
{
u8 i, rec = 0;
SDA = 1; //
za(jaz = 0; i < 8; i++)
{
SCL = 0;
ZAMUDA(DELAY_TIME);
SCL = 1;
rec <<= 1;
če(SDA) rec |= 1; //
ZAMUDA(DELAY_TIME);
}
vrni zap;
}
#vključiti “XGZP6897D.h”
//u8 temp_a5;
//————-napišite en bajt podatkov,Podatki od MASTER do SLAVER ——————————
//————-Bit naslova SLAVER:01101101——————————-
void Write_One_Byte(u8 naslov, u8 podatki) //Pišite “podatki” na SLAVERjev naslov “naslov”
{
IIC_Začetek(); //IIC START
IIC_Send_Byte(0xDA); //Operacija IIC WRITE,naslov SLAVER
IIC_Wait_Ack();
IIC_Send_Byte(naslov); /*naslov*/
IIC_Wait_Ack();
IIC_Send_Byte(podatki); /*podatki*/
IIC_Wait_Ack();
IIC_Stop(); //IIC STOP
}
//————-Prebral en bajt podatkov,Podatki od SLAVER do MASTER —————————-
u8 Preberi en bajt(u8 naslov)
{
u8 moji podatki;
IIC_Začetek();
IIC_Send_Byte(0xDA);
IIC_Wait_Ack();
IIC_Send_Byte(naslov);
IIC_Wait_Ack();
IIC_Začetek();
IIC_Send_Byte(0xDB); //Operacija IIC READ
IIC_Wait_Ack();
mydata = IIC_Read_Byte();
IIC_NAck(); //
IIC_Stop();
vrni moje podatke;
}
//
void XGZP_Start_Conversion()
{
Write_One_Byte(0x30, 0x0A); //označuje kombinirano pretvorbo
medtem ko ((Read_One_Byte(0x30) & 0x08) > 0);
}
//————-Zapišite n bajtov podatkov—————————-
u8 software_i2c_Write_nByte(u8 SlaveAddress, u8 REG_naslov, samo u8, u8 *buf)
{
int i;
//
IIC_Začetek();
//
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();
//
za (jaz = 0; i < len; i++) {
IIC_Send_Byte(buf[i]);
če (IIC_Wait_Ack() == NEUSPEŠNO) {
IIC_Stop();
vrnitev NI USPELA;
}
}
//
IIC_Stop();
vrni USPEH;
}
//————-Preberite n bajtov podatkov—————————-
u8 software_i2c_Read_nByte(u8 SlaveAddress, u8 REG_naslov, samo u8, u8 *buf)
{
//
IIC_Začetek();
//
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();
//
IIC_Začetek();
//
IIC_Send_Byte(SlaveAddress + 1);
IIC_Wait_Ack();
//
medtem ko (len) {
//
*buf = IIC_Read_Byte();
//
če (len == 1)
IIC_NAck();
//
drugače
IIC_Ack();
//
buf++;
//
len–;
}
//
IIC_Stop();
vrni USPEH;
}
//————-Preberite tri bajte podatkov o tlaku—————————-
u8 Read_Pressure_ThreeBytes(u8 *tlak_H, u8 *tlak_M, u8 *tlak_L)
{
u8 medpomnilnik[3];
rezultat u8;
rezultat = software_i2c_Read_nByte(0xDA, 0x06, 3, medpomnilnik); //
če(rezultat == USPEH) {
*tlak_H = pufer[0]; //
*tlak_M = pufer[1]; //
*tlak_L = pufer[2]; //
vrni USPEH;
} drugače {
vrnitev NI USPELA;
}
}
void main()
{
SensorData *p_sensor_data = &senzor_podatki; //
p_sensor_data->tlak_k = 8192;
LCD1602_Toplota(); //
LCD1602_prikaži_niz(3, 0, “Pritisk”); //
medtem ko(1)
{
Write_One_Byte(0x30, 0x0A); //označuje kombinirano pretvorbo
// medtem ko ((Read_One_Byte(0x30) & 0x08) > 0);
Delay_ms(10);
//
če(Read_Pressure_ThreeBytes(&p_sensor_data->tlak_H,
&p_sensor_data->tlak_M,
&p_sensor_data->tlak_L) == USPEH)
{
//
p_sensor_data->tlak_AD = (nepodpisano dolgo)((((nepodpisano dolgo)p_sensor_data->tlak_H) << 16) |
(((nepodpisano int)p_sensor_data->tlak_M) << 8) |
((nepredpisan znak)p_sensor_data->tlak_L));
//
p_sensor_data->tlak = (p_sensor_data->tlak_AD > 8388608) ?
(dvojno)((p_sensor_data->tlak_AD – 16777216) / (dvojno)(p_sensor_data->tlak_k)) :
(dvojno)(p_sensor_data->tlak_AD / (dvojno)(p_sensor_data->tlak_k));
//
če (je_ničelna_točka_nastavljena)
{
tlak_ničelne_točke = p_podatki_senzorja->pritisk; //
is_zero_point_set = 0; //
}
p_sensor_data->tlak -= tlak_ničelne_točke;
//
če (p_sensor_data->pritisk > 1000.0) {
//
p_sensor_data->tlak /= 1000.0;
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pritisk, 2, ” kPa”);
} drugače {
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pritisk, 2, ” oče”);
}
LCD1602_prikaži_niz(3, 1, p_sensor_data->P_buffer);
}
drugače
{
//
LCD1602_prikaži_niz(3, 1, “NAPAKA BRANJA”);
}
Delay_ms(200); //
}
}