📄 main.lst
字号:
171 {
172 1 switch(attr)
173 1 { case 0xff:
174 2 if(show_status==1)show_status=3; //如果当前显示日期 切换到调准日期状态
175 2 if(show_status==2)show_status=4; //如果当前显示时间 切换到调准时间状态
176 2 attr=0x3f; break; //第一、二个数码管闪烁
177 2 case 0x3f: attr=0xcf; break; //第三、四个数码管闪烁
178 2 case 0xcf: attr=0xf3; break; //第五、六个数码管闪烁
179 2 case 0xf3: if(show_status==0) attr=0xfd; //第七个数码管闪烁
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 4
180 2 if(show_status==3) {show_status=1; attr=0xff;} //恢复正常显示日期
181 2 if(show_status==4) {show_status=2; attr=0xff;} //恢复正常显示时间
182 2 break;
183 2 case 0xfd: if(show_status==0) attr=0xfe; //第八个数码管闪烁
184 2 break;
185 2 case 0xfe: if(show_status==0) attr=0x3f; //第一、二个数码管闪烁
186 2 }
187 1 }
188 ///////////////////////////////////////////////////////////////////////
189 void SetInc(void) //轮换调节函数
190 {
191 1 switch(attr)
192 1 {
193 2 case 0xff: if(show_status==1) show_status=2; //在显示时间与日期间切换
194 2 else if(show_status==2) show_status=1;
195 2 break;
196 2 case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;
197 2 else if(show_status==3)
198 2 year=(year+1)%50; //当前日期的"年"加1
199 2 else if(show_status==4)
200 2 hour=(hour+1)%24; //当前时间的"时"加1
201 2 break;
202 2 case 0xcf: if(show_status==0) //闹钟设置的"时"加1
203 2 alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;
204 2 else if(show_status==3)
205 2 {
206 3 month++; //当前日期的"月"加1
207 3 if(month==13) month=1;
208 3 }
209 2 else if(show_status==4)
210 2 min=(min+1)%60; //当前时间的"分"加1
211 2 break;
212 2 case 0xf3: if(show_status==0)
213 2 alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;
214 2 else if(show_status==3)
215 2 {
216 3 day++; //当前日期的"日"加1
217 3 if(day==32) day=1; }
218 2 else if(show_status==4)
219 2 {
220 3 count_down=8000;
221 3 sec=(sec+1)%60;
222 3 } //当前时间的"秒"加1
223 2 break;
224 2 case 0xfd: if(show_status==0)alarm_wk^=0x1<<cur_alarm_set; //周末标志位切换
225 2 break;
226 2 case 0xfe: if(show_status==0)alarm_en^=0x1<<cur_alarm_set; //启用标志位切换
227 2 break;
228 2 }
229 1 }
230 ////////////////////////////////////////////////////////////////////////
231 void SetReduce()
232 {
233 1 char tmp;
234 1 switch(attr)
235 1 { case 0xff: if(show_status==1 || show_status==2)
236 2 led_on=~led_on; //打开或关闭数码管显示
237 2 break;
238 2 case 0x3f: if(show_status==0) //如果正在设置闹钟
239 2 { if(cur_alarm_set==0) cur_alarm_set=7;
240 3 else cur_alarm_set--;}
241 2 else if(show_status==3) //当前日期的"年"减1
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 5
242 2 { if(year==0) year=49; else year--; }
243 2 else if(show_status==4) //当前时间的"时"减1
244 2 { tmp=hour-1; if(tmp<0) hour=23; else hour=tmp; }
245 2 break;
246 2 case 0xcf: if(show_status==0) //闹钟设置的"时"减1
247 2 { tmp=alarm[cur_alarm_set].h-1;
248 3 if(tmp<0) alarm[cur_alarm_set].h=23;
249 3 else alarm[cur_alarm_set].h=tmp;
250 3 }
251 2 else if(show_status==3)
252 2 { month--; //当前日期的"月"减1
253 3 if(month==0) month=12; }
254 2 else if(show_status==4)
255 2 { tmp=min-1; //当前时间的"分"减1
256 3 if(tmp<0) min=59; else min=tmp; }
257 2 break;
258 2 case 0xf3: if(show_status==0) //闹钟设置的"分钟"减1
259 2 { tmp=alarm[cur_alarm_set].m-1;
260 3 if(tmp<0) alarm[cur_alarm_set].m=59;
261 3 else alarm[cur_alarm_set].m=tmp;
262 3 }
263 2 else if(show_status==3)
264 2 { day--; //当前日期的"日"减1
265 3 if(day==0) day=31; }
266 2 else if(show_status==4)
267 2 { tmp=sec-1; //当前时间的"秒"减1
268 3 count_down=8000;
269 3 if(tmp<0) sec=59; else sec=tmp; }
270 2 break;
271 2 case 0xfd: if(show_status==0) //切换周末标志
272 2 alarm_wk^=0x1<<cur_alarm_set;
273 2 break;
274 2 case 0xfe: if(show_status==0) //切换启用标志
275 2 alarm_en^=0x1<<cur_alarm_set;
276 2 } //end of switch(attr)
277 1 return;
278 1 }
279 ////////////////////////////////////////////////////////////////////////
280 void SetAlarm() //第一个按钮
281 {
282 1 //如果闹钟正响,按此键停止
283 1 if(sound)
284 1 {
285 2 alarm_stop=1;
286 2 sound=0;
287 2 }
288 1 //正显示日期或时间 进入闹钟设置
289 1 else if((show_status==1 || show_status==2) && led_on)
290 1 {
291 2 show_status=0;
292 2 cur_alarm_set=0;
293 2 attr=0x3f;
294 2 }
295 1 //如正在设置闹钟时间项 返回当前时间显示
296 1 else if(show_status==0)
297 1 {
298 2 show_status=2;
299 2 new_alarm_info=1;
300 2 attr=0xff;
301 2 }
302 1 }
303 ////////////////////////////////////////////////////////////////////////
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 6
304 void Timer0ISR(void) interrupt 1 using 3 //定时器0中断程序,用于走时,1/8000秒一次
305 {
306 1 unsigned char tmp,tmp_days;
307 1 count_down--;
308 1 if(count_down==1 || count_down==2001 || count_down==4001 || count_down==6001)
309 1 { flash=~flash; //数码管闪烁的开关量
310 2 if(sound && flash) sound_output=0; //驱动蜂鸣器
311 2 else sound_output=1; //关闭蜂鸣器
312 2 return;
313 2 }
314 1
315 1 /*** 计算当前日期为星期几***/
316 1 if(count_down==3000)
317 1 { if(year==0) weekday=5; //2000年1月1日为星期六
318 2 else { tmp=(year-1)/4+1; tmp=(year-tmp)+tmp*2;
319 3 weekday=(tmp+5)%7; //计算出当前年的1月1日为星期几
320 3 }
321 2 tmp_days=0;
322 2 for(tmp=1;tmp<month;tmp++)
323 2 if(tmp==1 || tmp==3 || tmp==5 || tmp==7 || tmp==8 || tmp==10)
324 2 tmp_days=tmp_days+31;
325 2 else if(tmp==4 || tmp==6 || tmp==9 || tmp==11)
326 2 tmp_days=tmp_days+30;
327 2 else if(tmp==2)
328 2 { if(year%4==0) tmp_days=tmp_days+29;
329 3 else tmp_days=tmp_days+28;
330 3 }
331 2 tmp_days=tmp_days+day-1; weekday=(weekday+tmp_days%7)%7+1;
332 2 return;
333 2 }
334 1 /*** 查询是否有闹钟时间项符合触发条件 ***/
335 1 if(count_down==5000)
336 1 { if((alarm_stop || sound) && alarm[cur_alarm_active].m!=min) //触发后1分钟
337 2 { alarm_stop=0; sound=0; } //自动关蜂鸣器
338 2
339 2 if(sound==0 && alarm_stop==0) //没有已触发的闹钟项
340 2 for(tmp=0;tmp<8;tmp++) //则查询8个闹钟项内是否有符合条件的
341 2 { if(((alarm_en>>tmp)&1)==0) continue; //该闹钟项不启用
342 3 if(((alarm_wk>>tmp)&1)==1) //该闹钟项周末有效
343 3 { if(weekday!=6 && weekday!=7) continue; } //当前不是星期六或星期天
344 3 else
345 3 { if(weekday==6 || weekday==7) continue; }
346 3
347 3 if(alarm[tmp].h==hour && alarm[tmp].m==min) //比较当前时间与该
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -