⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.lst

📁 时间+温度用液晶12864显示
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -