📄 main.c~
字号:
LcdSetXY(1, 0);
LcdPutFlashString("MUSIC: 1");
while (1)
{
FindTime(); //判断各个时间段是否已经到达
if (time10msIsOK)
{
time10msIsOK = 0;
key8KeyValue = FindKeyValue(); //读取键值
switch (key8KeyValue)
{
case key8:
time20sCounter = 0; //只要有键按下则清0 20s计数器
if (setbit) //如果有键按下则进行处理
{
if(noiseMusicOrPlayMusic) //判断为播放音乐还是设置闹钟音乐
{
noiseMusicChoose = key8MusicPlayChoose;
}
else
{
PlayMusic(key8MusicPlayChoose, 1);
}
}
break;
case key3:
time20sCounter = 0; //只要有键按下则清0 20s计数器
setbit = 1; //有键按下标志位置1,表示有键按下
if (key8MusicPlayChoose < 9) //加1处理
{
key8MusicPlayChoose++;
}
else
{
key8MusicPlayChoose = 0x01;
}
break;
case key4:
time20sCounter = 0; //只要有键按下则清0 20s计数器
setbit = 1; //有键按下标志位置1,表示有键按下
if (key8MusicPlayChoose > 1) //减1处理
{
key8MusicPlayChoose--;
}
else
{
key8MusicPlayChoose = 0x09;
}
break;
};
}
if ((key8KeyValue == key8)||(time20sIsOK ==1)) //按下退出键或者20s没有键按下则推出设置播放音乐界面,进入显示主程序
{
DS1302ReadTimeData();
FindDataOfWeek();
Change();
LcdSetXY(0, 0);
LcdPutFlashString(solarData);
LcdSetXY(1, 0);
LcdPutFlashString(timeData);
DisplayOne();
break;
}
else //否则显示此时选择的音乐
{
LcdSetXY(1, 7);
LcdPutOneChar(key8MusicPlayChoose + 48);
}
}
}
unsigned char NoiseTimeFlag(void)
{
unsigned char noiseTimeFlag = 0x01;//是否达到闹钟时间的标志,并初始化为到达
unsigned char i;
for(i = 0; i < 8; i++)
{
if (DS1302Data[i] != noiseData[i])
{
noiseTimeFlag = 0x00; //如果有一个数据不同,表示没有到达闹钟时间,清0闹钟到达标志
break;
}
}
return noiseTimeFlag;
}
void main(void)
{
unsigned char mainKeyValue; //主程序中用于判断键值的变量
bit mainPlayNoise;
bit mainPlayHour;
mainPlayNoise = 0;
mainPlayHour = 0;
KeyInit(); // 按键处理程序初始化
LcdInit(); // 液晶显示初始化
MusicInit(); // 音乐播放初始化
TimingInit(); // 定时初始化
UsartInit(); // 串口初始化
//液晶最开始显示阳历和时间格式
LcdSetXY(0, 0);
LcdPutFlashString(solarData);
LcdSetXY(1, 0);
LcdPutFlashString(timeData);
// noiseSetFlag = 0; //清0闹钟使能标志
noiseMusicChoose = 0x01; //闹钟音乐默认为第一首
mainKeyValue = 0x00; //清0键值
noiseMusicOrPlayMusic = 0; //初始化默认为设置播放音乐
/* noiseData[0]=00;
noiseData[1]=00;
noiseData[2]=12;
noiseData[3] = 5;
noiseData[4]=0x01;
noiseData[5]=0x01;
noiseData[6]=0x01;
noiseData[7]=0x14;
DS1302WriteRamData();
noiseSetFlag = 1;
*/
DS1302ReadRamData(); //读取闹钟数据存入noiseData
#asm("sei") //开放中断
//主程序中循环执行以下语句
/* DS1302Data[0]=56;
DS1302Data[1]=59;
DS1302Data[2]=11;
DS1302Data[3]=5;
DS1302Data[4]=0x01;
DS1302Data[5]=0x01;
DS1302Data[6]=0x01;
DS1302Data[7]=0x14;
// DS1302Data[11]=0x14;
DS1302WriteTimeData();
*/
while (1)
{
FindTime(); //判断各个时间段是否已经到达
DS1302ReadTimeData(); //读取时钟数据
FindDataOfWeek(); //计算星期
Change(); //显示数据送缓冲区
DisplayOne(); //显示阳历和时间
LcdSetXY(1, 6); //显示闹钟标志
if (noiseData[8] == 0x01 )
{
LcdPutOneChar(0x2A);
}
else
{
LcdPutOneChar(0x20);
}
if (TCCR1B == 0x08)
{
mainPlayNoise = 0;
mainPlayHour = 0;
}
if ((NoiseTimeFlag() == 0x01) && (noiseData[8] == 0x01)) //判断是否闹钟时间到,如果是的话延时1s闹钟起闹
{
mainPlayNoise = 1;
// mainPlayHour = 0;
DS1302ReadTimeData();
Change();
DisplayOne();
delay_ms(300);
DS1302ReadTimeData();
Change();
DisplayOne();
delay_ms(300);
DS1302ReadTimeData();
Change();
DisplayOne();
delay_ms(400);
PlayMusic(noiseMusicChoose, 10);
}
else if ((DS1302Data[1] == 0) && (DS1302Data[0] == 0) && (mainPlayNoise == 0)) //判断是否为整点,如果是的话延时1s报时
{
mainPlayHour = 1;
// mainPlayNoise = 0;
DS1302ReadTimeData();
Change();
DisplayOne();
delay_ms(300);
DS1302ReadTimeData();
Change();
DisplayOne();
delay_ms(300);
DS1302ReadTimeData();
Change();
DisplayOne();
delay_ms(400);
if (DS1302Data[2] % 12)
{
PlayMusic(0x0A, (DS1302Data[2] % 12));
}
else
{
PlayMusic(0x0A, 12);
}
}
// else
// {
// mainPlayNoise = 0;
// mainPlayHour = 0;
// }
if (time10msIsOK) //判断是否10ms已经到达,如果是,则扫描一次按键
{
time10msIsOK = 0;
mainKeyValue = FindKeyValue(); //读取键值
if ((mainKeyValue != 0) && (TCCR1B == 0x0A)) //如果按键按下时有音乐在播放,则关闭定时器1,停止音乐播放
{
TCCR1B = 0x08;
}
else
{
switch (mainKeyValue)
{
case key5 : //按键5按下则显示农历和星期
SeeLunarAndWeek();
break;
case key6: //按键6按下为设置时间和阳历
SetTimeAndSolar();
break;
case key7: //按键7按下为设置闹钟时间和音乐
SetNoiseData();
break;
case key8: //按键8按下为播放音乐选择
SetMusicPlay();
break;
};
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -