这个是第二个程序,只不过把numt0和numt2换成8位保存而已,但是运行有问题
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit key5=P3^0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit led1=P1^0;
sbit led2=P1^1;
bit write=0; //写24C08的标志;
bit flag=0;
sbit sda=P2^0; //IIC接口SDA定义
sbit scl=P2^1; //IIC接口SCL定义
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义I/O
void delayms(uint); //申明延迟函数
uchar bei,num,num1,y=0,y1=0,numt1,numt3,data8_1,data8_2,data8_3,data8_4,data8_5,data8_6;
uint numt0;
uchar mode=0;
ulong numt2;
/////////24C02读写驱动程序////////////////////
void delay1(unsigned char x) //延时子函数
{ unsigned int i;
for(i=0;i<x;i++);}
void flash() //延时子函数
{ ; ; }
void x24c08_init() //24c02初始化子程序
{scl=1; flash(); sda=1; flash();}
void start() //启动I2C总线
{sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
void stop() //停止I2C总线
{sda=0; flash(); scl=1; flash(); sda=1; flash();}
void writex(unsigned char j) //写一个字节
{ unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
scl=0; flash(); sda=1; flash();
}
unsigned char readx() //读一个字节
{
unsigned char i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++)
{ flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;}
flash(); return(k);
}
void clock() //I2C总线应答子函数
{
unsigned char i=0;
scl=1; flash();
while ((sda==1)&&(i<255))i++;
scl=0; flash();
}
////////从24c02的地址address中读取一个字节数据/////
unsigned char x24c08_read(unsigned char address)
{
unsigned char i;
start(); writex(0xa0);
clock(); writex(address);
clock(); start();
writex(0xa1); clock();
i=readx(); stop();
delay1(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c08_write(unsigned char address,unsigned char info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
void display(uchar numdis) //显示函数 mode 1
{ if(mode==3) //显示stop
{ wela=1;
P0=0xfe; // 位选s
wela=0;
dula=1;
P0=0x6d; //显示s
dula=0;
P0=0xff;
delayms(5);
wela=1;
P0=0xfd; // 位选t
wela=0;
dula=1;
P0=0x78; // 显示t
dula=0;
P0=0xff;
delayms(5);
wela=1; // 位选O
P0=0xfb;
wela=0;
dula=1;
P0=0x5c; // 显示O
dula=0;
P0=0xff;
delayms(5);
wela=1; // 位选p
P0=0xf7;
wela=0;
dula=1;
P0=0x73; // 显示p
dula=0;
P0=0xff;
delayms(5);
}
if(mode==2)
{
wela=1;
P0=0xfe; // 位选G
wela=0;
dula=1;
P0=0x3d; //显示G
dula=0;
P0=0xff;
delayms(5);
wela=1;
P0=0xfd; // 位选O
wela=0;
dula=1;
P0=0x5c; // 显示O
dula=0;
P0=0xff;
delayms(5);
wela=1; // 位选O
P0=0xfb;
wela=0;
dula=1;
P0=0x5c; // 显示O
dula=0;
P0=0xff;
delayms(5);
wela=1; // 位选d
P0=0xf7;
wela=0;
dula=1;
P0=0x5e; // 显示d
dula=0;
P0=0xff;
delayms(5);
}
if(mode==0)
{uchar shi,ge;
shi=numdis%100/10;
ge=numdis%10;
wela=1;
P0=0xfe; // 位选百位
wela=0;
dula=1;
P0=0x76; //显示百位H
dula=0;
P0=0xff;
delayms(5);
wela=1;
P0=0xfd; // 位选十位
wela=0;
dula=1;
P0=table[shi]; // 显示十位
dula=0;
P0=0xff;
delayms(5);
wela=1; // 位选个位
P0=0xfb;
wela=0;
dula=1;
P0=table[ge]; // 显示个位
dula=0;
P0=0xff;
delayms(5);
/*wela=1; // 位选
P0=0xfb;
wela=0;
dula=1;
P0=table[ge_c]; // 显示个位
dula=0;
P0=0xff;
delayms(5); */
}
}
void display1(uchar numdis1) //显示函数1 mode 2
{
if(mode==1)
{uchar shi1,ge1;
shi1=numdis1%100/10;
ge1=numdis1%10;
wela=1;
P0=0xfe; // 位选百位
wela=0;
dula=1;
P0=0x6d; //显示百位S
dula=0;
P0=0xff;
delayms(5);
wela=1;
P0=0xfd; // 位选十位
wela=0;
dula=1;
P0=table[shi1]; // 显示十位
dula=0;
P0=0xff;
delayms(5);
wela=1; // 位选个位
P0=0xfb;
wela=0;
dula=1;
P0=table[ge1]; // 显示个位
dula=0;
P0=0xff;
delayms(5);
}
}
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init() //中断初始化函数
{
TMOD=0X11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
}
void keyscan() //按键扫描
{
if(key1==0&&TR0==0&&mode==0)
{
delayms(60); // 设置倒计时时间++
if(key1==0)
{ numt0=0;
led1=1;
num++;
if(num==100)
num=0;
y=num;
while(key1==1);
}
}
if(key1==0&&mode==1&&TR0==0)
{
delayms(60); // 设置间隔时间++
if(key1==0)
{ numt2=0;
flag=0;
led1=1;
num1++;
if(num1==100)
num1=0;
y1=num1;
while(key1==1);
}
}
if(key2==0&&TR0==0&&mode==0)
{
delayms(60);
if(key2==0)
{ numt0=0;
led1=1;
if(num==0) // 设置倒计时时间--
num=100;
num--;
y=num;
while(key2==1);
}
}
if(key2==0&&mode==1&&TR0==0)
{
delayms(60);
if(key2==0)
{ numt2=0;
flag=0;
led1=1;
if(num1==0) // 设置间隔时间--
num1=100;
num1--;
y1=num1;
while(key2==1);
}
}
if(key3==0)
{
delayms(10);
while(key3==0) // 模式++
{ delayms(300);
mode++;
}
if(mode>=2)
{
mode=0;
}
}
if(key4==0)
{
delayms(10);
//开启中断,程序开始
if(key4==0)
{
while(!key4);
TR0=1;
}
}
if(key5==0)
{
delayms(10);
if(key5==0)
{
while(!key5);
TR0=0;
mode=3;
display(y);
}
}
}
void main()
{
init();
init();
x24c08_init(); //初始化24C08
y=x24c08_read(1); //读出保存的数据赋于sec
num=x24c08_read(2); //读出保存的数据赋于sec
y1=x24c08_read(5); //读出保存的数据赋于sec
num1=x24c08_read(6); //读出保存的数据赋于sec
// numt0=x24c08_read(0x50); //读出保存的数据赋于sec
// numt2=x24c08_read(0x60); //读出保存的数据赋于sec
flag=x24c08_read(7);
data8_1=x24c08_read(3);
data8_2=x24c08_read(4);
data8_3=x24c08_read(8);
data8_4=x24c08_read(9);
data8_5=x24c08_read(10);
data8_6=x24c08_read(11);
numt0=((uint)data8_1 << 8) | (uint)(data8_2);
numt2=((ulong)data8_3 << 24) | ((ulong)data8_4 << 16) | ((ulong)data8_5 << 8) | ((ulong)data8_6) ;
while(1)
{
keyscan();
{display(y);
if(write==1) //判断计时器是否计时一秒
{
write=0; //清零
x24c08_write(1,y); //在24c02的地址1中写入数据y
x24c08_write(2,num);
// x24c08_write(50,numt0);
x24c08_write(3,data8_1);
x24c08_write(4,data8_2);
}
display1(y1);
if(write==1)
{
write=0; //清零
x24c08_write(5,y1); //在24c02的地址5中写入数据y1
x24c08_write(6,num1);
// x24c08_write(60,numt2);
x24c08_write(7,flag);
x24c08_write(8,data8_3);
x24c08_write(9,data8_4);
x24c08_write(10,data8_5);
x24c08_write(11,data8_6);
}
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
if(flag==0)
{
numt0++;
numt1++;
if(numt1==19)
{led1=0;}
if(numt1==20)
{ data8_1 = (uchar)(numt0 >> 8);
data8_2 = (uchar)numt0 ;
write=1; //1秒写一次24C02
led1=1;
numt1=0;
}
if(numt0==100) //numt0=20间隔1S numt0=1200间隔1分钟
{
numt0=0;
y--;
if(y==0)
{
flag=1;
y=num;
}
}
}
if(flag==1)
{
numt2++;
numt3++;
if(numt3==19)
{led2=0;}
if(numt3==20)
{ data8_3 = (uchar)(numt2 >> 24);
data8_4 = (uchar)(numt2 >> 16);
data8_5 = (uchar)(numt2 >> 8);
data8_6 = (uchar)numt2 ;
write=1; //1秒写一次24C02
led2=1;
numt3=0;
}
if(numt2==100) //numt0=20间隔1S numt0=1200间隔1分钟
{
numt2=0;
y1--;
if(y1==0)
{
flag=0;
y1=num1;
}
}
}
}
|