📄 main.i
字号:
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 + -