IIC Sample Code
#include <reg52.h>
#include <math.h>
#define DELAY_TIME 600
#define TRUE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
//————–define IIC SCL,SDA port——————————
sbit SCL = P1 ^ 7;
sbit SDA = P1 ^ 6;
//—————–define Max7219 port—————————
sbit Max7219_pinCLK = P2 ^ 2;
sbit Max7219_pinCS = P2 ^ 1;
sbit Max7219_pinDIN = P2 ^ 0;
//————-delay time_us——————————-
void DELAY(uint t)
{
while (t != 0)
t–;
}
//————-IIC START CONDITION——————————-
void I2C_Start(void)
{
SDA = 1; //SDA output high
DELAY(DELAY_TIME);
SCL = 1;
DELAY(DELAY_TIME); //SCL output high
SDA = 0;
DELAY(DELAY_TIME);
SCL = 0;
DELAY(DELAY_TIME);
}
//————-IIC STOP CONDITION——————————-
void I2C_Stop(void)
{
SDA = 0; //SDA OUTPUT LOW
DELAY(DELAY_TIME);
SCL = 1;
DELAY(DELAY_TIME);
SDA = 1;
DELAY(DELAY_TIME);
SCL = 0; //SCL OUTPUT LOW
DELAY(DELAY_TIME);
}
//————-IIC SEND DATA “0”——————————-
void SEND_0(void)
{
SDA = 0;
DELAY(DELAY_TIME);
SCL = 1;
DELAY(DELAY_TIME);
SCL = 0;
DELAY(DELAY_TIME);
}
//————-IIC SEND DATA “1”——————————-
void SEND_1(void)
{
SDA = 1;
DELAY(DELAY_TIME);
SCL = 1;
DELAY(DELAY_TIME);
SCL = 0;
DELAY(DELAY_TIME);
}
//————-Check SLAVE’s Acknowledge ——————————-
bit Check_Acknowledge(void)
{
SDA = 1;
DELAY(DELAY_TIME);
SCL = 1;
DELAY(DELAY_TIME / 2);
F0 = SDA;
DELAY(DELAY_TIME / 2);
SCL = 0;
DELAY(DELAY_TIME);
if (F0 == 1)
return FALSE;
return TRUE;
}
//————-Write One Byte of Data ——————————-
void WriteI2CByte(uchar b) reentrant
{
char i;
for (i = 0; i < 8; i++)
if ((b << i) & 0x80)
SEND_1();
else
SEND_0();
}
//————-Read One Byte of Data ——————————-
uchar ReadI2CByte(void) reentrant
{
char b = 0, i;
for (i = 0; i < 8; i++)
{
SDA = 1;
DELAY(DELAY_TIME);
SCL = 1;
DELAY(DELAY_TIME);
//DELAY(10);
F0 = SDA;
DELAY(DELAY_TIME);
//DELAY(10);
SCL = 0;
if (F0 == 1)
{
b = b << 1;
b = b | 0x01;
}
else
b = b << 1;
}
return b;
}
//————-write One Byte of Data,Data from MASTER to the SLAVER ——————————-
//————-SLAVER address bit:01101101——————————-
void Write_One_Byte(uchar addr, uchar thedata) //Write “thedata” to the SLAVER’s address of “addr”
{
bit acktemp = 1;
I2C_Start(); //IIC START
WriteI2CByte(0xDA); //IIC WRITE operation,SLAVER address bit:01101010
acktemp = Check_Acknowledge(); //check the SLAVER
WriteI2CByte(addr); /*address*/
acktemp = Check_Acknowledge();
WriteI2CByte(thedata); /*thedata*/
acktemp = Check_Acknowledge();
I2C_Stop(); //IIC STOP
}
//————-Reaed One Byte of Data,Data from SLAVER to the MASTER ——————————-
uchar Read_One_Byte(uchar addr)
{
bit acktemp = 1;
uchar mydata;
I2C_Start();
WriteI2CByte(0xDA);
acktemp = Check_Acknowledge();
WriteI2CByte(addr);
acktemp = Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xDB); //IIC READ operation
acktemp = Check_Acknowledge();
mydata = ReadI2CByte();
acktemp = Check_Acknowledge();
I2C_Stop();
return mydata;
}
//————-Delay_ms ——————————-
void Delay_xms(uint x)
{
uint i, j;
for (i = 0; i < x; i++)
for (j = 0; j < 112; j++)
;
}
//————-Write One Byte to the Max7219————-
void Write_Max7219_byte(uchar DATA)
{
uchar i;
Max7219_pinCS = 0; //CS low effect
for (i = 8; i >= 1; i–)
{
Max7219_pinCLK = 0;
Max7219_pinDIN = DATA & 0x80;
DATA = DATA << 1;
Max7219_pinCLK = 1; //when pinCLK is high send the Data
}
}
//————-decide which address shows the Data————-
void Write_Max7219(uchar address,uchar dat)
{
Max7219_pinCS = 0;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
Max7219_pinCS = 1;
}
//————-MAX_7219 Initialization————-
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff); //Decoded mode:BCD code
Write_Max7219(0x0a, 0x03); //Brightness
Write_Max7219(0x0b, 0x07); //Scan limit:8 digital display
Write_Max7219(0x0c, 0x01); //Power-Down modes :0,Normal code:1
Write_Max7219(0x0f, 0x01); //Display test:1;Test end,normal display:0
}
void main(void)
{
uchar yali1, yali2, yali3,wendu1,wendu2;
uchar temp_a5;
long int ad,temp;
long float pas;
uchar dis[8];
Init_MAX7219();
Delay_xms(1000);
Write_Max7219(0x0f, 0x00);
while (1)
{
temp_a5 = Read_One_Byte(0xA5);//Read ASIC Sys_config
temp_a5 = temp_a5 & 0xFD; //(Raw_data_on: 0: output calibrated data,namly the value in 0x06-0x0a)
Write_One_Byte(0xA5, temp_a5); //Set ADC output calibrated Data
Write_One_Byte(0x30, 0x0A); //indicate a combined conversion (once temperature conversion immediately followed by once sensor signal conversion)(wire measure order in 0x30,000:single temp. measure;001:single pressure. measure;010:combination:single pressure and temp. measurement;011:sleep mode(combined mode measurement at certain time intervals))
while ((Read_One_Byte(0x30) & 0x08) > 0); //Judge whether Data collection is over
// ————-READ ADC output Data of Pressure ————-
yali1 = Read_One_Byte(0x06);
yali2 = Read_One_Byte(0x07);
yali3 = Read_One_Byte(0x08);
ad = yali1 * 65536 + yali2 * 256 + yali3;
// ————-READ ADC output Data of Temperature ————-
wendu1= Read_One_Byte(0x09);
wendu2= Read_One_Byte(0x0a);
temp=wendu1*256+wendu2;
/*Conversion, the following is the conversion formula of 100*/
if (ad > 8388608) // >8388606 as negative value, handle at display end
{
pas = (ad – 16777216)/64/1000; //unit is kpa
}
else
{
pas = ad/64/1000; //unit is kpa
}
if (pas < 0)
pas = fabs(pas);
/*Display program with Max7219*/
dis[0] = (long int)pas / 10000000;
dis[1] = (long int)pas % 10000000 / 1000000;
dis[2] = (long int)pas % 1000000 / 100000;
dis[3] = (long int)pas % 100000 / 10000;
dis[4] = (long int)pas % 10000 / 1000;
dis[5] = (long int)pas % 1000 / 100;
dis[6] = (long int)pas % 100 / 10;
dis[7] = (long int)pas % 10;
Write_Max7219(8, dis[0]);
Write_Max7219(7, dis[1]);
Write_Max7219(6, dis[2]);
Write_Max7219(5, dis[3]);
Write_Max7219(4, dis[4]);
Write_Max7219(3, dis[5]);
Write_Max7219(2, dis[6]);
Write_Max7219(1, dis[7]);
Delay_xms(100); //delay 100ms
}
}