可能有未知的BUG
有些东西要看着才能写下来,那些时序什么的记不住啊
代码有郭天祥的影子=-= 毕竟是他教的
/*
Nonikka
2014-5-24
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;
sbit scl=P2^1;
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit fmq=P3^0;
uchar count,shi,fen,miao,s1num,r;
uchar code table[]="Time:";
uchar code table1[]="00:00:00";
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit rd=P1^7;
void delay()
{ ; ; }
void delayms(uint z)
{ uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
//********************************************* I2C总线
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void initi2c()
{
sda=1;
scl=1;
}
void write_byte(uchar date)
{
uchar temp,i;
temp=date;
scl=0;
delay();
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}
uchar read_byte()
{
uchar i,j,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
j=sda;
k=(k<<1)|j;
scl=0;
delay();
}
return k;
}
void send(uchar add,uchar date)
{
start();
write_byte(0xa0); //写器件地址
respons();
write_byte(add);//器件内部存储器地址
respons();
write_byte(date);
respons();
stop();
}
char get(uchar add)
{
start();
write_byte(0xa0); //写器件地址
respons();
write_byte(add);
respons();
start();
write_byte(0xa1); //读
respons();
r=read_byte();
return r;
}
//**********************************************
void xiang() //蜂鸣器
{
int i;
for(i=25;i>0;i--)
{
fmq=1;
delayms(2);
fmq=0;
delayms(2);
}
}
void write_com(uchar com)
{
lcden=0;
lcdrs=0;
lcdrw=0;
P0=com;
delayms(3);
lcden=1;
delayms(3);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
lcden=0;
P0=date;
delayms(3);
lcden=1;
delayms(3);
lcden=0;
}
void write_sfm(uchar add,uchar date)
{ uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void init()
{ uchar num;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
delayms(2);
for(num=0;num<5;num++)
{
write_date(table[num]);
delayms(3);
}
write_com(0x80+0x40);
for(num=0;num<8;num++)
{
write_date(table1[num]);
delayms(3);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //中断定时器等
ET0=1;
TR0=1;
}
void keyscan()
{
rd=0;
if(s1==0)
{
delayms(5);
if(s1==0)
{
s1num++;
while(!s1); //松手检测
xiang();
if(s1num==1)
{
TR0=0; //计时器停止
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x40+4);
}
if(s1num==3)
{
write_com(0x80+0x40+1);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(s1num!=0)
{
if(s2==0);
{
delayms(5);
if(s2==0)
{
if(s1num==1)
{
while(!s2); //和下面的时间减不一样
xiang();
miao++;
if(miao==60)
{
miao=0;
}
write_com(0x80+0x40+6); //每次都要写入数据,定指针
write_sfm(6,miao);
write_com(0x80+0x40+7);
send(1,miao);
}
if(s1num==2)
{
while(!s2);
xiang();
fen++;
if(fen==60)
{
fen=0;
}
write_com(0x80+0x40+3);
write_sfm(3,fen);
write_com(0x80+0x40+4);
send(2,fen);
}
if(s1num==3)
{
while(!s2);
xiang();
shi++;
if(shi>=24)
{
shi=0;
}
write_com(0x80+0x40+0);
write_sfm(0,shi);
write_com(0x80+0x40+1);
send(3,shi);
}
}
}
//**************************************************************减
if(s3==0); //时间减
{
delayms(5);
if(s3==0)
{
if(s1num==1)
{
while(!s3);
xiang();
if(miao==0)
{
miao=60;
}
miao--;
write_com(0x80+0x40+6);
write_sfm(6,miao);
write_com(0x80+0x40+7);
send(1,miao);
}
if(s1num==2)
{
while(!s3);
xiang();
if(fen==0)
{
fen=60;
}
fen--;
write_com(0x80+0x40+3);
write_sfm(3,fen);
write_com(0x80+0x40+4);
send(2,fen);
}
if(s1num==3)
{
while(!s3);
xiang();
if(shi==0)
{
shi=24;
}
shi--;
write_com(0x80+0x40+0);
write_sfm(0,shi);
write_com(0x80+0x40+1);
send(3,shi);
}
}
}
}
}
void main()
{
init();
initi2c(); //i2c初始化放前面
miao=get(1); //读取断电前数据
delayms(10);
fen=get(2);
delayms(10);
shi=get(3);
write_sfm(0,shi);
write_sfm(3,fen);
write_sfm(6,miao);
while(1)
{
keyscan();
if(count==20) //即一秒
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi>=24)
{
shi=0;
}
write_sfm(0,shi); //此处逻辑关系要注意
}
write_sfm(3,fen);
}
write_sfm(6,miao);
send(1,miao); //每秒发送数据
delayms(10);
send(2,fen);
delayms(10);
send(3,shi);
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
∑((((o△o)))
怎么是反过来的!!!
好了学渣赶紧去复习线代=-=
有个BUG是因为一些代码写在主函数,其实应该写在interrupt 1里,不然会导致挑完时间可能就不动了。
改完是这样,可能还是有错。
/*
Nonikka
2014-5-24
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;
sbit scl=P2^1;
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit fmq=P3^0;
uchar count,shi,fen,miao,s1num,r;
uchar code table[]="Time:";
uchar code table1[]="00:00:00";
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit rd=P1^7;
void delay()
{ ; ; }
void delayms(uint z)
{ uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
//********************************************* I2C总线
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void initi2c()
{
sda=1;
scl=1;
}
void write_byte(uchar date)
{
uchar temp,i;
temp=date;
scl=0;
delay();
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}
uchar read_byte()
{
uchar i,j,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
j=sda;
k=(k<<1)|j;
scl=0;
delay();
}
return k;
}
void send(uchar add,uchar date)
{
start();
write_byte(0xa0); //写器件地址
respons();
write_byte(add);//器件内部存储器地址
respons();
write_byte(date);
respons();
stop();
}
char get(uchar add)
{
start();
write_byte(0xa0); //写器件地址
respons();
write_byte(add);
respons();
start();
write_byte(0xa1); //读
respons();
r=read_byte();
return r;
}
//**********************************************
void xiang() //蜂鸣器
{
int i;
for(i=25;i>0;i--)
{
fmq=1;
delayms(2);
fmq=0;
delayms(2);
}
}
void write_com(uchar com)
{
lcden=0;
lcdrs=0;
lcdrw=0;
P0=com;
delayms(3);
lcden=1;
delayms(3);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
lcden=0;
P0=date;
delayms(3);
lcden=1;
delayms(3);
lcden=0;
}
void write_sfm(uchar add,uchar date)
{ uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void init()
{ uchar num;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
delayms(2);
for(num=0;num<5;num++)
{
write_date(table[num]);
delayms(3);
}
write_com(0x80+0x40);
for(num=0;num<8;num++)
{
write_date(table1[num]);
delayms(3);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //中断定时器等
ET0=1;
TR0=1;
}
void keyscan()
{
rd=0;
if(s1==0)
{
delayms(5);
if(s1==0)
{
s1num++;
while(!s1); //松手检测
xiang();
if(s1num==1)
{
TR0=0; //计时器停止
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x40+4);
}
if(s1num==3)
{
write_com(0x80+0x40+1);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(s1num!=0)
{
if(s2==0);
{
delayms(5);
if(s2==0)
{
if(s1num==1)
{
while(!s2); //和下面的时间减不一样
xiang();
miao++;
if(miao==60)
{
miao=0;
}
write_com(0x80+0x40+6); //每次都要写入数据,定指针
write_sfm(6,miao);
write_com(0x80+0x40+7);
send(1,miao);
}
if(s1num==2)
{
while(!s2);
xiang();
fen++;
if(fen==60)
{
fen=0;
}
write_com(0x80+0x40+3);
write_sfm(3,fen);
write_com(0x80+0x40+4);
send(2,fen);
}
if(s1num==3)
{
while(!s2);
xiang();
shi++;
if(shi>=24)
{
shi=0;
}
write_com(0x80+0x40+0);
write_sfm(0,shi);
write_com(0x80+0x40+1);
send(3,shi);
}
}
}
//**************************************************************减
if(s3==0); //时间减
{
delayms(5);
if(s3==0)
{
if(s1num==1)
{
while(!s3);
xiang();
if(miao==0)
{
miao=60;
}
miao--;
write_com(0x80+0x40+6);
write_sfm(6,miao);
write_com(0x80+0x40+7);
send(1,miao);
}
if(s1num==2)
{
while(!s3);
xiang();
if(fen==0)
{
fen=60;
}
fen--;
write_com(0x80+0x40+3);
write_sfm(3,fen);
write_com(0x80+0x40+4);
send(2,fen);
}
if(s1num==3)
{
while(!s3);
xiang();
if(shi==0)
{
shi=24;
}
shi--;
write_com(0x80+0x40+0);
write_sfm(0,shi);
write_com(0x80+0x40+1);
send(3,shi);
}
}
}
}
}
void main()
{
init();
initi2c(); //i2c初始化放前面
miao=get(1); //读取断电前数据
delayms(10);
fen=get(2);
delayms(10);
shi=get(3);
write_sfm(0,shi);
write_sfm(3,fen);
write_sfm(6,miao);
while(1)
{
keyscan();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20) //即一秒
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi>=24)
{
shi=0;
}
write_sfm(0,shi); //此处逻辑关系要注意
}
write_sfm(3,fen);
}
write_sfm(6,miao);
send(1,miao); //每秒发送数据
delayms(10);
send(2,fen);
delayms(10);
send(3,shi);
}
}
编辑器有warning *** WARNING L15: MULTIPLE CALL TO SEGMENT