📄 dzz_thesamea.c
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit choose_du=P2^6;
sbit choose_we=P2^7;
sbit s2=P3^4;
sbit s3=P3^5;
sbit s4=P3^6;
sbit s5=P3^7;
sbit beep=P2^3;
bit beep_f;
bit allow;
bit yes;
bit flag;
bit temp;
bit flag_voice;
bit key_flag;
uchar num_voice;
uchar num;
uchar num_sec,num_secflag;
uchar num_hours,num_hourg,num_minis,num_minig;
uchar num_hoursclock,num_hourgclock,num_minisclock,num_minigclock;
uchar i,j;
uchar times;
uchar num_hourf;
uchar num_key;
uchar pres;
uint upmost1=500;
uint upmost2=50000;
/*uchar code table_du[]={ //0-9的共阴极代码
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40
};
uchar data_dis[5]={0x00,0x00,0x00,0x00,0x00};
uchar scan_con[]={0xfe,0xfd,0xfb,0xf7,0xef}; //数码管位选码 */
uchar code table_du[]={ //0-9的共阴极代码
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xbf
};
uchar data_dis[5]={0x00,0x00,0x00,0x00,0x00};
uchar scan_con[]={0x01,0x02,0x04,0x08,0x10};
//uchar scan_con[]={0xfe,0xfd,0xfb,0xf7,0xef}; //数码管位选码共阴极
void delay(uchar x)//正常显示用延时子函数和消除抖动用延时函数
{
uchar i,j;
for(i=x;i>0;i--)
for(j=200;j>0;j--);
}
void display_wait1()//等待时显示P
{
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
//P0=0x73; //display of P
P0=0x8c;
choose_du=1;
choose_du=0;
//P0=0xe4; //1110 0100 最低位是最左边的数码管
P0=0x1b;
choose_we=1;
choose_we=0;
delay(3);
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
//P0=0x40;
P0=0xbf;
choose_du=1;
choose_du=0;
//P0=0xfb; //1111 1011
P0=0x04;
choose_we=1;
choose_we=0;
delay(3);
}
void display_wait2()//等待时不显示
{
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
delay(3);
}
void display_scan()//扫描的显示方式一定程度上减少了程序的长度
{ //显示函数
uchar k;
data_dis[0]=num_hours;
data_dis[1]=num_hourg;
data_dis[2]=10;
data_dis[3]=num_minis;
data_dis[4]=num_minig;
for(k=0;k<5;k++)
{
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
P0=table_du[data_dis[k]];
choose_du=1;
choose_du=0;
P0=scan_con[k];
choose_we=1;
choose_we=0;
delay(3);
}
}
void display_ss(uchar x)
{
data_dis[0]=num_hours;
data_dis[1]=num_hourg;
data_dis[3]=num_minis;
data_dis[4]=num_minig;
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
P0=table_du[data_dis[x]];
choose_du=1;
choose_du=0;
P0=scan_con[x];
choose_we=1;
choose_we=0;
delay(3);
}
void displayclock(uchar hours,uchar hourg,uchar minis,uchar minig)
{ //设置时钟时的动态显示函数
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
P0=table_du[hours];
choose_du=1;
choose_du=0;
//P0=0xfe;
P0=0x01;
choose_we=1;
choose_we=0;
delay(3);
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
P0=table_du[hourg];
choose_du=1;
choose_du=0;
//P0=0xfd;
P0=0x02;
choose_we=1;
choose_we=0;
delay(3);
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
//P0=0x40;
P0=0xbf;
choose_du=1;
choose_du=0;
//P0=0xfb;
P0=0x04;
choose_we=1;
choose_we=0;
delay(3);
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
P0=table_du[minis];
choose_du=1;
choose_du=0;
//P0=0xf7;
P0=0x08;
choose_we=1;
choose_we=0;
delay(3);
//P0=0xff;
P0=0x00;
choose_we=1;
choose_we=0;
P0=table_du[minig];
choose_du=1;
choose_du=0;
//P0=0xef;
P0=0x10;
choose_we=1;
choose_we=0;
delay(3);
}
void statedisplay(uchar du,uchar we) //设置时钟时的静态显示函数
{
P0=table_du[du];
choose_du=1;
choose_du=0;
P0=we;
choose_we=1;
choose_we=0;
}
void settime_minig() //可不可以用一个循环的方式呢?
{ //分个位调整函数
uchar umost=16;
while(1)
{
umost--;
for(i=0;i<185;i++)
{
display_ss(4);
}
for(i=0;i<185;i++)
{
display_wait2();
}
if(s3==0)
{
delay(10);
if(s3==0)
{
num_minig++;
if(num_minig==10)
num_minig=0;
}
while(!s3);
umost=16;
}
if(s2==0)
{
delay(10);
if(s2==0)
yes=1;
}
while(!s2);
if((umost==0)|yes)
{
yes=0;
break;
}
}
}
void settime_minis() //分十位时间调整函数
{
uchar umost=16;
while(1)
{
umost--;
for(i=0;i<185;i++)
{
display_ss(3);
}
for(i=0;i<185;i++)
{
display_wait2();
}
if(s3==0)
{
delay(10);
if(s3==0)
{
num_minis++;
if(num_minis==6)
num_minis=0;
}
while(!s3);
umost=16;
}
if(s2==0)
{
delay(10);
if(s2==0)
yes=1;
}
while(!s2);
if((umost==0)|yes)
{
yes=0;
break;
}
}
}
void settime_hourg() //小时个位时间调整函数
{
uchar umost=16;
while(1)
{
umost--;
for(i=0;i<185;i++)
{
display_ss(1);
}
for(i=0;i<185;i++)
{
display_wait2();
}
if(s3==0)
{
delay(10);
if(s3==0)
{
num_hourg++;
if(num_hourg==10)
num_hourg=0;
}
while(!s3);
umost=16;
}
if(s2==0)
{
delay(10);
if(s2==0)
yes=1;
}
while(!s2);
if((umost==0)|yes)
{
yes=0;
break;
}
}
}
void settime_hours() //小时十位时间调整函数
{
uchar umost=16;
while(1)
{
umost--;
for(i=0;i<185;i++)
{
display_ss(0);
}
for(i=0;i<185;i++)
{
display_wait2();
}
if(s3==0)
{
delay(10);
if(s3==0)
{
num_hours++;
if(num_hours==3)
num_hours=0;
}
while(!s3);
umost=16;
}
if(s2==0)
{
delay(10);
if(s2==0)
yes=1;
}
while(!s2);
if((umost==0)|yes)
{
yes=0;
flag=1;
temp=1;
break;
}
}
}
void settime() //时间设置子函数
{
if(s2==0)
{
delay(10);
if(s2==0)
num_key=1;
key_flag=1;
//while(!s2); //waiting for relase
} //工程应用中这种等待的方式一般是不允许的
if(key_flag==1) //如果有声音的话,因为,执行while(!s2)语音因为CPUb不能执行而中断了
{ //本程序中所有的whlie(!s2)或while(!s3)都必须改正
if(s2==1)
{
delay(10);
if(s2==1)
{
key_flag=0;
switch(num_key)
{
case 1: settime_minig();
case 2: settime_minis();
case 3: settime_hourg();
case 4: settime_hours();
}
}
}
}
}
void setclock() //闹钟的设定 ,连击键的问题如何使用?
{
if(s3==0)
{
delay(10);
if(s3==0)
pres=1;
while(!s3);
while(1)
{
upmost1--;
displayclock(num_hoursclock,num_hourgclock,num_minisclock,num_minigclock);
if(s3==0)
{
delay(10);
if(s3==0)
yes=1;
}
while(!s3);
if(upmost1==0|yes==1)
{
upmost1=500;
yes=0;
break;
}
}
switch(pres)
{
case 1: while(1)
{
upmost2--;
//statedisplay(num_minigclock,0xef);
statedisplay(num_minigclock,0x10);
if(s2==0)
{
delay(10);
if(s2==0)
{
num_minigclock++;
if(num_minigclock==10)
num_minigclock=0;
}
while(!s2);
upmost2=50000;
}
if(s3==0)
{
delay(10);
if(s3==0)
yes=1;
}
while(!s3);
if(upmost2==0|yes==1)
{
upmost2=50000;
yes=0;
break;
}
}
case 2: while(1)
{
upmost2--;
//statedisplay(num_minisclock,0xf7);
statedisplay(num_minisclock,0x08);
if(s2==0)
{
delay(10);
if(s2==0)
{
num_minisclock++;
if(num_minisclock==6)
num_minisclock=0;
}
while(!s2);
upmost2=50000;
}
if(s3==0)
{
delay(10);
if(s3==0)
yes=1;
}
while(!s3);
if(upmost2==0|yes==1)
{
upmost2=50000;
yes=0;
break;
}
}
case 3: while(1)
{
upmost2--;
//statedisplay(num_hourgclock,0xfd);
statedisplay(num_hourgclock,0x04);
if(s2==0)
{
delay(10);
if(s2==0)
{
num_hourgclock++;
if((num_hourgclock==10)&&(num_hoursclock<2))
num_hourgclock=0;
else if((num_hoursclock==2)&&(num_hourgclock==4))
num_hourgclock=0;
}
while(!s2);
upmost2=50000;
}
if(s3==0)
{
delay(10);
if(s3==0)
yes=1;
}
while(!s3);
if(upmost2==0|yes==1)
{
upmost2=50000;
yes=0;
break;
}
}
case 4: while(1)
{
upmost2--;
//statedisplay(num_hoursclock,0xfe);
statedisplay(num_hoursclock,0x01);
if(s2==0)
{
delay(10);
if(s2==0)
{
num_hoursclock++;
if(num_hoursclock==3)
num_hoursclock=0;
}
while(!s2);
upmost2=50000;
}
if(s3==0)
{
delay(10);
if(s3==0)
yes=1;
}
while(!s3);
if(upmost2==0|yes==1)
{
upmost2=50000;
yes=0;
break;
}
}
}
}
}
void voice()//整点报时子函数
{
if((num_minis*10+num_minig==3)&&(!allow))
{
flag_voice=1;
if((num_hours*10+num_hourg)>=13)
num_hourf=num_hours*10+num_hourg-12;
else
num_hourf=num_hours*10+num_hourg;
if(num_voice==20)
{
num_voice=0;
beep_f=~beep_f;
if(beep_f==1)
{
beep=0;
times++;
}
else
beep=1;
if(times-1==num_hourf)//报时次数
{
times=0;
allow=1;
beep=1;
flag_voice=0;
}
}
}
if(num_minis*10+num_minig!=3)
{allow=0;}
}
void voice_clock()//闹钟报时子程序
{
if((num_hours==num_hoursclock)&&(num_hourg==num_hourgclock)&&(num_minis==num_minisclock)&&(num_minig==num_minigclock))
{
if(num_secflag<=5)
beep=0;
else
{
num_secflag=6;
beep=1;
}
}
}
void init_sys() //系统初始化
{
num_sec=0;
num_hours=0;
num_hourg=0;
num_minis=0;
num_minig=0;
}
void init_timer2() //定时器2初始化
{
RCAP2H=0x4c;
RCAP2L=0x00;
EA=1;
ET2=1;
TR2=1;
}
void timer2() interrupt 5 using 0 //定时器2中断函数
{
TF2=0;
num++;
if(flag_voice)
{
num_voice++;
}
if(num==20)
{
num=0;
P1=~P1;
num_sec++;
num_secflag++;
if(num_sec==60)
{
num_sec=0;
num_secflag=0;
num_minig++;
if(num_minig==10)
{
num_minig=0;
num_minis++;
if(num_minis==6)
{
num_minis=0;
num_hourg++;
if((num_hours<2)&&(num_hourg==10))
{
num_hourg=0;
num_hours++;
}
else if((num_hours==2)&&(num_hourg<4))
num_hourg=0;
else if((num_hours==2)&&(num_hourg==4))
{
num_hours=0;
num_hourg=0;
}
}
}
}
}
}
void main() //主函数
{
init_sys();
//delay(3);//0.0013
//delay(10);
while(1)
{
if(!flag)//待机显示P 并闪烁
{
for(i=0;i<185;i++)
display_wait1();
for(j=0;j<185;j++)
display_wait2();
settime();//时间设置
if(temp)
init_timer2();
}
else if(flag)//正常显示时间
{
display_scan();
settime();//时间调整
setclock();//设置闹钟
voice_clock();//闹钟报时
voice();//整点报时
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -