IIC サンプルコード
#含む “IIC.h”
//————-遅延time_us——————————-
無効な遅延(u16 t)
{
その間 (t != 0)
t–;
}
/*void IIC_Start(空所) */
{
sda = 1;
scl = 1;
遅れ(delay_time);
sda = 0;
遅れ(delay_time);
scl = 0;
}
/* void IIC_Stop(空所) */
{
scl = 0;
sda = 0;
遅れ(delay_time);
scl = 1;
遅れ(delay_time);
sda = 1;
}
/*
unsigned char IIC_Wait_Ack(空所) */
{
u8 rec = 0;
遅れ(delay_time); //
sda = 1; //
scl = 1;
遅れ(delay_time);
rec = SDA;
scl = 0; //
遅れ(delay_time);
return rec;
}
/* void IIC_Ack(空所) */
{
scl = 0;
sda = 0;
遅れ(delay_time);
scl = 1;
遅れ(delay_time);
scl = 0;
遅れ(delay_time);
}
/* void IIC_NAck(空所) */
{
scl = 0;
sda = 1;
遅れ(delay_time);
scl = 1;
遅れ(delay_time);
scl = 0;
遅れ(delay_time);
}
/*
void IIC_Send_Byte(u8 txd) */
{
u8 i;
のために(i = 0; 私 < 8; I ++)
{
sda = (txd & 0x80) >> 7; //
txd <<= 1;
遅れ(delay_time);
scl = 1;
遅れ(delay_time);
scl = 0;
遅れ(delay_time);
}
}
/*
u8 IIC_Read_Byte(空所)*/
{
u8 i, rec = 0;
sda = 1; //
のために(i = 0; 私 < 8; I ++)
{
scl = 0;
遅れ(delay_time);
scl = 1;
rec <<= 1;
もし(SDA) rec |= 1; //
遅れ(delay_time);
}
return rec;
}
#含む “XGZP6897D.h”
//u8 temp_a5;
//————-データの1バイトを記述します,マスターから奴隷へのデータ ——————————
//————-スレーバーアドレスビット:01101101——————————-
void write_one_byte(u8 addr, u8 thedata) //書く “thedata” の奴隷の演説に “addr”
{
IIC_Start(); //iicスタート
IIC_Send_Byte(0XDA); //iic書き込み操作,SLAVER address
IIC_Wait_Ack();
IIC_Send_Byte(addr); /*住所*/
IIC_Wait_Ack();
IIC_Send_Byte(thedata); /*thedata*/
IIC_Wait_Ack();
IIC_停止(); //iic停止
}
//————-1バイトのデータをREAEDしました,SlaverからMasterへのデータ —————————-
u8 Read_One_Byte(u8 addr)
{
u8 mydata;
IIC_Start();
IIC_Send_Byte(0XDA);
IIC_Wait_Ack();
IIC_Send_Byte(addr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XDB); //iic読み取り操作
IIC_Wait_Ack();
mydata = IIC_Read_Byte();
IIC_NAck(); //
IIC_停止();
mydataを返します;
}
//
void XGZP_Start_Conversion()
{
write_one_byte(0X30, 0x0a); //併用変換を示します
その間 ((read_one_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_Start();
//
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();
//
のために (i = 0; 私 < len; I ++) {
IIC_Send_Byte(buf[私]);
もし (IIC_Wait_Ack() == FAILED) {
IIC_停止();
return FAILED;
}
}
//
IIC_停止();
return SUCCESS;
}
//————-Read n Bytes of Data—————————-
u8 software_i2c_Read_nByte(u8 SlaveAddress, u8 REG_Address, u8 len, u8 *buf)
{
//
IIC_Start();
//
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack();
//
IIC_Start();
//
IIC_Send_Byte(SlaveAddress + 1);
IIC_Wait_Ack();
//
その間 (len) {
//
*buf = IIC_Read_Byte();
//
もし (len == 1)
IIC_NAck();
//
それ以外
IIC_Ack();
//
buf++;
//
len–;
}
//
IIC_停止();
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); //
もし(result == SUCCESS) {
*pressure_H = buffer[0]; //
*pressure_M = buffer[1]; //
*pressure_L = buffer[2]; //
return SUCCESS;
} それ以外 {
return FAILED;
}
}
メインを無効にします()
{
SensorData *p_sensor_data = &sensor_data; //
p_sensor_data->pressure_k = 8192;
LCD1602_Init(); //
LCD1602_show_string(3, 0, “Pressure”); //
その間(1)
{
write_one_byte(0X30, 0x0a); //併用変換を示します
// その間 ((read_one_byte(0X30) & 0x08) > 0);
delay_ms(10);
//
もし(Read_Pressure_ThreeBytes(&p_sensor_data->pressure_H,
&p_sensor_data->pressure_M,
&p_sensor_data->pressure_L) == SUCCESS)
{
//
p_sensor_data->pressure_AD = (符号なしロング)((((符号なしロング)p_sensor_data->pressure_H) << 16) |
(((符号なし整数)p_sensor_data->pressure_M) << 8) |
((unsigned char)p_sensor_data->pressure_L));
//
p_sensor_data->圧力 = (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));
//
もし (is_zero_point_set)
{
zero_point_pressure = p_sensor_data->プレッシャー; //
is_zero_point_set = 0; //
}
p_sensor_data->pressure -= zero_point_pressure;
//
もし (p_sensor_data->プレッシャー > 1000.0) {
//
p_sensor_data->pressure /= 1000.0;
float_to_str(p_sensor_data->P_buffer, p_sensor_data->プレッシャー, 2, ” kPa”);
} それ以外 {
float_to_str(p_sensor_data->P_buffer, p_sensor_data->プレッシャー, 2, ” パ”);
}
LCD1602_show_string(3, 1, p_sensor_data->P_buffer);
}
それ以外
{
//
LCD1602_show_string(3, 1, “READ ERROR”);
}
delay_ms(200); //
}
}