📄 ds1302.lst
字号:
630 3 temp=7;
631 3 temp=temp/10*16+temp%10;
632 3 break;
633 3 case 5:
634 3 temp=Read1302(DS1302_DAY); //读取日数
635 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
636 3 temp=temp-1; //日数减1
637 3 down_flag=1;
638 3 if(temp==0)
639 3 temp=31;
640 3 temp=temp/10*16+temp%10;
641 3 break;
642 3 case 6:
643 3 temp=Read1302(DS1302_MONTH); //读取月数
644 3 temp=((temp&0x70)>>4)*10 + (temp&0x0F);
645 3 temp=temp-1; //月数减1
646 3 down_flag=1;
647 3 if(temp==0)
648 3 temp=12;
649 3 temp=temp/10*16+temp%10;
650 3 break;
651 3 case 7:
652 3 temp=Read1302(DS1302_YEAR); //读取年数
653 3 temp=((temp&0xf0)>>4)*10 + (temp&0x0F);
654 3 temp=temp-1; //年数减1
655 3 down_flag=1;
656 3 if(temp==-1)
657 3 temp=99;
658 3 temp=temp/10*16+temp%10;
659 3 break;
660 3 default:break;
661 3 }
662 2
663 2 // while(Down==0);
664 2 }
665 1 }
666
667 //**************************
668 //模式选择按键
669 //**************************
670 void Setkey()
671 {
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 12
672 1 Set=1;
673 1 if(Set==0)
674 1 {
675 2 mdelay(5);
676 2 count=count+1; //Setkey按一次,count就加1
677 2 done=1; //进入调整模式
678 2 while(Set==0);
679 2 }
680 1
681 1 }
682
683 //*************************
684 //按键功能执行
685 //*************************
686 void keydone()
687 { uchar Second;
688 1 /* if(flag==0) //关闭时钟,停止计时
689 1 { Write1302(0x8e,0x00); //写入允许
690 1 temp=Read1302(0x80);
691 1 Write1302(0x80,temp|0x80);
692 1 Write1302(0x8e,0x80); //禁止写入
693 1 flag=1;
694 1 }*/
695 1 Setkey(); //扫描模式切换按键
696 1 switch(count)
697 1 {case 1:do //count=1,调整秒
698 2 {
699 3
700 3 outkey(); //扫描跳出按钮
701 3 Upkey(); //扫描加按钮
702 3 Downkey(); //扫描减按钮
703 3 if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据
704 3 {
705 4 Write1302(0x8e,0x00); //写入允许
706 4 Write1302(0x80,temp); //写入新的秒数
707 4 Write1302(0x8e,0x80); //禁止写入
708 4 up_flag=0;
709 4 down_flag=0;
710 4 }
711 3 if(Down!=0&&Up!=0)
712 3 {
713 4 hide_sec++;
714 4 if(hide_sec>3)
715 4 hide_sec=0;
716 4 }
717 3 else hide_sec=0;
718 3 show_time(); //液晶显示数据
719 3 }while(count==2);break;
720 2 case 2:do //count=2,调整分
721 2 {
722 3 hide_sec=0;
723 3 outkey();
724 3 Upkey();
725 3 Downkey();
726 3 if(temp>0x60)
727 3 temp=0;
728 3 if(up_flag==1||down_flag==1)
729 3 {
730 4 Write1302(0x8e,0x00); //写入允许
731 4 Write1302(0x82,temp); //写入新的分数
732 4 Write1302(0x8e,0x80); //禁止写入
733 4 up_flag=0;
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 13
734 4 down_flag=0;
735 4 }
736 3 if(Down!=0&&Up!=0)
737 3 {
738 4 hide_min++;
739 4 if(hide_min>3)
740 4 hide_min=0;
741 4 }
742 3 else hide_min=0;
743 3 show_time();
744 3 }while(count==3);break;
745 2 case 3:do //count=3,调整小时
746 2 {
747 3 hide_min=0;
748 3 outkey();
749 3 Upkey();
750 3 Downkey();
751 3 if(up_flag==1||down_flag==1)
752 3 {
753 4 Write1302(0x8e,0x00); //写入允许
754 4 Write1302(0x84,temp); //写入新的小时数
755 4 Write1302(0x8e,0x80); //禁止写入
756 4 up_flag=0;
757 4 down_flag=0;
758 4 }
759 3 if(Down!=0&&Up!=0)
760 3 {
761 4 hide_hour++;
762 4 if(hide_hour>3)
763 4 hide_hour=0;
764 4 }
765 3 else hide_hour=0;
766 3 show_time();
767 3 }while(count==4);break;
768 2 case 4:do //count=4,调整星期
769 2 {
770 3 hide_hour=0;
771 3 outkey();
772 3 Upkey();
773 3 Downkey();
774 3 if(up_flag==1||down_flag==1)
775 3 {
776 4 Write1302(0x8e,0x00); //写入允许
777 4 Write1302(0x8a,temp); //写入新的星期数
778 4 Write1302(0x8e,0x80); //禁止写入
779 4 up_flag=0;
780 4 down_flag=0;
781 4 }
782 3 if(Down!=0&&Up!=0)
783 3 {
784 4 hide_week++;
785 4 if(hide_week>3)
786 4 hide_week=0;
787 4 }
788 3 else hide_week=0;
789 3 show_time();
790 3 }while(count==5);break;
791 2 case 5:do //count=5,调整日
792 2 {
793 3 hide_week=0;
794 3 outkey();
795 3 Upkey();
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 14
796 3 Downkey();
797 3 if(up_flag==1||down_flag==1)
798 3 {
799 4 Write1302(0x8e,0x00); //写入允许
800 4 Write1302(0x86,temp); //写入新的日数
801 4 Write1302(0x8e,0x80); //禁止写入
802 4 up_flag=0;
803 4 down_flag=0;
804 4 }
805 3 if(Down!=0&&Up!=0)
806 3 {
807 4 hide_day++;
808 4 if(hide_day>3)
809 4 hide_day=0;
810 4 }
811 3 else hide_day=0;
812 3 show_time();
813 3 }while(count==6);break;
814 2 case 6:do //count=6,调整月
815 2 {
816 3 hide_day=0;
817 3 outkey();
818 3 Upkey();
819 3 Downkey();
820 3 if(up_flag==1||down_flag==1)
821 3 {
822 4 Write1302(0x8e,0x00); //写入允许
823 4 Write1302(0x88,temp); //写入新的月数
824 4 Write1302(0x8e,0x80); //禁止写入
825 4 up_flag=0;
826 4 down_flag=0;
827 4 }
828 3 if(Down!=0&&Up!=0)
829 3 {
830 4 hide_month++;
831 4 if(hide_month>3)
832 4 hide_month=0;
833 4 }
834 3 else hide_month=0;
835 3 show_time();
836 3 }while(count==7);break;
837 2 case 7:do //count=7,调整年
838 2 {
839 3 hide_month=0;
840 3 outkey();
841 3 Upkey();
842 3 Downkey();
843 3 if(up_flag==1||down_flag==1)
844 3 {
845 4 Write1302(0x8e,0x00); //写入允许
846 4 Write1302(0x8c,temp); //写入新的年数
847 4 Write1302(0x8e,0x80); //禁止写入
848 4 up_flag=0;
849 4 down_flag=0;
850 4 }
851 3 if(Down!=0&&Up!=0)
852 3 {
853 4 hide_year++;
854 4 if(hide_year>3)
855 4 hide_year=0;
856 4 }
857 3 else hide_year=0;
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 15
858 3 show_time();
859 3 }while(count==8);break;
860 2 case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态
861 2 Second=Read1302(DS1302_SECOND);
862 2 Write1302(0x8e,0x00); //写入允许
863 2 Write1302(0x80,Second&0x7f);
864 2 Write1302(0x8E,0x80); //禁止写入
865 2 done=0;
866 2 break; //count=7,开启中断,标志位置0并退出
867 2 default:break;
868 2
869 2 }
870 1
871 1 }
872
873
874 //***************************************
875 //液晶显示主程序模块
876 //***************************************
877 void show_time()
878 {
879 1 DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
880 1 TimeToStr(&CurrentTime); //时间数据转换液晶字符
881 1 DateToStr(&CurrentTime); //日期数据转换液晶字符
882 1 ReadTemp(); //开启温度采集程序
883 1 temp_to_str(); //温度数据转换成液晶字符
884 1 gotoxy(4,0);
885 1 print("当前气温");
886 1 gotoxy(4,4); //液晶字符显示位置
887 1 print(TempBuffer); //显示温度
888 1 gotoxy(4,7);
889 1 print("℃");
890 1 gotoxy(3,0);
891 1 print("时间:");
892 1 gotoxy(3,3);
893 1 print(CurrentTime.TimeString); //显示时间
894 1 gotoxy(2,3);
895 1 print(CurrentTime.DateString); //显示日期
896 1 gotoxy(2,0);
897 1 print("星期");
898 1 gotoxy(2,2);
899 1 print(week_value); //显示星期
900 1 gotoxy(1,1);
901 1 print("欢迎使用^_^!");
902 1 mdelay(500); //扫描延时
903 1 }
904
905
906 //************************************
907 //主程序
908 //*************************************
909 main()
910 {
911 1 // flag=1; //时钟停止标志
912 1 init_lcd();
913 1 clrram_lcd();
914 1 Init_DS18B20( ) ; //DS18B20初始化
915 1 Initial_DS1302(); //时钟芯片初始化
916 1 up_flag=0;
917 1 down_flag=0;
918 1 done=0; //进入默认液晶显示
919 1 while(1)
C51 COMPILER V6.12 DS1302 09/30/2007 20:22:51 PAGE 16
920 1 {
921 2 while(done==1)
922 2 keydone(); //进入调整模式
923 2 while(done==0)
924 2 {
925 3 show_time(); //液晶显示数据
926 3 // flag=0;
927 3 Setkey(); //扫描各功能键
928 3 }
929 2 }
930 1 }
931
932
933
934
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3218 ----
CONSTANT SIZE = 50 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 49 24
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 + -