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

📄 main.c

📁 单片机51 实现 万年历编程
💻 C
📖 第 1 页 / 共 2 页
字号:
                    0x02,0x5d,0x52,    //2007
                    0x09,0x2d,0x47,    //2008
                    0x5C,0x95,0xBA,    //2009
                    0x0A,0x95,0x4e,    //2010
                    0x0B,0x4A,0x43,    //2011
                    0x4B,0x55,0x37,    //2012
                    0x0A,0xd5,0x4A,    //2013
                    0x95,0x5A,0xBf,    //2014
                    0x04,0xBA,0x53,    //2015
                    0x0A,0x5B,0x48,    //2016
                    0x65,0x2B,0xBC,    //2017
                    0x05,0x2B,0x50,    //2018
                    0x0A,0x93,0x45,    //2019
                    0x47,0x4A,0xB9,    //2020
                    0x06,0xAA,0x4C,    //2021
                    0x0A,0xd5,0x41,    //2022
                    0x24,0xdA,0xB6,    //2023
                    0x04,0xB6,0x4A,    //2024
                    0x69,0x57,0x3d,    //2025
                    0x0A,0x4e,0x51,    //2026
                    0x0d,0x26,0x46,    //2027
                    0x5e,0x93,0x3A,    //2028
                    0x0d,0x53,0x4d,    //2029
                    0x05,0xAA,0x43,    //2030
                    0x36,0xB5,0x37,    //2031
                    0x09,0x6d,0x4B,    //2032
                    0xB4,0xAe,0xBf,    //2033
                    0x04,0xAd,0x53,    //2034
                    0x0A,0x4d,0x48,    //2035
                    0x6d,0x25,0xBC,    //2036
                    0x0d,0x25,0x4f,    //2037
                    0x0d,0x52,0x44,    //2038
                    0x5d,0xAA,0x38,    //2039
                    0x0B,0x5A,0x4C,    //2040
                    0x05,0x6d,0x41,    //2041
                    0x24,0xAd,0xB6,    //2042
                    0x04,0x9B,0x4A,    //2043
                    0x7A,0x4B,0xBe,    //2044
                    0x0A,0x4B,0x51,    //2045
                    0x0A,0xA5,0x46,    //2046
                    0x5B,0x52,0xBA,    //2047
                    0x06,0xd2,0x4e,    //2048
                    0x0A,0xdA,0x42,    //2049
                    0x35,0x5B,0x37,    //2050
                    0x09,0x37,0x4B,    //2051
                    0x84,0x97,0xC1,    //2052
                    0x04,0x97,0x53,    //2053
                    0x06,0x4B,0x48,    //2054
                    0x66,0xA5,0x3C,    //2055
                    0x0e,0xA5,0x4f,    //2056
                    0x06,0xB2,0x44,    //2057
                    0x4A,0xB6,0x38,    //2058
                    0x0A,0xAe,0x4C,    //2059
                    0x09,0x2e,0x42,    //2060
                    0x3C,0x97,0x35,    //2061
                    0x0C,0x96,0x49,    //2062
                    0x7d,0x4A,0xBd,    //2063
                    0x0d,0x4A,0x51,    //2064
                    0x0d,0xA5,0x45,    //2065
                    0x55,0xAA,0xBA,    //2066
                    0x05,0x6A,0x4e,    //2067
                    0x0A,0x6d,0x43,    //2068
                    0x45,0x2e,0xB7,    //2069
                    0x05,0x2d,0x4B,    //2070
                    0x8A,0x95,0xBf,    //2071
                    0x0A,0x95,0x53,    //2072
                    0x0B,0x4A,0x47,    //2073
                    0x6B,0x55,0x3B,    //2074
                    0x0A,0xd5,0x4f,    //2075
                    0x05,0x5A,0x45,    //2076
                    0x4A,0x5d,0x38,    //2077
                    0x0A,0x5B,0x4C,    //2078
                    0x05,0x2B,0x42,    //2079
                    0x3A,0x93,0xB6,    //2080
                    0x06,0x93,0x49,    //2081
                    0x77,0x29,0xBd,    //2082
                    0x06,0xAA,0x51,    //2083
                    0x0A,0xd5,0x46,    //2084
                    0x54,0xdA,0xBA,    //2085
                    0x04,0xB6,0x4e,    //2086
                    0x0A,0x57,0x43,    //2087
                    0x45,0x27,0x38,    //2088
                    0x0d,0x26,0x4A,    //2089
                    0x8e,0x93,0x3e,    //2090
                    0x0d,0x52,0x52,    //2091
                    0x0d,0xAA,0x47,    //2092
                    0x66,0xB5,0x3B,    //2093
                    0x05,0x6d,0x4f,    //2094
                    0x04,0xAe,0x45,    //2095
                    0x4A,0x4e,0xB9,    //2096
                    0x0A,0x4d,0x4C,    //2097
                    0x0d,0x15,0x41,    //2098
                    0x2d,0x92,0xB5     //2099
};
unsigned int code day_code[]={ 
                    0x0000,0x001f,0x003b,0x005a,0x0078,0x0097,//月份数据表
                    0x00b5,0x00d4,0x00f3,0x0111,0x0130,0x014e
					  };
 /****************************************************************************
返回月大小
****************************************************************************/
  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)
{ 
  uchar temp1,temp2,temp3;
  uchar month_p;
  uint temp4,table_addr;
  uchar year;
  uchar month;
  uchar day;
  bit flag2,flag_y;

 year=YEAR;
 month=MONTH;
 day=DAY;
 solution_time();
 table_addr=(year+1)*0x03;

 temp1=year_code[table_addr+2]&0x60; //取当年春节所在的公历月份
 temp1=_cror_(temp1,5);				 ///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//2月为29天其他为28天


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;	 //从数据表中取该年的闰月月份,如为0则该年无闰月
  temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月
 while(temp4>=temp1)		 ///计算月份,日期//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;
  temp2=_cror_(temp2,4);
  if(temp2==0) month_p=0x0c; 
  else month_p=0x0d; //

  flag_y=0;	//month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12//
  flag2=get_lunar_day(month_p,table_addr);
  if(flag2==0) temp1=0x1d;
  else temp1=0x1e;
  while(temp3>temp1)
  {
   temp3=temp3-temp1;
   month_p=month_p-1;
   if(flag_y==0) month=month-1;
   if(month==temp2) flag_y=~flag_y;
   flag2=get_lunar_day(month_p,table_addr);
   if(flag2==0) temp1=0x1d;
   else temp1=0x1e;
  }
  day=temp1-temp3+1;	  
 }  	
 year_lunar=year;
 temp1=month/10;
 temp1=_crol_(temp1,4);
 temp2=month%10;
 month_lunar=temp1|temp2;
 temp1=day/10;
 yue=(month_lunar>>4)*10+(month_lunar&0x0f); //转换
 temp1=_crol_(temp1,4);
 temp2=day%10;
 day_lunar=temp1|temp2;
 ri=(day_lunar>>4)*10+(day_lunar&0x0f);
 }   	
 void display_yl()
 {  uchar t4[10];
    write_com(0x80);
   	sprintf(t4,"%d:%d ", yue,ri);
	write_string(t4);
	}
 

 void display_time()
{ 
 idata uchar t1[10];
 if(SEC<=9&&HOUR<=9&&MIN<=9)
  sprintf(t1,"0%d:0%d:0%d",HOUR,MIN,SEC);
 if(SEC>9&&HOUR<=9&&MIN<=9)
  sprintf(t1,"0%d:0%d:%d",HOUR,MIN,SEC);
 if(SEC<=9&&HOUR>9&&MIN<=9)
  sprintf(t1,"%d:0%d:0%d",HOUR,MIN,SEC);
 if(SEC<=9&&HOUR<=9&&MIN>9)
  sprintf(t1,"0%d:%d:0%d",HOUR,MIN,SEC);
 if(SEC>9&&HOUR<=9&&MIN>9)
  sprintf(t1,"0%d:%d:%d",HOUR,MIN,SEC);
 if(SEC>9&&HOUR>9&&MIN<=9)
  sprintf(t1,"%d:0%d:%d",HOUR,MIN,SEC);
 if(SEC<=9&&HOUR>9&&MIN>9)
  sprintf(t1,"%d:%d:0%d",HOUR,MIN,SEC);
 if(SEC>9&&HOUR>9&&MIN>9)
  sprintf(t1,"%d:%d:%d",HOUR,MIN,SEC);
  write_string(t1);  
  
}  
void display_date(void)
{
  idata  uchar tt[10];
 write_com(0xc0);
 if(YEAR<=9&&MONTH<=9&&DAY<=9)
  sprintf(tt,"200%d-0%d-0%d  ",YEAR,MONTH,DAY);
 if(YEAR<=9&&MONTH<=9&&DAY>9)
  sprintf(tt,"200%d-0%d-%d  ",YEAR,MONTH,DAY);
 if(YEAR>9&&MONTH<=9&&DAY<=9)
  sprintf(tt,"20%d-0%d-0%d  ",YEAR,MONTH,DAY);
 if(YEAR<=9&&MONTH>9&&DAY<=9)
  sprintf(tt,"200%d-%d-0%d  ",YEAR,MONTH,DAY);
 if(YEAR<=9&&MONTH>9&&DAY>9)
  sprintf(tt,"200%d-%d-%d  ",YEAR,MONTH,DAY);
 if(YEAR>9&&MONTH<=9&&DAY>9)
  sprintf(tt,"20%d-0%d-%d  ",YEAR,MONTH,DAY);
 if(YEAR>9&&MONTH>9&&DAY<=9)
  sprintf(tt,"20%d-%d-0%d  ",YEAR,MONTH,DAY);
 if(YEAR>9&&MONTH>9&&DAY>9)
  sprintf(tt,"20%d-%d-%d  ",YEAR,MONTH,DAY);
  write_string(tt); 
}	
void main()
{ initialize_DS1302(); 
  Set1302(a);//设置时间 
  while(1)
     { i_lcd();
	   solution_time();	 
	  	solartolunar();
       // display_time();		  ///时间
	    write_com(0xc0);
    	display_date();
		display_yl();			 //日期
        //display_week();  		   //星期
	  //if(key_1==0) 
	  //{while(key_1==0){;} set_time();} 
	   delay(80);
   }
   }

⌨️ 快捷键说明

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