📄 wahaha.txt
字号:
#include<at89x52.h>
#define uchar unsigned char
#define uint unsigned int
uchar led_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //存放数字0~9及"灭"的段码
/*******************************************************************************************/
/*key1_flag用来存放按键1状态,key2_flag用来存放按键2状态,glitter_flag用来控制数码管闪烁,*/
/*startalarm_flag用于保存闹钟开关状,key2_flag用来存放按键2状态,startalarm_flag用于保存闹 */
/*钟开关状态,alarmrunning_flag用来判断是否闹钟是否正在响 */
/*******************************************************************************************/
uchar key1_flag,key2_flag,glitter_flag,dispalarm_flag,startalarm_flag,alarmrunning_flag,dispwatch_flag,watchrunning_flag;
uchar lalarmnum,malarmnum,salarmnum; //*分别为长中短闹铃的响铃次数
uchar disp[6]=0; //*存放要显示字符
uchar wel[30]={10,10,10,10,10,10,0,2,0,4,3,1,10,10,10,10,10,10,0,2,0,4,1,9,10,10,10,10,10,10};
uchar second,minute,hour,second_alarm,minute_alarm,hour_alarm,second_alarm_temp,tenms_watch,second_watch,minute_watch; //*存放时分秒及闹钟的时间
unsigned long day=1,month=6,year=2005;
/********************/
/*判断每月天数子函数*/
/********************/
uchar daynum(void)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return(31);
else if(month==4||month==6||month==9||month==11)
return(30);
else if((year%4==0)&&(year%100!=0)||year%400==0) //判断是否闰年
return(29);
else
return(28);
}
/***************************************************/
/*软件延时程序,用于精度不高延时,延时时间大概为xms*/
/***************************************************/
void delayXms(uint x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}
/****************************************************/
/*显示程序,用六个数码管分别显示disp[6]数组里的数字*/
/****************************************************/
void display()
{
uint i;
uchar temp;
temp=0x01;
for(i=0;i<6;i++)
{
P0=0xff;
P2=~temp;
P0=led_code[disp[i]]; //送段码
delayXms(2);
temp=temp<<1; //移位选择点亮数码管
}
}
/****************************************/
/*放置相应的需要进行显示的字符到dips数组*/
/****************************************/
void process()
{
if(dispwatch_flag==1)
{
disp[5]=minute_watch/10;
disp[4]=minute_watch%10;
disp[3]=second_watch/10;
disp[2]=second_watch%10;
disp[1]=tenms_watch/10;
disp[0]=tenms_watch%10;
}
else if(dispalarm_flag==1) //显示闹钟标志为1,则把闹钟时间送disp数组
{
disp[5]=hour_alarm/10;
disp[4]=hour_alarm%10;
disp[3]=minute_alarm/10;
disp[2]=minute_alarm%10;
disp[1]=second_alarm/10;
disp[0]=second_alarm%10;
}
else if(key1_flag==0) //按键1标志为0,则把时分秒送disp数组
{
disp[5]=hour/10;
disp[4]=hour%10;
disp[3]=minute/10;
disp[2]=minute%10;
disp[1]=second/10;
disp[0]=second%10;
}
else if(key1_flag==1) //按键1标志为1,则把年月日送disp数组
{
disp[5]=(year%100)/10;
disp[4]=year%1000;
disp[3]=month/10;
disp[2]=month%10;
disp[1]=day/10;
disp[0]=day%10;
}
}
/*****************************************/
/*闹钟响铃类型子程序,通过参数x可响不同长*/
/*短的闹铃,其中k为响铃次数,h为响铃间隔 */
/*****************************************/
void alarmrunning(x)
{
uchar i,j,k,h;
switch(x)
{
case 4:k=1;h=15;break;
case 3:k=2;h=13;break;
case 2:k=4;h=8;break;
case 1:k=7;h=6;break;
default :;
}
for(j=0;j<k;j++)
{
P3_7=0;
for(i=0;i<h;i++)
display();
P3_7=1;
for(i=0;i<h;i++)
display();
}
}
/**********************************************************/
/*闹钟程序,响铃时间为一分钟,长响15秒,中响15秒,急响30秒*/
/**********************************************************/
void alarmclock(void)
{
if(hour==hour_alarm&&minute==minute_alarm&&second==second_alarm&&startalarm_flag==1&&key2_flag==0&&alarmrunning_flag==0)
{
lalarmnum=1;
alarmrunning_flag=1; //闹钟开始响,置标志为1
second_alarm_temp++;
}
else if(second==second_alarm_temp%60&&alarmrunning_flag==1&&lalarmnum!=0)
{
alarmrunning(3); //闹钟类型选3,为长响
second_alarm_temp++;
if(++lalarmnum==16) //长响闹钟结束,进入中响闹钟,置相应标志
{
lalarmnum=0;
malarmnum=1;
}
}
else if(second==second_alarm_temp%60&&alarmrunning_flag==1&&malarmnum!=0)
{
alarmrunning(2); //闹钟类型选2,为中响
second_alarm_temp++;
if(++malarmnum==16) //中响闹钟结束,进入急响闹钟,置相应标志
{
malarmnum=0;
salarmnum=1;
}
}
else if(second==second_alarm_temp%60&&alarmrunning_flag==1&&salarmnum!=0)
{
alarmrunning(1); //闹钟类型选1,为急响
second_alarm_temp++;
if(++salarmnum==31)
alarmrunning_flag=0; //闹钟停止时间到,置标志位为0
}
if(alarmrunning_flag==0) //如果闹钟停止,清空响铃次数
{
salarmnum=0;
malarmnum=0;
lalarmnum=0;
second_alarm_temp=second_alarm;
}
}
/********************/
/*控制数码管闪烁程序*/
/********************/
void glitterprocess(void)
{
glitter_flag++;
glitter_flag=glitter_flag%30;
if((key2_flag==1)&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0) //按键2状态标志为1,则闪烁头两个数码管
{
disp[5]=10;
disp[4]=10;
}
else if((key2_flag==2)&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0) //按键2状态标志为2,则闪烁中间两个数码管
{
disp[3]=10;
disp[2]=10;
}
else if((key2_flag==3)&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0) //按键2状态标志为3,则闪烁后两个数码管
{
disp[1]=10;
disp[0]=10;
}
else if(dispalarm_flag==1&&startalarm_flag==1&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0) //闹钟开,则闪烁六个数码管
{
disp[5]=10;
disp[4]=10;
disp[3]=10;
disp[2]=10;
disp[1]=10;
disp[0]=10;
}
}
/*void dispyear(void)
{
uint i;
disp[5]=(year%100)/10;
disp[4]=year%1000;
disp[3]=month/10;
disp[2]=month%10;
disp[1]=day/10;
disp[0]=day%10;
for(i=0;i<25;i++)
display();
disp[5]=(year/100)%10;
disp[4]=(year%100)/10;
disp[3]=year%1000;
disp[2]=month/10;
disp[1]=month%10;
disp[0]=day/10;
for(i=0;i<25;i++)
display();
disp[5]=year/1000;
disp[4]=(year/100)%10;
disp[3]=(year%100)/10;
disp[2]=year%1000;
disp[1]=month/10;
disp[0]=month%10;
for(i=0;i<300;i++)
display();
disp[5]=(year/100)%10;
disp[4]=(year%100)/10;
disp[3]=year%1000;
disp[2]=month/10;
disp[1]=month%10;
disp[0]=day/10;
for(i=0;i<25;i++)
display();
disp[5]=(year%100)/10;
disp[4]=year%1000;
disp[3]=month/10;
disp[2]=month%10;
disp[1]=day/10;
disp[0]=day%10;
for(i=0;i<25;i++)
display();
}*/
/****************************************************************/
/*键盘扫描程序,根据相应按键及长按短按,按的次数等,置相应的标志*/
/****************************************************************/
void keyscan()
{ uint i;
uint lp_flag=0;
uint temp=0;
uint dispalarm_temp;
if((P1&0x0f)!=0x0f)
{
display(); //调用显示子程序进行延时消抖
if((P1&0x04)!=0x04) //按键1按下,用于转换显示年/月/日或时/分/秒或进入闹钟时间设置
{
if( dispwatch_flag==1)
{
dispwatch_flag=0;
watchrunning_flag=0;
tenms_watch=second_watch=minute_watch=0;
if(++key1_flag==2)
key1_flag=0;
}
key2_flag=0;
dispalarm_temp=dispalarm_flag;
dispalarm_flag=0;
while((P1&0x04)!=0x04)
{
if(++temp==50) //如果按键1出现长按,则显示闹钟时间
{
if(dispalarm_temp==0)
alarmrunning(4); //响铃,表示显示的为闹钟时间
if(dispalarm_temp==1)
if(++key1_flag==2) //按键1状态为0和1,0表示显示时分秒,1表示显示年月日
key1_flag=0;
dispalarm_flag=1; //置显示闹钟时间标志
process();
}
display();
}
TR1=1; //开定时器
if(++key1_flag==2)
key1_flag=0;
}
else if((P1&0x01)!=0x01) //按键2按下,用于移位校准时间及切换闹钟开关
{
while((P1&0x01)!=0x01) //如果按键2出现长按,则判断是否进入切换闹钟开关功能
{
process();
glitterprocess();
display();
if(++temp==50) //按键2长按且当前显示为闹钟,则切换闹钟的开和关
{
if(dispalarm_flag==1)
{
lp_flag=1;
startalarm_flag=!startalarm_flag;
key2_flag=0;
alarmrunning(2); //切换闹钟开关完成,以急促闹铃提醒
}
else if(dispwatch_flag==0) //判断是否进入秒表
{
dispwatch_flag=1;
alarmrunning(4);
}
}
}
if(lp_flag==0)
{
if(++key2_flag==4)
{
key2_flag=0;
TR1=1;
}
else
{
TR1=0;
glitter_flag=0;
}
for(i=0;i<10;i++)
display();
}
}
else if((P1&0x08)!=0x08) //按键3按下,校准时间增加数字量
{
// if(dispwatch_flag==0&&dispalarm_flag==0&&key1_flag==1)
// dispyear();
if(dispwatch_flag==1)
{
watchrunning_flag=!watchrunning_flag;
while((P1&0x08)!=0x08)
{
process();
display();
}
}
else
{
while((P1&0x08)!=0x08) //如果按键3出现持续按下,则快速增加数字量
{
process();
display();
if(++temp>=50)
{
lp_flag=1;
if(alarmrunning_flag==1)
{
alarmrunning_flag=0;
alarmrunning(4);
}
else if(dispalarm_flag==1&&key2_flag==1) //快增调节闹钟时
{
if(++hour_alarm==24)
hour_alarm=0;
process();
display();
}
else if(dispalarm_flag==1&&key2_flag==2) //快增调节闹钟分
{
if(++minute_alarm==60)
minute_alarm=0;
process();
display();
}
else if(dispalarm_flag==1&&key2_flag==3) //快增调节闹钟秒
{
if(++second_alarm==60)
second_alarm=0;
process();
display();
second_alarm_temp=second_alarm;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -