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

📄 main__.c

📁 非常适用的万年历程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	maxMusic = maxMusic4;
	playCycle = counter4;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

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

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

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

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

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

void PlayMusic10(unsigned char counter10)
{
	pMusic = music10;
	maxMusic = maxMusic10;
	playCycle = counter10;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}
#include "time.c"
#include "time.h"
/*****************************************************
函数void Change(void)用于将数据送显示缓冲区
display1用于存放时间和星期的缓冲区数据
display2用于存放国历的缓冲区数据
display3用于存放农历的缓冲区数据
*****************************************************/
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
		{
                DS1302Data[10] = DS1302Data[6];
		}
}
#include "timing.c"
#include "timing.h"

interrupt [TIM0_COMP] void Timer0CompIsr(void)
{
	time2msIsOK = 1;	//中断中置2ms时间到
}
/*****************************************************
函数void TimingInit(void)为计时初始化函数
*****************************************************/
void TimingInit(void)
{
	TCCR0 = 0x0B;       //CTC模式,64分频,PB3为通用引脚(OC0不与其连接)
	OCR0 = 0x7C;        //OCR0置124
	TIMSK |= 0x02;      //允许TIM0比较匹配中断
	time10msCounter = 0;
	time500msCounter = 0;
	time2sCounter = 0;
	time20sCounter = 0;
}
/*****************************************************************
函数void FindTime(void)为查询2ms,10ms,500ms,2s,20s是否到的函数
*****************************************************************/
void FindTime(void)
{
	if (time2msIsOK)
	{
		time2msIsOK = 0;
        
		if(++time10msCounter == 5)
        {
			time10msIsOK = 1;
            time10msCounter = 0;                    
			
			if(++time500msCounter == 50)
            {
				time500msIsOK = 1;
				time500msCounter = 0;                                     
                
				if(++time2sCounter == 4)
				{
					time2sIsOK = 1;
					time2sCounter = 0;
					
					if(++time20sCounter == 10)
					{
						time20sIsOK = 1;
						time20sCounter = 0;
					}
                                                
				}
                                        
			}
                                
		}       
                        
	}  
	
}
#include "usart.c"
#include "usart.h"

/******************************************************
函数void UsartInit(void)用于初始化USART
******************************************************/
void UsartInit(void)
{
	UBRRH = (unsigned char)(((unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)) >> 8);    //计算波特率寄存器应该赋的值
	UBRRL = (unsigned char)((unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1));
	UCSRC = 0xA6;                //设置偶校验,1位停止位,8位数据位
	UCSRA = 0x00;                //不设置倍速,波特率分频器分频系数为16
	UCSRB = 0x98;                //使能接收中断,使能接收和发送

⌨️ 快捷键说明

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