xpi2c.c中的函数
#include"xpi2c.h"
void SPIWrite(uchar dat) //写入数据
{
uchar i;
CLK=0; //闲置状态下处于低电压
for(i=0;i<8;i++)
{
DIN=dat>>7;
dat<<=1;
CLK=0;
CLK=1; //上升沿放置数据
}
}
uint SPIRead() //读取数据
{
uint i,dat=0;
CLK=0;
for(i=0;i<12;i++) //接收12位数据
{
dat<<=1;
CLK=1;
CLK=0;
dat|=DOUT;
}
return dat;
}
uint ReadADDate(uchar cmd)
{
uchar i;
uint ADValue;
CLK=0;
CS=0;
SPIWrite(cmd);
for(i=6;i>0;i--); //延时
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
ADValue=SPIRead();
CS=1; //结束
return ADValue;
}
void delay10us()
{
uchar a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void I2cStart() //起始信号
{
SDA=1; //初始
delay10us();
SCL=1; //初始
delay10us();
SDA=0; //SDA从高跳低开始
delay10us();
SCL=0;
delay10us();
}
void I2cStop() //结束信号
{
SDA=0;
delay10us();
SCL=1;
delay10us();
SDA=1; //SDA从低跳高结束
delay10us();
}
uchar I2cSendByte(uchar dat) //发送一个字节
{
uchar a=0,b=0;
for(a=0;a<8;a++)
{
SDA=dat>>7;
dat<<=1;
delay10us();
SCL=1;
delay10us();
SCL=0;
delay10us();
}
SDA=1;
delay10us();
SCL=1;
while(SDA) //等待应答
{
b++;
if(b>200)
{
SCL=0;
delay10us();
return 0;
}
}
SCL=0;
delay10us();
return 1;
}
uchar I2cReadByte() //读取字节
{
uchar a=0,dat=0;
SDA=1;
delay10us();
for(a=0;a<8;a++)
{
SCL=1;
delay10us();
dat<<=1;
dat|=SDA;
delay10us();
SCL=0;
delay10us();
}
return dat;
}
void AT24c02Write(uchar addr,uchar dat) //向24c02的地址中写入数据
{
I2cStart();
I2cSendByte(0xa0); //发送写器件地址
I2cSendByte(addr); //发送要写入内容地址
I2cSendByte(dat); //发送数据
I2cStop();
}
uchar AT24c02Read(uchar addr) //读取24c02的一个地址的一个数据
{
uchar num;
I2cStart();
I2cSendByte(0xa0);
I2cSendByte(addr);
I2cStart();
I2cSendByte(0xa1);
num=I2cReadByte(); //发送读器件的地址
I2cStop();
return num;
}
main里的函数
#include"reg51.h"
#include"xpi2c.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^0; //读取
sbit k2=P3^1; //保存
sbit k3=P3^2;
u16 temp,k=0;
u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 j)
{
while(j--);
}
void Keypros()
{ u16 j=0;
if(k1==0)
{
delay(100);
if(k1==0)
{
disp[0]=AT24c02Read(1);
disp[1]=AT24c02Read(2);
disp[2]=AT24c02Read(3);
disp[3]=AT24c02Read(4);
}
while(!k1);
}
if(k2==0)
{
delay(100);
if(k2==0)
{
AT24c02Write(1,disp[0]); //写入
AT24c02Write(2,disp[1]);
AT24c02Write(3,disp[2]);
AT24c02Write(4,disp[3]);
}
while(!k2);
}
if(k3==0)
{
delay(100);
if(k3==0)
{
k++;
if(k==2)
k=0;
}
while(!k3);
}
}
void datapros()
{
static u8 i;
if(i==50)
{
i=0;
temp=ReadADDate(0x94); //AIN0电位器
}
i++;
disp[0]=smgduan[temp/1000];
disp[1]=smgduan[temp%1000/100];
disp[2]=smgduan[temp%1000%100/10];
disp[3]=smgduan[temp%1000%100%10];
}
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case(1):
LSA=1;LSB=0;LSC=0;break;
case(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
}
P0=disp[i];
delay(100);
P0=0x00;
}
}
void main()
{
while(1)
{
Keypros();
if(k==1){
datapros();
}
DigDisplay();
}
}