这个程序还有些错误,主要是定时和日历部分,求解决
时间:10-02
整理:3721RD
点击:
/****主要功能:按第一个键(ok=0)走时,按第二个键调时间,按第三个键(key=2)调小时,
第四个键(key=3)调分钟,第六个键调日历,第四个键调几号,第五个键正常走时第七个键调闹钟,共用键(key=2,key=3) ***/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6; //段显
sbit we=P2^7; //位显
sbit beep=P2^3; //蜂鸣器
uchar s,m,h,a0,a1,a2,a3,a4,a5,s1,h1,f1,n,y,r;
uchar key=0,ok, pp=0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[]={31,28,31,30,31,30,31,31,30,31,30,31 }; //一年每个月的天数
/****延时函数****/
void delayms(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
{
for(j=110;j>0;j--);
}
}
/****显示函数****/
void display(uchar h,uchar m,uchar s)
{
a0=h/10;
a1=h%10;
a2=m/10;
a3=m%10;
a4=s/10;
a5=s%10;
du=0;
du=1;
P0=table[a0]; //显示第一个数码管
du=0;
we=0;
we=1;
P0=0xfe;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a1]|0x80; //显示第二个数码管及小数点
du=0;
we=0;
we=1;
P0=0xfd;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a2];
du=0;
we=0;
we=1;
P0=0xfb;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a3]|0x80;
du=0;
we=0;
we=1;
P0=0xf7;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a4];
du=0;
we=0;
we=1;
P0=0xef;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a5];
du=0;
we=0;
we=1;
P0=0xdf;
we=0;
delayms(3);
}
/****键盘扫描****/
void keyscan()
{
uchar temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
ok=0;
break;
case 0xde:
ok=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
/*************主函数************/
void main()
{
h1=7,f1=0,s1=0,n=13,y=5,r=6;
du=0;
we=0;
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();
if(ok==0)
{
TR0=1; //走时
}
if(ok==1)
{
TR0=0;
switch(key)
{
case 2:
h++; //调节小时
if(h==24)
{
h=0;
}
key=0;
break;
case 3:
m++; //调节分钟
if(m==60)
{
m=0;
}
key=0;
break;
}
}
if(key==7||key==2||key==3) //调闹钟
{
switch(key)
{
case 2:
h1++;
if(h1==24)
{
h1=0;
}
key=7;
break;
case 3:
f1++;
if(f1==60)
{
f1=0;
}
key=7;
break;
}
if(key==5)
{
key=0;
}
display(h1,f1,s1);
}
if(key!=7&&key!=4&&key!=6) //正常走时
{
display(h,m,s);
}
if(h==h1&&m==f1&&s==s1) //定时时间到,闹钟响一分钟
{
beep=0;
}
}
if(h==h1&&m==f1+1&&s==s1)
{
beep=1;
}
if(key==6||key==4) //调日历
{
switch(key)
{
case 2:
n++;
if(n==99)
{
n=1;
}
key=6;
break;
case 3:
y++;
if(y==13)
{
y=1;
}
key=6;
break;
case 4:
r++;
if(r==num[y-1])
{
r=1;
}
key=6;
break;
}
display(n,y,r);
}
}
void time0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
pp++;
if(pp==20)
{
pp=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
{
h=0;
m=0;
s=0;
r++;
if(r==num[y-1])
{
r=1;
y++;
if(y==13)
{
y=1;
n++;
if(n==99)
{
n=1;
}
}
}
}
}
}
}
}
日历那部分,不知道为什么不能显示,还有为什么我把 if(key==7||key==2||key==3)改成 if(key==7)时,调闹钟的时候
不能调,也不能显示?
第四个键(key=3)调分钟,第六个键调日历,第四个键调几号,第五个键正常走时第七个键调闹钟,共用键(key=2,key=3) ***/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6; //段显
sbit we=P2^7; //位显
sbit beep=P2^3; //蜂鸣器
uchar s,m,h,a0,a1,a2,a3,a4,a5,s1,h1,f1,n,y,r;
uchar key=0,ok, pp=0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[]={31,28,31,30,31,30,31,31,30,31,30,31 }; //一年每个月的天数
/****延时函数****/
void delayms(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
{
for(j=110;j>0;j--);
}
}
/****显示函数****/
void display(uchar h,uchar m,uchar s)
{
a0=h/10;
a1=h%10;
a2=m/10;
a3=m%10;
a4=s/10;
a5=s%10;
du=0;
du=1;
P0=table[a0]; //显示第一个数码管
du=0;
we=0;
we=1;
P0=0xfe;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a1]|0x80; //显示第二个数码管及小数点
du=0;
we=0;
we=1;
P0=0xfd;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a2];
du=0;
we=0;
we=1;
P0=0xfb;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a3]|0x80;
du=0;
we=0;
we=1;
P0=0xf7;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a4];
du=0;
we=0;
we=1;
P0=0xef;
we=0;
delayms(3);
du=0;
du=1;
P0=table[a5];
du=0;
we=0;
we=1;
P0=0xdf;
we=0;
delayms(3);
}
/****键盘扫描****/
void keyscan()
{
uchar temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
ok=0;
break;
case 0xde:
ok=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
delayms(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
/*************主函数************/
void main()
{
h1=7,f1=0,s1=0,n=13,y=5,r=6;
du=0;
we=0;
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();
if(ok==0)
{
TR0=1; //走时
}
if(ok==1)
{
TR0=0;
switch(key)
{
case 2:
h++; //调节小时
if(h==24)
{
h=0;
}
key=0;
break;
case 3:
m++; //调节分钟
if(m==60)
{
m=0;
}
key=0;
break;
}
}
if(key==7||key==2||key==3) //调闹钟
{
switch(key)
{
case 2:
h1++;
if(h1==24)
{
h1=0;
}
key=7;
break;
case 3:
f1++;
if(f1==60)
{
f1=0;
}
key=7;
break;
}
if(key==5)
{
key=0;
}
display(h1,f1,s1);
}
if(key!=7&&key!=4&&key!=6) //正常走时
{
display(h,m,s);
}
if(h==h1&&m==f1&&s==s1) //定时时间到,闹钟响一分钟
{
beep=0;
}
}
if(h==h1&&m==f1+1&&s==s1)
{
beep=1;
}
if(key==6||key==4) //调日历
{
switch(key)
{
case 2:
n++;
if(n==99)
{
n=1;
}
key=6;
break;
case 3:
y++;
if(y==13)
{
y=1;
}
key=6;
break;
case 4:
r++;
if(r==num[y-1])
{
r=1;
}
key=6;
break;
}
display(n,y,r);
}
}
void time0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
pp++;
if(pp==20)
{
pp=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
{
h=0;
m=0;
s=0;
r++;
if(r==num[y-1])
{
r=1;
y++;
if(y==13)
{
y=1;
n++;
if(n==99)
{
n=1;
}
}
}
}
}
}
}
}
日历那部分,不知道为什么不能显示,还有为什么我把 if(key==7||key==2||key==3)改成 if(key==7)时,调闹钟的时候
不能调,也不能显示?
什么意思啊,不懂