Пример кода IIC
#включать “IIC.h”
//————-задержка time_us——————————-
недействительно ЗАДЕРЖКА(u16 т)
{
пока (т !"=" 0)
т–;
}
/*недействительный IIC_Start(пустота) */
{
ПДД = 1;
вероятность нежелательной почты = 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
ПДД = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 0;
}
/* аннулировать IIC_Stop(пустота) */
{
вероятность нежелательной почты = 0;
ПДД = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
ПДД = 1;
}
/*
беззнаковый символ IIC_Wait_Ack(пустота) */
{
u8 запись = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ); //
ПДД = 1; //
вероятность нежелательной почты = 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
запись = ПДД;
вероятность нежелательной почты = 0; //
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
возврат записи;
}
/* недействительный IIC_Ack(пустота) */
{
вероятность нежелательной почты = 0;
ПДД = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
}
/* недействительный IIC_NAck(пустота) */
{
вероятность нежелательной почты = 0;
ПДД = 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
}
/*
недействительный IIC_Send_Byte(u8 txd) */
{
ты8 я;
для(я = 0; я < 8; я++)
{
ПДД = (спасибо & 0х80) >> 7; //
спасибо <<"=" 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 1;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
}
}
/*
u8 IIC_Read_Byte(пустота)*/
{
ты8 я, запись = 0;
ПДД = 1; //
для(я = 0; я < 8; я++)
{
вероятность нежелательной почты = 0;
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
вероятность нежелательной почты = 1;
запись <<"=" 1;
если(ПДД) запись |"=" 1; //
ЗАДЕРЖИВАТЬ(ВРЕМЯ ЗАДЕРЖКИ);
}
возврат записи;
}
#включать “XGZP6897D.h”
//u8 temp_a5;
//————-записать один байт данных,Данные от ГЛАВНОГО к РАБОЧЕМУ ——————————
//————-Адресный бит SLAVER:01101101——————————-
недействительным Write_One_Byte(адрес u8, u8 данные) //Писать “данные” на адрес SLAVER “адрес”
{
IIC_Start(); //ИИК СТАРТ
IIC_Send_Byte(0xDA); //IIC операция записи,РАБОЧИЙ адрес
IIC_Wait_Ack();
IIC_Send_Byte(адрес); /*адрес*/
IIC_Wait_Ack();
IIC_Send_Byte(данные); /*данные*/
IIC_Wait_Ack();
IIC_Stop(); //IIC СТОП
}
//————-Прочитан один байт данных,Данные от SLAVER к MASTER —————————-
u8 Чтение_один_байт(адрес u8)
{
u8 мои данные;
IIC_Start();
IIC_Send_Byte(0xDA);
IIC_Wait_Ack();
IIC_Send_Byte(адрес);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0xDB); //Операция чтения IIC
IIC_Wait_Ack();
моиданные = IIC_Read_Byte();
IIC_NAck(); //
IIC_Stop();
вернуть мои данные;
}
//
недействительный XGZP_Start_Conversion()
{
Write_One_Byte(0х30, 0х0А); //указать комбинированное преобразование
пока ((Read_One_Byte(0х30) & 0х08) > 0);
}
//————-Записать n байт данных—————————-
u8 Software_i2c_Write_nByte(u8 Адрес подчиненного устройства, u8 REG_Адрес, только u8, u8 *буф)
{
интервал я;
//
IIC_Start();
//
IIC_Send_Byte(Адрес раба);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Адрес);
IIC_Wait_Ack();
//
для (я = 0; я < Лен; я++) {
IIC_Send_Byte(буф[я]);
если (IIC_Wait_Ack() == НЕ ПРОШЛО) {
IIC_Stop();
возврат НЕ ПРОЙДЕН;
}
}
//
IIC_Stop();
вернуть УСПЕХ;
}
//————-Чтение n байт данных—————————-
u8 Software_i2c_Read_nByte(u8 Адрес подчиненного устройства, u8 REG_Адрес, только u8, u8 *буф)
{
//
IIC_Start();
//
IIC_Send_Byte(Адрес раба);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Адрес);
IIC_Wait_Ack();
//
IIC_Start();
//
IIC_Send_Byte(Адрес раба + 1);
IIC_Wait_Ack();
//
пока (Лен) {
//
*буф = IIC_Read_Byte();
//
если (Лен == 1)
IIC_NAck();
//
еще
IIC_Ack();
//
буф++;
//
Лен–;
}
//
IIC_Stop();
вернуть УСПЕХ;
}
//————-Чтение трех байтов данных о давлении—————————-
u8 Read_Pressure_ThreeBytes(u8 *pressure_H, u8 *pressure_M, u8 *pressure_L)
{
буфер u8[3];
результат u8;
результат = Software_i2c_Read_nByte(0xDA, 0х06, 3, буфер); //
если(результат == УСПЕХ) {
*давление_H = буфер[0]; //
*давление_M = буфер[1]; //
*давление_L = буфер[2]; //
вернуть УСПЕХ;
} еще {
возврат НЕ ПРОЙДЕН;
}
}
пустая функция()
{
Данные датчика *p_sensor_data = &датчик_данных; //
p_sensor_data->давление_к = 8192;
LCD1602_Тепло(); //
LCD1602_show_string(3, 0, “Давление”); //
пока(1)
{
Write_One_Byte(0х30, 0х0А); //указать комбинированное преобразование
// пока ((Read_One_Byte(0х30) & 0х08) > 0);
Задержка_мс(10);
//
если(Read_Pressure_ThreeBytes(&p_sensor_data->давление_H,
&p_sensor_data->давление_М,
&p_sensor_data->давление_L) == УСПЕХ)
{
//
p_sensor_data->давление_AD = (беззнаковый длинный)((((беззнаковый длинный)p_sensor_data->давление_H) << 16) |
(((беззнаковое целое число)p_sensor_data->давление_М) << 8) |
((беззнаковый символ)p_sensor_data->давление_L));
//
p_sensor_data->давление = (p_sensor_data->давление_AD > 8388608) ?
(двойной)((p_sensor_data->давление_AD – 16777216) / (двойной)(p_sensor_data->давление_к)) :
(двойной)(p_sensor_data->давление_AD / (двойной)(p_sensor_data->давление_к));
//
если (is_zero_point_set)
{
нулевая_точка_давления = p_sensor_data->давление; //
is_zero_point_set = 0; //
}
p_sensor_data->давление -= нулевая_точка_давления;
//
если (p_sensor_data->давление > 1000.0) {
//
p_sensor_data->давление /= 1000.0;
float_to_str(p_sensor_data->P_буфер, p_sensor_data->давление, 2, ” кПа”);
} еще {
float_to_str(p_sensor_data->P_буфер, p_sensor_data->давление, 2, ” Па”);
}
LCD1602_show_string(3, 1, p_sensor_data->P_буфер);
}
еще
{
//
LCD1602_show_string(3, 1, “ОШИБКА ЧТЕНИЯ”);
}
Задержка_мс(200); //
}
}