#include <reg51.h>
#include <stdio.h>
/*
仿真说明:程序运行后每按下3号按钮一次初始值由0自加1一次,配合按下2号按键保存当前显示的数据以实现字节写入功能,
按下1号按键读取上次保存的数据以实现数据读取功能。另外增加了4号按键实现数据清零功能。
*/
typedef unsigned int u16;
typedef unsigned char u8;
sbit SCL=P2^0;
sbit SDA=P2^1;
void I2cStart();
void I2cStop();
unsigned char I2cSendByte(unsigned char dat);
unsigned char I2cReadByte();
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^0;//保存数据
sbit k2=P3^1;//显示的数据
sbit k3=P3^2;//数据加一
sbit k4=P3^3; //数据清零
char num=0;
u8 disp[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i)
{
while(i--);
}
void Keypros()//按键控制函数
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
At24c02Write(1,num);
}
while(!k1);
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
num=At24c02Read(1);
}
while(!k2);
}
if(k3==0)
{
delay(100);
if(k3==0)
{
num++;
if(num>255)num=0;
}
while(!k3);
}
if(k4==0)
{
delay(1000);
if(k4==0)
{
num=0;
}
while(!k4);
}
}
void Delay10us()
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void I2cStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();
SDA=0;
Delay10us();
SCL=0;
Delay10us();
}
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();
SDA=1;
Delay10us();
}
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;
for(a=0;a<8;a++)
{
SDA=dat>>7;
dat=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;
}
unsigned char I2cReadByte()
{
unsigned char 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(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);
I2cSendByte(addr);
I2cSendByte(dat);
I2cStop();
}
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();
I2cSendByte(0xa0);
I2cSendByte(addr);
I2cStart();
I2cSendByte(0xa1);
num=I2cReadByte();
I2cStop();
return num;
}
void datapros()
{
disp[1]=smgduan[num%1000/100];//百位
disp[2]=smgduan[num%1000%100/10];//十位
disp[3]=smgduan[num%1000%100%10];//个位
disp[5]=smgduan[num%1000/100];//百位
disp[6]=smgduan[num%1000%100/10];//十位
disp[7]=smgduan[num%1000%100%10];//个位
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;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;
case(4):
LSA=0;LSB=0;LSC=1; break;
case(5):
LSA=1;LSB=0;LSC=1; break;
case(6):
LSA=0;LSB=1;LSC=1; break;
case(7):
LSA=1;LSB=1;LSC=1; break;
}
P0=disp[i];
delay(100);
P0=0x00;
}
}
void main()
{
while(1)
{
Keypros();
datapros();
DigDisplay();
}
}
现在是前四位可以输入数据,但是后四位的显示不会处理
想进行位选但是不行,请帮我想想怎么写
请帮我想想刚入门,请boss帮我想想怎么写