📄 lcd1602.lst
字号:
406 5 write_nyr(6,yue);//令LCD在正确的位置显示"加"设定好的月份数据
407 5 temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
408 5 write_1302(0x8e,0x00);//允许写,禁止写保护
409 5 write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
410 5 write_1302(0x8e,0x80);//打开写保护
411 5 write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
412 5 break;
413 5 case 7:nian++;
414 5 if(nian==100)
415 5 nian=0;
416 5 write_nyr(3,nian);//令LCD在正确的位置显示"加"设定好的年份数据
417 5 temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
418 5 write_1302(0x8e,0x00);//允许写,禁止写保护
419 5 write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
420 5 write_1302(0x8e,0x80);//打开写保护
421 5 write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
422 5 break;
423 5
424 5
425 5 }
426 4
427 4 }
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 8
428 3
429 3 }
430 2 //------------------减键key3,各句功能参照'加键'注释---------------
431 2 if(key3==0)
432 2 {
433 3 delay(10);//调延时,消抖动
434 3 if(key3==0)
435 3 {
436 4 buzzer=0;//蜂鸣器短响一次
437 4 delay(20);
438 4 buzzer=1;
439 4 while(!key3);
440 4 switch(key1n)
441 4 {
442 5 case 1:miao--;
443 5 if(miao==-1)
444 5 miao=59;//秒数据减到-1时自动变成59
445 5 write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数
446 5 temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
447 5 write_1302(0x8e,0x00); //允许写,禁止写保护
448 5 write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
449 5 write_1302(0x8e,0x80); //打开写保护
450 5 write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
451 5 //write_1602com(0x0b);
452 5 break;
453 5 case 2:fen--;
454 5 if(fen==-1)
455 5 fen=59;
456 5 write_sfm(5,fen);
457 5 temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
458 5 write_1302(0x8e,0x00);//允许写,禁止写保护
459 5 write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
460 5 write_1302(0x8e,0x80);//打开写保护
461 5 write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
462 5 break;
463 5
464 5 case 3:shi--;
465 5 if(shi==-1)
466 5 shi=23;
467 5 write_sfm(2,shi);
468 5 temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
469 5 write_1302(0x8e,0x00);//允许写,禁止写保护
470 5 write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
471 5 write_1302(0x8e,0x80);//打开写保护
472 5 write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
473 5 break;
474 5 case 4:week--;
475 5 if(week==0)
476 5 week=7;
477 5
478 5 write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
479 5 write_week(week);//指定周数据显示内容
480 5 temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
481 5 write_1302(0x8e,0x00);//允许写,禁止写保护
482 5 write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
483 5 write_1302(0x8e,0x80);//打开写保护
484 5 write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
485 5 break;
486 5 case 5:ri--;
487 5 if(ri==0)
488 5 ri=31;
489 5 write_nyr(9,ri);
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 9
490 5 temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
491 5 write_1302(0x8e,0x00);//允许写,禁止写保护
492 5 write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
493 5 write_1302(0x8e,0x80);//打开写保护
494 5 write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
495 5 break;
496 5 case 6:yue--;
497 5 if(yue==0)
498 5 yue=12;
499 5 write_nyr(6,yue);
500 5 temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
501 5 write_1302(0x8e,0x00);//允许写,禁止写保护
502 5 write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
503 5 write_1302(0x8e,0x80);//打开写保护
504 5 write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
505 5 break;
506 5 case 7:nian--;
507 5 if(nian==-1)
508 5 nian=99;
509 5 write_nyr(3,nian);
510 5 temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
511 5 write_1302(0x8e,0x00);//允许写,禁止写保护
512 5 write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
513 5 write_1302(0x8e,0x80);//打开写保护
514 5 write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
515 5 break;
516 5
517 5
518 5 }
519 4
520 4 }
521 3
522 3 }
523 2
524 2 }
525 1
526 1
527 1 }
528
529 //-------------------------------
530 void init() //定时器、计数器设置函数
531 {
532 1 TMOD=0x11; //指定定时/计数器的工作方式为3
533 1 TH0=0; //定时器T0的高四位=0
534 1 TL0=0; //定时器T0的低四位=0
535 1 EA=1; //系统允许有开放的中断
536 1 ET0=1; //允许T0中断
537 1 TR0=1; //开启中断,启动定时器
538 1
539 1 }
540
541
542
543 //*******************主函数**************************
544 //***************************************************
545 void main()
546 {
547 1 lcd_init(); //调用液晶屏初始化子函数
548 1 ds1302_init(); //调用DS1302时钟的初始化子函数
549 1 init(); //调用定时计数器的设置子函数
550 1 led=0; //打开LCD的背光电源
551 1 buzzer=0;//蜂鸣器长响一次
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 10
552 1 delay(80);
553 1 buzzer=1;
554 1 while(1) //无限循环下面的语句:
555 1 {
556 2
557 2 keyscan(); //调用键盘扫描子函数
558 2
559 2 }
560 1 }
561
562
563 void timer0() interrupt 1 //取得并显示日历和时间
564 {
565 1
566 1 //Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
567 1 flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示
568 1
569 1 //读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):
570 1
571 1
572 1 miao = BCD_Decimal(read_1302(0x81));
573 1 fen = BCD_Decimal(read_1302(0x83));
574 1 shi = BCD_Decimal(read_1302(0x85));
575 1 ri = BCD_Decimal(read_1302(0x87));
576 1 yue = BCD_Decimal(read_1302(0x89));
577 1 nian=BCD_Decimal(read_1302(0x8d));
578 1 week=BCD_Decimal(read_1302(0x8b));
579 1
580 1 //显示温度、秒、时、分数据:
581 1
582 1 write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
583 1 write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
584 1 write_sfm(5,fen);//分,从第二行第5个字符后开始显示
585 1 write_sfm(2,shi);//小时,从第二行第2个字符后开始显示
586 1
587 1 //显示日、月、年数据:
588 1 write_nyr(9,ri);//日期,从第二行第9个字符后开始显示
589 1 write_nyr(6,yue);//月份,从第二行第6个字符后开始显示
590 1 write_nyr(3,nian);//年,从第二行第3个字符后开始显示
591 1 write_week(week);
592 1
593 1 }
594
595
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1957 ----
CONSTANT SIZE = 21 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -