📄 main__.c
字号:
LcdPutOneChar((DS1302Data[key7I] / 10) + 48);
LcdPutOneChar((DS1302Data[key7I] % 10) + 48);
if (key7I == 6)
{
key7I = 0;
}
else if (key7I == 2)
{
key7I = 4;
}
else
{
++key7I;
}
break;
case key3: //按键3为加1处理
setbit = 1; //有键按下标志位置1,表示有键按下
time20sCounter = 0; //只要有键按下则清0 20s计数器
++DS1302Data[key7I];
break;
case key4: //按键4为减1处理
setbit = 1; //有键按下标志位置1,表示有键按下
time20sCounter = 0; //只要有键按下则清0 20s计数器
--DS1302Data[key7I];
break;
case key5: //按键5为加10处理
setbit = 1; //有键按下标志位置1,表示有键按下
time20sCounter = 0; //只要有键按下则清0 20s计数器
DS1302Data[key7I] += 10;
break;
case key8: //按键8为减10处理
setbit = 1; //有键按下标志位置1,表示有键按下
time20sCounter = 0; //只要有键按下则清0 20s计数器
DS1302Data[key7I] -= 10;
break;
};
}
if ((key7KeyValue == key7)||(time20sIsOK ==1)) //如果按下退出键或者20s没有键按下,则进入设置闹钟音乐
{
noiseMusicOrPlayMusic = 1;
SetMusicPlay();
noiseMusicOrPlayMusic = 0;
// DS1302ReadTimeData();
// Change();
// LcdSetXY(0, 0);
// LcdPutFlashString(solarData);
// LcdSetXY(1, 0);
// LcdPutFlashString(timeData);
// DisplayOne();
break;
}
else
{
if (time500msIsOK) //500ms到,取反显示标志
{
time500msIsOK = 0;
setOnbit = ~setOnbit;
}
switch (key7I)//switch语句用于选择显示的位置
{
case 0:
LcdSetXY(1, 14);
break;
case 1:
LcdSetXY(1, 11);
break;
case 2:
LcdSetXY(1, 8);
break;
case 4:
LcdSetXY(0, 14);
break;
case 5:
LcdSetXY(0, 11);
break;
case 6:
LcdSetXY(0, 8);
break;
};
DS1302CheckDataOve(); //判断数据有效性
if (setOnbit) //500ms显示数据,500ms显示空格
{
LcdPutOneChar(0x20);
LcdPutOneChar(0x20);
}
else
{
LcdPutOneChar((DS1302Data[key7I] / 10) + 48);
LcdPutOneChar((DS1302Data[key7I] % 10) + 48);
}
switch (key7I)//switch语句用于选择显示的位置
{
case 0:
LcdSetXY(1, 14);
break;
case 1:
LcdSetXY(1, 11);
break;
case 2:
LcdSetXY(1, 8);
break;
case 4:
LcdSetXY(0, 14);
break;
case 5:
LcdSetXY(0, 11);
break;
case 6:
LcdSetXY(0, 8);
break;
};
}
}
}
void SetMusicPlay(void)
{
unsigned char key8KeyValue; //用于存储键值
unsigned char key8MusicPlayChoose; //选择播放的音乐
bit setbit; //有按键按下标志位
setbit = 0;
key8KeyValue = 0; //初始化为0,表示没有按键按下
key8MusicPlayChoose = 0x01; //初始化为第一首音乐
time10msIsOK = 0; //清0 10ms, 20s标志位以及20s计数器
time20sIsOK = 0;
time20sCounter = 0;
LcdClear(); //清屏
//音乐选择界面显示初始化
LcdSetXY(0, 0);
LcdPutFlashString("CHOOSE MUSIC");
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 + -