📄 lab24.c
字号:
/*可调时钟(无小时)和设定闹钟功能*/
#include<at89x52.h>
char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
char code tv[]={0xfe,0xfd,0xfb,0xf7};
char led[4];
unsigned int counter;
unsigned char s_data=50,m_data=59,n,w=4,flag,flag2,flag3,set_mdata,set_sdata,mdata,sdata;
void display(void);
void delay(unsigned int j)
{
unsigned int i;
for(i=0;i<j;i++);
}
void delay2(void)
{
unsigned int j;
//for(i=0;i<1000;i++)
for(j=0;j<500;j++) display();
}
void display(void)
{
unsigned char k,i;
if(flag2==1) //设定闹钟时不显示实际时间
{
led[0]=mdata/10;
led[1]=mdata%10;
led[2]=sdata/10;
led[3]=sdata%10;
}
else
{
led[0]=m_data/10;
led[1]=m_data%10;
led[2]=s_data/10;
led[3]=s_data%10;
}
n++;
if(n>180)
n=0;
for(k=0;k<4;k++)
{
if(k==w) //闪烁显示
{
if(n<90)
{i=led[k];
P0=num[i];
if(k==1)
P0=num[i] | 0x80; //显示小数点
P2=tv[k];
delay(100);
}
else
{
P0=num[10];
if(k==1)
P0=num[10] | 0x80;
P2=tv[k];
delay(100);
}
}
else //正常显示
{
i=led[k];
P0=num[i];
if(k==1)
P0=num[i] | 0x80;
P2=tv[k];
delay(100);
}
}
}
void adjust(void) //调整函数
{
if(P3_5==0)
{
while(P3_5==0)
display();
if(flag2==0) //T1,开始调整时间 ;记时停止
{
TR0=0;
w=0;
flag++;
if(flag==2) //第一次按下是开始调整时间,第二次按下时确定
{flag=0;TR0=1;w=4;}
}
else //开始设定闹钟,记时不停止
{
w=0;
flag++;
if(flag==2) //第一次按下是开始调整时间,第二次按下时确定
{flag=0;flag2=0;flag3=1;w=4;}
}
}
if(P3_2==0) //INT0,加操作
{
while(P3_2==0)
display();
if(flag2==0)
{ //显示当前时间,由于采用逐个数码管闪烁,逐个调整,所以分钟数和秒数的个位,十位分别赋值,比较麻烦
if(w==0)
{m_data=(m_data/10+1)*10+m_data%10;if(m_data>=60){m_data=m_data%10;}}
if(w==1)
{if(m_data%10==9) m_data=m_data/10*10;else m_data=m_data%10+1+m_data/10*10; }
if(w==2)
{s_data=(s_data/10+1)*10+s_data%10;if(s_data>=60){s_data=s_data%10;}}
if(w==3)
{if(s_data%10==9) s_data=s_data/10*10;else s_data=s_data%10+1+s_data/10*10; }
}
else
{ //显示闹钟时间,逐个调整,
if(w==0)
{mdata=(mdata/10+1)*10+mdata%10;if(mdata>=60){mdata=mdata%10;}}
if(w==1)
{if(mdata%10==9) mdata=mdata/10*10;else mdata=mdata%10+1+mdata/10*10; }
if(w==2)
{sdata=(sdata/10+1)*10+sdata%10;if(sdata>=60){sdata=sdata%10;}}
if(w==3)
{if(sdata%10==9) sdata=sdata/10*10;else sdata=sdata%10+1+sdata/10*10; }
}
}
if(P3_3==0) //INT1,减操作
{
while(P3_3==0)
display();
if(flag2==0)
{ //显示当前时间
if(w==0)
{if(m_data/10==0) m_data=50+m_data%10; else m_data=(m_data/10-1)*10+m_data%10;}
if(w==1)
{if(m_data%10==0) m_data=m_data/10*10+9;else m_data=m_data%10-1+m_data/10*10;}
if(w==2)
{if(s_data/10==0) s_data=50+s_data%10; else s_data=(s_data/10-1)*10+s_data%10;}
if(w==3)
{if(s_data%10==0) s_data=s_data/10*10+9;else s_data=s_data%10-1+s_data/10*10;}
}
else
{ ////显示闹钟时间
if(w==0)
{if(mdata/10==0) mdata=50+mdata%10; else mdata=(mdata/10-1)*10+mdata%10;}
if(w==1)
{if(mdata%10==0) mdata=mdata/10*10+9;else mdata=mdata%10-1+mdata/10*10;}
if(w==2)
{if(sdata/10==0) sdata=50+sdata%10; else sdata=(sdata/10-1)*10+sdata%10;}
if(w==3)
{if(sdata%10==0) sdata=sdata/10*10+9;else sdata=sdata%10-1+sdata/10*10;}
}
}
//}
if(P3_4==0) //T0,下一个数码管闪烁/设定闹钟开始
{
while(P3_4==0)
display();
if(flag==1) //当flag==1时,说明P3_5按下过,开始调整时间,此时P3_4只起循环闪烁数码管的功能
{
w++;
if(w==4) w=0;
}
else //设定闹钟
{
flag2=1;
mdata=m_data; //读取当前时间值
sdata=s_data;
}
}
}
void timer0() interrupt 1
{
counter++;
if(counter==5000)
{
s_data++;
counter=0;
}
}
main(void)
{
IE=0x8a;
TMOD=0x02;
TH0=-200;
TL0=-200;
TR0=1;
while(1)
{
if(s_data==60)
{
s_data=0;
m_data++;
}
if(m_data==60)
{
m_data=0;
}
adjust();
if(m_data==mdata && s_data==sdata) //判断是否等于设定的时间值,即闹钟功能,mdata,sdata为设定的闹钟时间;
{if(flag3==1) //m_data,s_data为当前时间值
{P1_0=0;delay2();P1_0=1;flag3=0;}} // P1_0口接的数码管亮一下表示闹钟时间到
//delay(100);
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -