版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kencaber/article/details/77917488
I²C(Inter IC Bus)是由 Philips 推出的数据总线协议。
#include <reg52.h>
void display(unsigned int n)
{
unsigned char i;
char table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
P2 = 0 << 2;
P0 = table[n%10];
for (i=0;i<25;i++);
P0 = 0;
P2 = 1 << 2;
P0 = table[n/10%10];
for (i=0;i<25;i++);
P0 = 0;
P2 = 2 << 2;
P0 = table[n/100%10];
for (i=0;i<25;i++);
P0 = 0;
P2 = 3 << 2;
P0 = table[n/1000%10];
for (i=0;i<25;i++);
P0 = 0;
}
// IIC bus
sbit SCL=P2^1;
sbit SDA=P2^0;
// 4 keys
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
void delay(unsigned int i)
{
while(i--);
}
void I2cStart()
{
SDA = 1;
delay(5);
SCL = 1;
delay(5);
SDA = 0;
delay(5);
}
void I2cStop()
{
SDA = 0;
delay(5);
SCL = 1;
delay(5);
SDA = 1;
}
void I2cSendByte(unsigned char n)
{
signed char i;
for (i=7;i>=0;i--)
{
SCL = 0;
delay(5);
SDA = 0x01 & (n>>i);
delay(5);
SCL = 1;
delay(5);
}
SCL = 0;
delay(5);
SDA = 1;
delay(5);
SCL = 1;
delay(5);
while((SDA==1)&&(i++<255));
SCL = 0;
delay(5);
}
unsigned char I2cReadByte()
{
unsigned char i,k;
SCL = 0;
delay(5);
SDA = 1;
delay(5);
for (i = 0; i < 8; ++i)
{
SCL = 1;
delay(5);
k <<= 1;
k |= SDA;
SCL = 0;
delay(5);
}
delay(5);
return k;
}
int main()
{
unsigned char num=0;
while (1)
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
I2cStart();
I2cSendByte(0xa0); // set chip
I2cSendByte(1); // set address 1
I2cSendByte(num); // set value
I2cStop();
}
while(!k1);
} else if(k2==0) {
delay(1000);
if(k2==0)
{
I2cStart();
I2cSendByte(0xa0); // set chip 0xa0
I2cSendByte(1); // set address 1
I2cStart();
I2cSendByte(0xa1); // set chip 0xa1
num=I2cReadByte(); // read byte
I2cStop();
}
while(!k2);
} else if(k3==0) {
delay(1000);
if(k3==0)
num++; // add 1
while(!k3);
} else if(k4==0) {
delay(1000);
if(k4==0)
num=0; // set 0
while(!k4);
}
display(num);
}
return 0;
}
aaa