📄 clock.c
字号:
display[3]=alarm[cur_alarm_set].h%10;
display[4]=alarm[cur_alarm_set].m/10;
display[5]=alarm[cur_alarm_set].m%10;
display[6]=(alarm_wk>>cur_alarm_set)&1;
display[7]=(alarm_en>>cur_alarm_set)&1;
}
if(show_status==1 || show_status==3) //当前显示或设置日期
{
display[0]=year/10;
display[1]=year%10;
display[2]=month/10;
display[3]=month%10;
display[4]=day/10;
display[5]=day%10;
display[6]=0xf;
display[7]=weekday;
}
if(show_status==2 || show_status==4) //当前显示或设置时间
{
display[0]=hour/10;
display[1]=hour%10;
display[2]=min/10;
display[3]=min%10;
display[4]=sec/10;
display[5]=sec%10;
display[6]=0xf;
display[7]=0xf;
} //最后两位无显示
/*** 按键扫描及处理 ***/
keytmp=~(P1) & 0x0f;
if(keytmp==0) //zm无按键
{
km=0;
kp=0;
}
else {
if(km==0)
km=1;
else{
if(kp==0)
{
kp=1;
if(keytmp==1) //第一个按钮
{
if(sound)
{
alarm_stop=1; sound=0;
} //如果闹钟正响,按此键停止
else if((show_status==1 || show_status==2) && led_on) //正显示日期或时间
{
show_status=0; cur_alarm_set=0; attr=0x3f;
} //进入闹钟设置
else if(show_status==0) //如正在设置闹钟时间项
{
show_status=2; new_alarm_info=1; attr=0xff;
} //返回当前时间显示
return;
}
if(keytmp==2 && led_on) //第二个按钮,仅当数码管打开时有效
{
switch(attr)
{
case 0xff: if(show_status==1) show_status=2; //在显示时间与日期间切换
else if(show_status==2) show_status=1; break;
case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;
else if(show_status==3)
year=(year+1)%50; //当前日期的"年"加1,到50时归零。
else if(show_status==4)
hour=(hour+1)%24; //当前时间的"时"加1,到24时归零。
break;
case 0xcf: if(show_status==0) //闹钟设置的"时"加1
alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;
else if(show_status==3)
{
month++; //当前日期的"月"加1
if(month==13)
month=1;
}
else if(show_status==4)
min=(min+1)%60; //当前时间的"分"加1
break;
case 0xf3: if(show_status==0)
alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;
else if(show_status==3)
{
day++; //当前日期的"日"加1
if(day==32)
day=1;
}
else if(show_status==4)
{
count_down=8000;
sec=(sec+1)%60;
} //当前时间的"秒"加1
break;
case 0xfd: if(show_status==0)
alarm_wk^=0x1<<cur_alarm_set; //周末标志位切换
break;
case 0xfe: if(show_status==0)
alarm_en^=0x1<<cur_alarm_set; //启用标志位切换
}
return;
}
if(keytmp==4) //第三个按钮
{
switch(attr)
{
case 0xff: if(show_status==1 || show_status==2)
led_on=~led_on; //打开或关闭数码管显示
break;
case 0x3f: if(show_status==0) //如果正在设置闹钟
{
if(cur_alarm_set==0) cur_alarm_set=7;
else cur_alarm_set--;
}
else if(show_status==3) //当前日期的"年"减1
{
if(year==0)
year=49;
else year--;
}
else if(show_status==4) //当前时间的"时"减1
{
tmp=hour-1;
if(tmp<0) hour=23;
else hour=tmp;
}
break;
case 0xcf: if(show_status==0) //闹钟设置的"时"减1
{
tmp=alarm[cur_alarm_set].h-1;
if(tmp<0)
alarm[cur_alarm_set].h=23;
else alarm[cur_alarm_set].h=tmp;
}
else if(show_status==3)
{
month--; //当前日期的"月"减1
if(month==0)
month=12;
}
else if(show_status==4)
{
tmp=min-1; //当前时间的"分"减1
if(tmp<0)
min=59;
else min=tmp; }
break;
case 0xf3: if(show_status==0) //闹钟设置的"分钟"减1
{
tmp=alarm[cur_alarm_set].m-1;
if(tmp<0) alarm[cur_alarm_set].m=59;
else alarm[cur_alarm_set].m=tmp;
}
else if(show_status==3)
{
day--; //当前日期的"日"减1
if(day==0)
day=31;
}
else if(show_status==4)
{
tmp=sec-1; //当前时间的"秒"减1
count_down=4000;
if(tmp<0)
sec=59;
else sec=tmp;
}
break;
case 0xfd: if(show_status==0) //切换周末标志
alarm_wk^=0x1<<cur_alarm_set;
break;
case 0xfe: if(show_status==0) //切换启用标志
alarm_en^=0x1<<cur_alarm_set;
}
return;
}
if(keytmp==8 & led_on) //第四个按钮,仅当数码管打开时有效
{
switch(attr)
{
case 0xff: if(show_status==1) //如果当前显示日期
show_status=3; //切换到调准日期状态
else if(show_status==2) //如果当前显示时间
show_status=4; //切换到调准时间状态
attr=0x3f; break; //第一?二个数码管闪烁
case 0x3f: attr=0xcf; break; //第三?四个数码管闪烁
case 0xcf: attr=0xf3; break; //第五?六个数码管闪烁case 0xf3: if(show_status==0)
case 0xf3: if(show_status==0) attr=0xfd; //第七个数码管闪烁
else if(show_status==3)
{
show_status=1;
attr=0xff;
} //恢复正常显示日期
else if(show_status==4)
{
show_status=2;
attr=0xff;
} //恢复正常显示时间
break;
case 0xfd: if(show_status==0) attr=0xfe; //第八个数码管闪烁
break;
case 0xfe: if(show_status==0) attr=0x3f; //第一?二个数码管闪烁
}
} // end of if(keytmp==4)
} // end of if(kp==0)
} // end of if(km==0)
} // end of if(keytmp!=0)
}
//以下是主函数
main()
{
unsigned char i;hour=23; min=59; sec=30; year=8; month=4; day=2;
count_down=4000;
flash=0; attr=0xff; led_on=1;
km=0; kp=0; show_status=2; //加电后显示当前时间
new_alarm_info=0; sound=0; alarm_stop=0;
for(i=0;i<8;i++) //从EEPROM中读入8个闹钟设置
{
alarm[2].h=0;//zm
alarm[2].m=0;//zm
alarm[i].h=myread(i*2);
alarm[i].m=myread(i*2+1);
}
alarm_en=myread(i*2);
alarm_wk=myread(i*2+1);
IE=0;
IP=0; //禁止所有中断
TMOD=0x12; //定时器0为模式2,定时器1为模式1
TH0=6;
TL0=6; //定时器0为0.125ms
TH1=0x15;
TL1=0xa0; //定时器1为30ms
TR0=1; TR1=1; //启动定时器0和定时器1
ET0=1;
ET1=1;
EA=1; //开定时器0中断?定时器1中断和总中断
while(1)
{
if(led_on)
for(i=0;i<8;i++)
{
//P2=0;
P2=0xff;//zm
if(flash || attr&(0x80>>i))
{
P0=display[i]; //zm原无[i] ,显示不正常,均为0 //
P2=~(0x80>>i); DelayX1ms(1);
}
}
else P2=0xff;//zmP2=0;
if(new_alarm_info)
{
P2=0; //暂时关闭数码管
new_alarm_info=0; //写入EEPROM
for(i=0;i<8;i++)
{
mywrite(i*2,alarm[i].h);
mywrite(i*2+1,alarm[i].m);
}
mywrite(i*2,alarm_en);
mywrite(i*2+1,alarm_wk);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -