📄 main.lst
字号:
222 5 case 4: week++;
223 5 if(week==8)
224 5 week=1;
225 5 write_week(week);
226 5 write_com(0x80+12);
227 5 break;
228 5 case 5: day++;
229 5 if(day==32)
230 5 day=1;
231 5 write_nyr(9,day);
232 5 write_com(0x80+9);
233 5 break;
234 5 case 6: month++;
235 5 if(month==13)
236 5 month=1;
237 5 write_nyr(6,month);
238 5 write_com(0x80+6);
239 5 break;
240 5 case 7: year++;
241 5 if(year==100)
C51 COMPILER V8.06 MAIN 12/02/2011 20:29:24 PAGE 5
242 5 year=0;
243 5 write_nyr(3,year);
244 5 write_com(0x80+3);
245 5 break;
246 5 }
247 4 }
248 3 }
249 2 if(s3==0)
250 2 {
251 3 delay(1);
252 3 if(s3==0)
253 3 {
254 4 while(!s3);di();
255 4 switch(s1num)
256 4 {//根据功能键次数调节相应数值
257 5 case 1: miao--;
258 5 if(miao==-1)
259 5 miao=59;
260 5 write_sfm(10,miao);
261 5 write_com(0x80+0x40+10);
262 5 break;
263 5 case 2: fen--;
264 5 if(fen==-1)
265 5 fen=59;
266 5 write_sfm(7,fen);
267 5 write_com(0x80+0x40+7);
268 5 break;
269 5 case 3: shi--;
270 5 if(shi==-1)
271 5 shi=23;
272 5 write_sfm(4,shi);
273 5 write_com(0x80+0x40+4);
274 5 break;
275 5 case 4: week--;
276 5 if(week==0)
277 5 week=7;
278 5 write_week(week);
279 5 write_com(0x80+12);
280 5 break;
281 5 case 5: day--;
282 5 if(day==0)
283 5 day=31;
284 5 write_nyr(9,day);
285 5 write_com(0x80+9);
286 5 break;
287 5 case 6: month--;
288 5 if(month==0)
289 5 month=12;
290 5 write_nyr(6,month);
291 5 write_com(0x80+6);
292 5 break;
293 5 case 7: year--;
294 5 if(year==-1)
295 5 year=99;
296 5 write_nyr(3,year);
297 5 write_com(0x80+3);
298 5 break;
299 5 }
300 4 }
301 3 }
302 2 }
303 1 if(s4==0)//检测S4
C51 COMPILER V8.06 MAIN 12/02/2011 20:29:24 PAGE 6
304 1 {
305 2 delay(5);
306 2 if(s4==0)
307 2 {
308 3 flag1=~flag1;
309 3 while(!s4);di();
310 3 if(flag1==0)
311 3 {//退出闹钟设置时保存数值
312 4 flag=0;
313 4 write_com(0x80+0x40);
314 4 write_date(' ');
315 4 write_date(' ');
316 4 write_com(0x0c);
317 4 write_ds(1,miao);
318 4 write_ds(3,fen);
319 4 write_ds(5,shi);
320 4 }
321 3 else
322 3 {//进入闹钟设置
323 4 read_alarm();//读取原始数据
324 4 miao=amiao;//重新赋值用以按键调节
325 4 fen=afen;
326 4 shi=ashi;
327 4 write_com(0x80+0x40);
328 4 write_date('R');//显示标志
329 4 write_date('i');
330 4 write_com(0x80+0x40+3);
331 4 write_sfm(4,ashi);//送液晶显示闹钟时间
332 4 write_sfm(7,afen);
333 4 write_sfm(10,amiao);
334 4 }
335 3 }
336 2 }
337 1 }
338
339 void write_ds(uchar add,uchar date)
340 {//写12C887函数
341 1 dscs=0;
342 1 dsas=1;
343 1 dsds=1;
344 1 dsrw=1;
345 1 P0=add;//先写地址
346 1 dsas=0;
347 1 dsrw=0;
348 1 P0=date;//再写数据
349 1 dsrw=1;
350 1 dsas=1;
351 1 dscs=1;
352 1 }
353
354 uchar read_ds(uchar add)
355 {//读12C887函数
356 1 uchar ds_date;
357 1 dsas=1;
358 1 dsds=1;
359 1 dsrw=1;
360 1 dscs=0;
361 1 P0=add;//先写地址
362 1 dsas=0;
363 1 dsds=0;
364 1 P0=0xff;
365 1 ds_date=P0;//再读数据
C51 COMPILER V8.06 MAIN 12/02/2011 20:29:24 PAGE 7
366 1 dsds=1;
367 1 dsas=1;
368 1 dscs=1;
369 1 return ds_date;
370 1 }
371 //*---首次操作12C887时给予寄存器初始化---
372 void set_time()
373 {//首次上电初始化时间函数
374 1 write_ds(0,0);
375 1 write_ds(1,0);
376 1 write_ds(2,0);
377 1 write_ds(3,0);
378 1 write_ds(4,0);
379 1 write_ds(5,0);
380 1 write_ds(6,0);
381 1 write_ds(7,0);
382 1 write_ds(8,0);
383 1 write_ds(9,0);
384 1 }
385 //----------------------------------------*/
386 void read_alarm()
387 {//读取12C887闹钟值
388 1 amiao=read_ds(1);
389 1 afen=read_ds(3);
390 1 ashi=read_ds(5);
391 1 }
392 void main()//主函数
393 {wr=0;
394 1 init();//调用初始化函数
395 1 while(1)
396 1 {
397 2 keyscan();//按键扫描
398 2 if(flag_ri==1)//当闹钟中断时进入这里
399 2 {
400 3 di();
401 3 delay(100);
402 3 di();
403 3 delay(500);
404 3 }
405 2 if(flag==0&&flag1==0)//正常工作时进入这里
406 2 {
407 3 keyscan();//按键扫描
408 3 year=read_ds(9);//读取12C887数据
409 3 month=read_ds(8);
410 3 day=read_ds(7);
411 3 week=read_ds(6);
412 3 shi=read_ds(4);
413 3 fen=read_ds(2);
414 3 miao=read_ds(0);
415 3 write_sfm(10,miao);//送液晶显示
416 3 write_sfm(7,fen);
417 3 write_sfm(4,shi);
418 3 write_week(week);
419 3 write_nyr(3,year);
420 3 write_nyr(6,month);
421 3 write_nyr(9,day);
422 3 }
423 2 }
424 1 }
425
426 void exter() interrupt 2//外部中断1服务程序
427 { uchar c; //进入中断表示闹钟时间到,
C51 COMPILER V8.06 MAIN 12/02/2011 20:29:24 PAGE 8
428 1 flag_ri=1; //设置标志位,用以大程序中报警提示
429 1 c=read_ds(0x0c);//读取12C887的C寄存器表示响应了中断
430 1 }
431
432
433
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1454 ----
CONSTANT SIZE = 29 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 1
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -