📄 ds1302+lcd1602-c51.lst
字号:
258 //读的子函数
259 /**********************************************************/
260 uchar read_byte() //sclk的下跳沿读数据
261 {
262 1 uchar i,temp=0;
263 1 io=1; //设置为输入口
264 1 for(i=0;i<7;i++)
265 1 {
266 2 sclk=0;
267 2 if(io==1)
268 2 temp=temp|0x80;
269 2 else
270 2 temp=temp&0x7f;
271 2 sclk=1; //产生下跳沿
272 2
273 2 temp=temp>>1;
274 2 }
275 1 return (temp);
276 1 }
277
278 /**********************************************************/
279 // 往ds1302的某个地址写入数据
280 /**********************************************************/
281 void write_ds1302(uchar cmd,uchar indata)
282 {
283 1 sclk=0;
284 1 reset=1;
285 1 write_byte(cmd);
286 1 write_byte(indata);
287 1
288 1 sclk=0;
289 1 reset=0;
290 1 }
291
292 /**********************************************************/
293 // 读ds1302某地址的的数据
294 /**********************************************************/
295 uchar read_ds1302(uchar addr)
296 {
297 1 uchar backdata;
298 1 sclk=0;
299 1 reset=1;
300 1
301 1 write_byte(addr); //先写地址
302 1 backdata=read_byte(); //然后读数据
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 6
303 1
304 1 sclk=0;
305 1 reset=0;
306 1 return (backdata);
307 1 }
308
309 /**********************************************************/
310 // 设置初始时间
311 /**********************************************************/
312 void set_ds1302(uchar addr,uchar *p,uchar n) //写入n个数据
313 {
314 1 write_ds1302(0x8e,0x00); //写控制字,允许写操作
315 1 for(;n>0;n--)
316 1 {
317 2 write_ds1302(addr,*p);
318 2 p++;
319 2 addr=addr+2;
320 2 }
321 1 write_ds1302(0x8e,0x80); //写保护,不允许写
322 1 }
323
324 /**********************************************************/
325 // 读取当前时间
326 /**********************************************************/
327 void read_nowtime(uchar addr,uchar *p,uchar n) //读出N个数据
328 {
329 1 for(;n>0;n--)
330 1 {
331 2 *p=read_ds1302(addr);
332 2 p++;
333 2 addr=addr+2;
334 2 }
335 1 }
336
337 /**********************************************************/
338 // 初始化DS1302
339 /**********************************************************/
340 void init_ds1302()
341 {
342 1 reset=0;
343 1 sclk=0;
344 1 write_ds1302(0x80,0x00);
345 1 write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电
346 1 write_ds1302(0x8e,0x80); //写保护控制字,禁止写
347 1 }
348
349 /**********************************************************/
350 /* */
351 /* 蜂鸣器响一声 */
352 /* */
353 /**********************************************************/
354 void beep()
355 {
356 1 unsigned char y;
357 1 for (y=0;y<100;y++)
358 1 {
359 2 delay();
360 2 BEEP=!BEEP; //BEEP取反
361 2 }
362 1 BEEP=1; //关闭蜂鸣器
363 1 delay1(50);
364 1 }
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 7
365
366 /**********************************************************/
367 /* */
368 /* :闪动函数 */
369 /* */
370 /**********************************************************/
371 void flash()
372 {
373 1 if(flag)
374 1 {
375 2 write_position(2,9);
376 2 lcd_wdat(':');
377 2 write_position(2,12);
378 2 lcd_wdat(':');
379 2 }
380 1 else
381 1 {
382 2 write_position(2,9);
383 2 lcd_wdat(0x20); //写显示数据到LCD
384 2 write_position(2,12);
385 2 lcd_wdat(0x20);
386 2 }
387 1 }
388 void init_24c02(void)
389 {
390 1 int i;
391 1 for(i=0;i<8;i++)
392 1 {
393 2 Write_One_Byte(0x00+i*0x02,0x59);
394 2 Write_One_Byte(0x01+i*0x02,0x23);
395 2 }
396 1 Write_One_Byte(0xaf,0x08);
397 1 }
398
399 /**********************************************************/
400 // 主函数
401 /**********************************************************/
402 void main()
403 {
404 1
405 1 P1=0xff;
406 1 TMOD=0x01;
407 1 TH0=0x4c; //50ms定时
408 1 TL0=0x00;
409 1 EA=1;
410 1 ET0=1;
411 1 TR0=1;
412 1 init_lcd(); //初始化LCD
413 1 write_str(0x80,str1); //液晶显示提示信息
414 1 write_str(0xc0,str2); //液晶显示提示信息
415 1 init_ds1302(); //初始化ds1302
416 1 init_24c02(); //初始化24c02
417 1 writetab(); //自定义字符写入CGRAM
418 1 delay1(5);
419 1 write_position(2,16);
420 1 lcd_wdat(0x00); //显示自定义字符小喇叭
421 1
422 1 while(1)
423 1 {
424 2 //---------------------------------------------------------
425 2 if(!K1)
426 2 {
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 8
427 3 if(!K2)
428 3 {
429 4 set_ds1302(0x80,init2,7); //设置初始时间,日期,年 ,月
430 4 beep();
431 4 }
432 3
433 3 if(!K3)
434 3 {
435 4 delay1(35); //消除抖动
436 4 if(!K3)
437 4 {
-
438 5 write_str(0xc0,str3); //显示报警信息
439 5 if(alarm_flag) //alarm_flag=1,开定时
440 5 {
441 6 write_position(2,16);
442 6 lcd_wdat(0x00); //显示自定义字符小喇叭
443 6 }
444 5 write_str(0x80,str4);
445 5
446 5 k=Read_One_Byte(0xaf);
447 5 do
448 5 {
449 6 count=k;
450 6 num=1;
451 6 while(num) //写入闹钟个数
452 6 {
453 7 key_set(8,1,14);
454 7 if(!K4)
455 7 {
456 8 delay1(35);
457 8 if(!K4)
458 8 {
459 9 Set_place(1,14);
460 9 k=(init1[0]<<4|init1[1]);
461 9
462 9 Play_alarmtime(); //查看报警时间
463 9
464 9 beep();
465 9 num=0;
466 9 }
467 8 }
468 7 }
469 6
470 6 // Play_alarmtime(); //查看报警时间
471 6
472 6 }while(k>=1);
473 5 beep();
474 5 delay1(700);
475 5 write_str(0x80,str1);
476 5
477 5 write_str(0xc0,str2); //显示时间信息
478 5 if(alarm_flag) //alarm_flag=1,开定时
479 5 {
480 6 write_position(2,16);
481 6 lcd_wdat(0x00); //显示自定义字符小喇叭
482 6 }
483 5 }
484 4 }
485 3 if(!K4)
486 3 {
487 4 delay1(35); //消除抖动
C51 COMPILER V8.02 DS1302_LCD1602_C51 01/22/2008 14:37:10 PAGE 9
488 4 if(!K4)
489 4 {
490 5 // for(k=0;k<ALARM_NUM;)
491 5 // {
492 5
493 5 alarm_time(); //K4键设定报警时间
494 5
495 5 // k=k+2;
496 5 // }
497 5 if(alarm_flag) //alarm_flag=1,开定时
498 5 {
499 6 write_position(2,16);
500 6 lcd_wdat(0x00); //显示自定义字符小喇叭
501 6 }
502 5 }
503 4 }
504 3 }
505 2 //---------------------------------------------------------
506 2 if(!K4)
507 2 {
508 3 delay1(35); //消除抖动
509 3 if(!K4)
510 3 {
511 4 beep();
512 4 alarm_flag=~alarm_flag;
513 4 if(alarm_flag) //alarm_flag=1,开定时
514 4 {
515 5 write_position(2,16);
516 5 lcd_wdat(0x00); //显示自定义字符小喇叭
517 5 }
518 4 else
519 4 {
520 5 write_position(2,16);
521 5 lcd_wdat(0x20); //显示自定义字符小喇叭
522 5 }
523 4 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -