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

📄 main.i

📁 使用AVR单片机实现的万年历功能,其中使用了ds1302和1602
💻 I
📖 第 1 页 / 共 5 页
字号:
		pMusic = music4;
		maxMusic = 123    ;
		break;

	case 5:
		pMusic = music5;
		maxMusic = 61     ;
		break;

	case 6:
		pMusic = music6;
		maxMusic = 195    ;
		break;

	case 7:
		pMusic = music7;
		maxMusic = 191    ;
		break;

	case 8:
		pMusic = music8;
		maxMusic = 249    ;
		break;

	case 9:
		pMusic = music9;
		maxMusic = 301    ;
		break;

	case 10:
		pMusic = music10;
		maxMusic = 3     ;
		break;

	};

	playCycle = counterChoose;     //音乐播放次数赋值
	OCR1A = dataOfOCR1A[pMusic[0]];      //第一个音符赋值   
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	
	if(OCR1A == 2500)		// IF语句判断OCR1A中是否是装入了空音符的数据,如果是的话就把PD5释放
	{
	        TCCR1A = 0x00;
	}
	else if (TCCR1A == 0x00)	//非空音符时,如果PD5引脚已经释放,则与OCR1连接
	{
	        TCCR1A = 0x40;
	} 
	
	TCCR1B = 0x0A;     //开启定时器工作
}

void PlayMusic1(unsigned char counter1)
{
	pMusic = music1;
	maxMusic = 273	;
	playCycle = counter1;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic2(unsigned char counter2)
{
	pMusic = music2;
	maxMusic = 223	;
	playCycle = counter2;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic3(unsigned char counter3)
{
	pMusic = music3;
	maxMusic = 137   ;
	playCycle = counter3;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic4(unsigned char counter4)
{
	pMusic = music4;
	maxMusic = 123    ;
	playCycle = counter4;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic5(unsigned char counter5)
{
	pMusic = music5;
	maxMusic = 61     ;
	playCycle = counter5;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic6(unsigned char counter6)
{
	pMusic = music6;
	maxMusic = 195    ;
	playCycle = counter6;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic7(unsigned char counter7)
{
	pMusic = music7;
	maxMusic = 191    ;
	playCycle = counter7;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic8(unsigned char counter8)
{
	pMusic = music8;
	maxMusic = 249    ;
	playCycle = counter8;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic9(unsigned char counter9)
{
	pMusic = music9;
	maxMusic = 301    ;
	playCycle = counter9;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic10(unsigned char counter10)
{
	pMusic = music10;
	maxMusic = 3     ;
	playCycle = counter10;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

        		                                                                                                                                                                                                                                                                                                                                                                                                        

/*****************************************************
函数void Change(void)用于将数据送显示缓冲区
display1用于存放时间和星期的缓冲区数据
display2用于存放国历的缓冲区数据
display3用于存放农历的缓冲区数据
*****************************************************/
void Change(void)
void Change(void)
void Change(void)
{
        unsigned char i;  
        unsigned char j = 0;
        
		for (i = 0; i <= 3; i++)
        {
                display1[j++] = DS1302Data[i] % 10;
                display1[j++] = DS1302Data[i] / 10;
        }
		
        j = 0;

        for (i = 4; i <= 7; i++)
        {
                display2[j++] = DS1302Data[i] % 10;
                display2[j++] = DS1302Data[i] / 10;
        }  

        j = 0;

        for (i = 8; i <= 11; i++)
        {
                display3[j++] = DS1302Data[i] % 10;
                display3[j++] = DS1302Data[i] / 10;
        } 
}                  
/*****************************************************
函数void DisplayOne(void)用于显示时间和阳历数据
*****************************************************/
void DisplayOne(void)
{
		LcdSetXY(0, 8);
		LcdPutOneChar(display2[5] + 48);  
		LcdSetXY(0, 9);
		LcdPutOneChar(display2[4] + 48); 
		LcdSetXY(0, 11);
		LcdPutOneChar(display2[3] + 48); 
		LcdSetXY(0, 12);
		LcdPutOneChar(display2[2] + 48);  
		LcdSetXY(0, 14);
		LcdPutOneChar(display2[1] + 48); 
		LcdSetXY(0, 15);
		LcdPutOneChar(display2[0] + 48); 

		LcdSetXY(1, 8);
		LcdPutOneChar(display1[5] + 48);  
		LcdSetXY(1, 9);
		LcdPutOneChar(display1[4] + 48); 
		LcdSetXY(1, 11);
		LcdPutOneChar(display1[3] + 48); 
		LcdSetXY(1, 12);
		LcdPutOneChar(display1[2] + 48);  
		LcdSetXY(1, 14);
		LcdPutOneChar(display1[1] + 48); 
		LcdSetXY(1, 15);
		LcdPutOneChar(display1[0] + 48); 
}       
/*****************************************************
函数void DisplayTwo(void)用于显示阴历和星期数据
*****************************************************/
void DisplayTwo(void)
{
		LcdSetXY(0, 8);
		LcdPutOneChar(display3[5] + 48);  
		LcdSetXY(0, 9);
		LcdPutOneChar(display3[4] + 48); 
		LcdSetXY(0, 11);
		LcdPutOneChar(display3[3] + 48); 
		LcdSetXY(0, 12);
		LcdPutOneChar(display3[2] + 48);  
		LcdSetXY(0, 14);
		LcdPutOneChar(display3[1] + 48); 
		LcdSetXY(0, 15);
		LcdPutOneChar(display3[0] + 48); 

		LcdSetXY(1, 0);
        LcdPutFlashString(week[display1[6]-1]);    
}       
/*****************************************************
函数unsigned int FindDataOfYear(void)用于查找每年中第一天到今天的天数
*****************************************************/
unsigned int FindDataOfYear(void)
{      
        unsigned int dayCount = 0; 
        unsigned int isleap;
        
		if ((DS1302Data[6] % 4) == 0)    //判断是否为闰年
        {    
				isleap = 1;
        }
		else
        {
				isleap = 0;
        }

		switch (DS1302Data[5])          //计算当天为一年中的第几天
         {
                case 1 :
                dayCount = (unsigned int) DS1302Data[4];
                break; 
                case 2 : 
                dayCount = ((unsigned int) DS1302Data[4])+31;
                break;
                case 3 : 
                dayCount = ((unsigned int) DS1302Data[4])+59+isleap;
                break;
                case 4 : 
                dayCount = ((unsigned int) DS1302Data[4])+90+isleap;
                break;
                case 5 :
                dayCount = ((unsigned int) DS1302Data[4])+120+isleap;
                break;
                case 6 :
                dayCount = ((unsigned int) DS1302Data[4])+151+isleap;
                break;  
                case 7 :
                dayCount = ((unsigned int) DS1302Data[4])+181+isleap;
                break; 
                case 8 :                                           
                dayCount = ((unsigned int) DS1302Data[4])+212+isleap;
                break;
                case 9 :
                dayCount = ((unsigned int) DS1302Data[4])+243+isleap;
                break;
                case 10 : 
                dayCount = ((unsigned int) DS1302Data[4])+273+isleap;
                break;
                case 11 :
                dayCount = ((unsigned int) DS1302Data[4])+304+isleap;
                break;
                case 12 : 
                dayCount = ((unsigned int) DS1302Data[4])+334+isleap;
                break;
         };   

         return (dayCount);      
}

/*****************************************************
函数unsigned char FindDataOfWeek(void)用于计算星期
*****************************************************/
void FindDataOfWeek(void)
{
        unsigned int dayCount;
        dayCount = (FindDataOfYear() - 1 + DS1302Data[6] + (DS1302Data[6] - 1) / 4) % 7;   
        
		if (dayCount == 0)
		{
                dayCount = 7;
		}

        DS1302Data[3] = dayCount;
}
/*****************************************************
函数void SolarToLunar(void)用于根据国历的数据查询计算农历数据
*****************************************************/
void SolarToLunar(void) 
{          
        unsigned int dayCount;
        char i; 
        char dayTemp[4];
        char temp1, temp2, temp3, temp4;
        dayCount = FindDataOfYear();
		
        for (i = 0; i <= 3; i++)
		{
			dayTemp[i] = findLunar[(DS1302Data[6] - 1) * 4 + i];   //读取该年的农历数据
		}

		if ((dayTemp[0] & 0x80) == 0x80)       //判断第一个月是12月份还是11月份
        {
			temp1 = 0x0c;
		}
		else
        {
			temp1 = 0x0b;
		}

		temp2 = dayTemp[0] & 0x7f;          //今年第一天为农历日期数据
        dayCount = dayCount + temp2 - 1;      //把天数转化为以农历第一个月的第一天为第一天的天数
         temp3 = 0;

         for (i = 1; i <= 8; i++)                //计算前八个月有多少个月为30天
         {

                if ((dayTemp[2] & (1 << (i - 1))))
                {    
					temp3++;
				}
         
		 }

         if (dayCount > ((unsigned int)(29 * 8 + temp3)))                     //判断今天是否为前八个月内
         {
                dayCount = dayCount - ((unsigned int)(29 * 8 + temp3));        //如果是则减去前八个月的天数,以第九个月第一天为基准计算天数
                temp4 = dayTemp[1] & 0x01;                                   //第九个月是否为30天
                i = 1;
				
                while (((dayCount > 29) & (temp4 == 0)) | ((dayCount > 30) & (temp4 == 1)))         //如果剩余天数大于一个月的天数
                {                                                                       
                        i++;                                                      //月计算标志加一
                        dayCount = dayCount - 29 - temp4;           //减去这个月的天数
                        temp4 = dayTemp[1] & (1 << (i - 1));             //判断下一个月是否为30天
                        temp4 = temp4 >> (i - 1);
                }                             
				
                DS1302Data[8] = (char)dayCount;         //把农历日期赋值
                temp1 = temp1 + i + 8 - 1;
                
				if (temp1 > 12)
				{
                        temp1 = temp1 - 12;
				}

                if ((dayTemp[3] != 0) && (temp1 > dayTemp[3]))
				{
                        temp1 = temp1 - 1;
				}

                DS1302Data[9] = temp1;                                   //把农历月份赋值
         }
         else                                               //下面为前八个月的处理情况
         {    
                temp4 = dayTemp[2] & 0x01;
                i = 1;
				
                while (((dayCount > 29) & (temp4 == 0)) | ((dayCount > 30) & (temp4 == 1)))
                {
                        i++;
                        dayCount = dayCount - 29 - temp4;
                        temp4 = dayTemp[2] & (1 << (i - 1));
                        temp4 = temp4 >> (i - 1);
                }     
				
                DS1302Data[8] = (char)dayCount; 
                temp1 = temp1 + i - 1;
                
				if (temp1 > 12)
				{
                        temp1 = temp1 - 12;
				}

                if ((dayTemp[3] != 0) && (temp1 > dayTemp[3]) && (temp1 != 11) && (temp1 != 12))
				{    
					temp1 = temp1 - 1;
				}

                DS1302Data[9] = temp1;
         }
		 
         if (DS1302Data[9] > DS1302Data[5])
		 {
                DS1302Data[10] = DS1302Data[6] - 1;
         }
		else
		{

⌨️ 快捷键说明

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