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

📄 ds18b20+ds1320+lcd12864.c

📁 多功能太阳能热水器设计 硬件:AT89S52单片机
💻 C
📖 第 1 页 / 共 5 页
字号:
 clear();
 write_character(0,2,"设",0);
 write_character(0,4,"置",0);
 write_character(0,10,"返",0);
 write_character(0,12,"回",0);
 write_ascii(2,5,1,0);
 write_character(2,6,"时",0);
 write_character(2,8,"间",0);
 write_ascii(4,5,2,0);
 write_character(4,6,"闹",0);
 write_character(4,8,"钟",0);
 write_ascii(6,5,3,0); 
 write_character(6,6,"温",0);
 write_character(6,8,"度",0);

 while(BACK1!=0)
 {
  if(K1==0)
  {
   delayms(60);
   while(K1==0);
   MF++;
  }

  if(K3==0)
  {
   delayms(60);
   while(K3==0);
   MF--;
  }

  if(MF==4)
  {
   MF=0;
  }
  if(MF==0xff)
  {
   MF=3;
  }

  switch(MF)
  {
   case 0:write_character(0,10,"返",1);
          write_character(0,12,"回",1);	
		  write_character(0,2,"设",0);
          write_character(0,4,"置",0);
          write_ascii(2,5,1,0);
          write_character(2,6,"时",0);
          write_character(2,8,"间",0);
          write_ascii(4,5,2,0);
          write_character(4,6,"闹",0);
          write_character(4,8,"钟",0);
          write_ascii(6,5,3,0); 
          write_character(6,6,"温",0);
          write_character(6,8,"度",0);
	      if(K2==0)
          {
           delayms(60);
		   while(K2==0);
		   clear();
		   BACK1=0;
		  }
          break;
   case 1:write_ascii(2,5,1,1); 
          write_character(2,6,"时",1);
          write_character(2,8,"间",1);
		  write_character(0,2,"设",0);
          write_character(0,4,"置",0);
		  write_character(0,10,"返",0);
          write_character(0,12,"回",0);
          write_ascii(4,5,2,0);
          write_character(4,6,"闹",0);
          write_character(4,8,"钟",0);
          write_ascii(6,5,3,0); 
          write_character(6,6,"温",0);
          write_character(6,8,"度",0);
		  if(K2==0)
          {
           delayms(60);
           while(K2==0);
		   timereset();
		  }
          break;
   case 2:write_ascii(4,5,2,1);
          write_character(4,6,"闹",1);
          write_character(4,8,"钟",1);
		  write_character(0,2,"设",0);
          write_character(0,4,"置",0);
	      write_character(0,10,"返",0);
          write_character(0,12,"回",0);
          write_ascii(2,5,1,0);
          write_character(2,6,"时",0);
          write_character(2,8,"间",0);
          write_ascii(6,5,3,0); 
          write_character(6,6,"温",0);
          write_character(6,8,"度",0);
          if(K2==0)
          {
           delayms(60);
           while(K2==0);
		   ringreset();
		  }
          break;
   case 3:write_ascii(6,5,3,1);
          write_character(6,6,"温",1);
          write_character(6,8,"度",1);
		  write_character(0,2,"设",0);
          write_character(0,4,"置",0);
		  write_character(0,10,"返",0);
          write_character(0,12,"回",0);
          write_ascii(2,5,1,0);
          write_character(2,6,"时",0);
          write_character(2,8,"间",0);
          write_ascii(4,5,2,0);
          write_character(4,6,"闹",0);
          write_character(4,8,"钟",0);
		  if(K2==0)
          {
           delayms(60);
           while(K2==0);
		   tempreset();
		  }
          break;
  }
 }
}

/****************************************************************************
按键处理
****************************************************************************/
void keyscanf(void)
{
 if(K1==0)
 {
  delayms(40);
  while(K1==0);
  tempdisplay();
  delays(40);
  clear();
 }

 if(K2==0)
 {
  delayms(40);
  while(K2==0);
  keyscanf1();
  clear();
 }

 if(K3==0)
 {
  delayms(40);
  while(K3==0);
  ringdisplay();
  delays(50);
  clear();
 }
}

/***************************************************************************
调整
****************************************************************************/
unsigned char turntobcd(unsigned char x,unsigned char y,unsigned char value,
                        unsigned char max,unsigned char min)
{
 unsigned char valueh;
 unsigned char valuel;
 valueh=value>>4;
 valuel=value&0x0f;
 value=valueh*10+valuel;

 while(K2!=0)
 {
  if(K1==0)
  {
   delayms(60);
   while(K1==0);
   value++;
  }
              
  if(K3==0)
  {
   delayms(60);
   while(K3==0);
   value--;
  }
              
  if(min==0)
  {
   if(value==0x0ff) value=max;
  }
  else 
  {
   if(value<min) value=max;
  }

  if(value>max)
  {
   value=min;
  }

  if((x==4)&&(y==8))
  {
   if(SCNF==1) write_week(x,y,value,1);
   else
   {
    write_ascii(x,y,12,0);
	write_ascii(x,y+1,12,0);
   }
  }

  else
  {
   if(SCNF==1)
   {
    write_ascii(x,y,value/10,1);
    write_ascii(x,y+1,value%10,1);
   }
   else
   {
    write_ascii(x,y,12,0);
    write_ascii(x,y+1,12,0);
   }
  }
 }
 delayms(60);
 while(K2==0);
 valueh=value/10;
 valuel=value%10;
 value=((valueh<<4)|valuel);
 return value;
}

/****************************************************************************
闹钟音乐
****************************************************************************/
void sound(void)
{
 unsigned char p,m;
 unsigned char i=0;
 unsigned char time=3;

 initTimer1();
 IE=0xaa;

 play:
 while((K1&&K2&&K3)&time!=0)
 {
  a: p=music_tab[i];
  if(p==0x00) 
  {
   time--;
   i=0;
   delays(8); 
   goto play;
  } 
  else if(p==0xff) 
  { 
   i=i+1;
   delayms(20);
   TR1=0;
   goto a;
  } 
  else 
  {
   m=music_tab[i++];
   n=music_tab[i++];
  }
  TR1=1;
  while(n!=0) 
  {
   BUZZ=~BUZZ;
   delayus(3*m);
  }
  TR1=0; 
 }
 delayms(60);
 while((K1&&K2&&K3)!=0);
}

/****************************************************************************
闹钟1显示
****************************************************************************/
void display1(void)
{
 unsigned char onoff1=read_ds1302(0x0c1);
 unsigned char ring1h=read_ds1302(0x0c3);
 unsigned char ring1l=read_ds1302(0x0c5);

 clear();
 
 write_character(0,5,"闹",0);
 write_character(0,9,"钟",0);
 write_week(4,2,1,0);
 write_character(4,4,"路",0);
 write_ascii(4,9,ring1h>>4,0);
 write_ascii(4,10,ring1h&0x0f,0);
 write_ascii(4,11,11,0);
 write_ascii(4,12,ring1l>>4,0);
 write_ascii(4,13,ring1l&0x0f,0);
 write_character(6,2,"定",0);
 write_character(6,4,"时",0);
 write_character(6,6,"时",0);
 write_character(6,8,"间",0);
 write_character(6,10,"到",0);
 if(onoff1==0)
 {
  write_character(4,6,"关",0);
 }
 else
 {
  write_character(4,6,"开",0);		   
 }
}

/****************************************************************************
闹钟2显示
****************************************************************************/
void display2(void)
{  
 unsigned char onoff2=read_ds1302(0x0c7);
 unsigned char ring2h=read_ds1302(0x0c9);
 unsigned char ring2l=read_ds1302(0x0cb);

 clear();

 write_character(0,5,"闹",0);
 write_character(0,9,"钟",0);
 write_week(4,2,2,0);
 write_character(4,4,"路",0);
 write_ascii(4,9,ring2h>>4,0);
 write_ascii(4,10,ring2h&0x0f,0);
 write_ascii(4,11,11,0);
 write_ascii(4,12,ring2l>>4,0);
 write_ascii(4,13,ring2l&0x0f,0);
 write_character(6,2,"定",0);
 write_character(6,4,"时",0);
 write_character(6,6,"时",0);
 write_character(6,8,"间",0);
 write_character(6,10,"到",0);
 if(onoff2==0)
 {
  write_character(4,6,"关",0);
 }
 else
 {
  write_character(4,6,"开",0);		   
 }
}

/****************************************************************************
返回月大小
****************************************************************************/
bit get_lunar_day(unsigned char month_p,unsigned int table_addr)//子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/
{
 unsigned char temp;
 switch (month_p)
 {
  case 1:temp=year_code[table_addr]&0x08;
         if(temp==0)return(0);
	     else return(1);
		 break;

  case 2:temp=year_code[table_addr]&0x04;
         if(temp==0)return(0);
	     else return(1);
		 break;

  case 3:temp=year_code[table_addr]&0x02;
         if(temp==0)return(0);
	     else return(1);
		 break;

  case 4:temp=year_code[table_addr]&0x01;
         if(temp==0)return(0);
		 else return(1);
		 break;

  case 5:temp=year_code[table_addr+1]&0x80;
         if(temp==0) return(0);
		 else return(1);
	     break;

  case 6:temp=year_code[table_addr+1]&0x40;
         if(temp==0)return(0);
		 else return(1);
		 break;

  case 7:temp=year_code[table_addr+1]&0x20;
         if(temp==0)return(0);
		 else return(1);
		 break;

  case 8:temp=year_code[table_addr+1]&0x10;
         if(temp==0)return(0);
		 else return(1);
		 break;

  case 9:temp=year_code[table_addr+1]&0x08;
         if(temp==0)return(0);
		 else return(1);
		 break;
  case 10:temp=year_code[table_addr+1]&0x04;
          if(temp==0)return(0);
		  else return(1);
		  break;

  case 11:temp=year_code[table_addr+1]&0x02;
          if(temp==0)return(0);
		  else return(1);
		  break;

  case 12:temp=year_code[table_addr+1]&0x01;
          if(temp==0)return(0);
		  else return(1);
		  break;

  case 13:temp=year_code[table_addr+2]&0x80;
          if(temp==0)return(0);
		  else return(1);
		  break;
 }
}

/****************************************************************************
公历转农历
****************************************************************************/
void solartolunar(void)
{ 
 unsigned char temp1,temp2,temp3;
 unsigned char month_p;
 unsigned int temp4,table_addr;
 unsigned char year;
 unsigned char month;
 unsigned char day;
 bit flag2,flag_y;

 readtime();
 year=YEAR;
 month=MONTH;
 day=DAY;

 temp1=year/16;   //BCD->hex 先把数据转换为十六进制
 temp2=year%16;
 year=temp1*10+temp2;
 temp1=month/16;
 temp2=month%16;
 month=temp1*10+temp2;
 temp1=day/16;
 temp2=day%16;
 day=temp1*10+temp2;

 table_addr=(year+1)*0x03;

 temp1=year_code[table_addr+2]&0x60; //取当年春节所在的公历月份
 temp1=_cror_(temp1,5);

 temp2=year_code[table_addr+2]&0x1f; //取当年春节所在的公历日 


 if(temp1==0x01) temp3=temp2-1; // 计算当年春节离当年元旦的天数,春节只会在公历1月或2月  
 else temp3=temp2+0x1f-1;        

 temp4=day_code[month-1]+day-1;	//计算公历日离当年元旦的天数

 if((month>0x02)&&(year%0x04==0)) temp4=temp4+1; //如果公历月大于2月并且该年的2月为闰月,天数加1


 if(temp4>=temp3) //判断公历日在春节前还是春节后
 { 
  temp4=temp4-temp3;//公历日在春节后或就是春节当日使用下面代码进行运算
  month=0x01;
  month_p=0x01; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
  flag2=get_lunar_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0
  flag_y=0;
  if(flag2==0)temp1=0x1d; //小月29天
  else temp1=0x1e; //大小30天
  temp2=year_code[table_addr]&0xf0;
  temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月
  while(temp4>=temp1)
  {
   temp4=temp4-temp1;
   month_p=month_p+1;

   if(month==temp2)
   {
    flag_y=~flag_y;
    if(flag_y==0) month+=1;
   }
   else month+=1;
   flag2=get_lunar_day(month_p,table_addr);

   if(flag2==0) temp1=0x1d;
   else temp1=0x1e;
  }
  day=temp4+1;
 }

 else //公历日在春节前使用下面代码进行运算
 {
  temp3=temp3-temp4;
  if(year==0) year=59;
  else year=year-1;  
  table_addr=table_addr-0x03;
  month=0x0c;
  temp2=year_code[table_addr]&0xf0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -