|
要求功能:利用定时器产生一个0~99秒变化的秒表,并显示在数码管上,每过一秒将这个变化的数字写入板上AT24C02内部。当关闭实验板电源,并再次打开实验板电源时,单片机先从AT24C02中将原来写入的数读出来,接着此数继续变化并显示在数码管上。
程序如下:
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit SCL=P2^1;
sbit SDA=P2^0;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code array[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 array1[4];
u8 num=0;
void delay(u8 b)
{
while(b--);
}
void delay10us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void start()
{
SDA=1;
delay10us();
SCL=1;
delay10us();
SDA=0;
delay10us();
}
void stop()
{
SDA=0;
delay10us();
SCL=1;
delay10us();
SDA=1;
delay10us();
}
void respons()
{
u8 c;
SCL=1;
delay10us();
while(SDA)
{
c++;
if(c>200)
{
SCL=0;
delay10us();
}
}
SCL=0;
delay10us();
}
void I2Cwritebyte(u8 date)
{
u8 i;
for(i=0;i<8;i++)
{
SDA=date>>7;
date=date<<1;
delay10us();
SCL=1;
delay10us();
SCL=0;
delay10us();
}
SDA=1;
delay10us();
SCL=1;
delay10us();
respons();
}
u8 I2Creadbyte()
{
u8 dat,i;
SDA=1;
delay10us();
for(i=0;i<8;i++)
{
SCL=1;
dat<<=1;
dat|=SDA;
delay10us();
SCL=0;
delay10us();
}
return dat;
}
void AT24C02Write(u8 addr,u8 dat)
{
start();
I2Cwritebyte(0xa0);
I2Cwritebyte(addr);
I2Cwritebyte(dat);
stop();
}
u8 AT24C02Read(u8 addr)
{
u8 num;
start();
I2Cwritebyte(0xa0);
I2Cwritebyte(addr);
start();
I2Cwritebyte(0xa1);
num=I2Creadbyte();
stop();
return num;
}
void keypros()
{
if(k1==0)
{
delay(100);
if(k1==0)
{
AT24C02Write(1,num);
}
while(!k1);
}
if(k2==0)
{
delay(100);
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(100);
if(k4==0)
{
num=0;
}
while(!k4);
}
}
void numpros()
{
array1[0]=array[num%1000%100%10];
array1[1]=array[num%1000%100/10];
array1[2]=array[num%1000/100];
array1[3]=array[num/1000];
}
void digpros()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case(0)SA=0;LSB=0;LSC=0;break;
case(1)SA=1;LSB=0;LSC=0;break;
case(2)SA=0;LSB=1;LSC=0;break;
case(3)SA=1;LSB=1;LSC=0;break;
}
}
P0=array1[i];
delay(1000);
P0=0x00;
}
void main()
{
while(1)
{
keypros();
numpros();
digpros();
}
}
我的板子上的现象是数码管只是从0~99,不过掉电后不会保存数据,又从0开始了。请问哪里有问题?
|
|