#include <REGX52.H>
#include"DS1302.h"
#include"LCD1602.h"
#include"Delay.h"
#include"Key.h"
#include"Timer0Init.h"
#include"Buzzer.h"
//存放周一到周日的显示字符
unsigned char Day[][6] = {"Mon. ", "Tues.", "Wed. ", "Thur.", "Fri. ", "Sat. ", "Sun. "};
//存放设置的脑钟时间
char Clock[] = {0,0,0};
//定义键码、设置时间位索引、设置时间闪烁标志、模式(显示时间/设置时间),闹钟设置时间位索引
unsigned char KeyNum, TimeSet_Sel, TimeSetFlag, Mode, Clock_Sel;
/**
* @brief 将周内对应数字转化为英文字符串缩写显示
* @param 无
* @retval 无
*/
void TranserShowStr_Day(char DayNum)
{
switch(DayNum) //将数字转化为对应字符串显示
{
case 1: LCD_ShowString(1,12,Day[0]);break;
case 2: LCD_ShowString(1,12,Day[1]);break;
case 3: LCD_ShowString(1,12,Day[2]);break;
case 4: LCD_ShowString(1,12,Day[3]);break;
case 5: LCD_ShowString(1,12,Day[4]);break;
case 6: LCD_ShowString(1,12,Day[5]);break;
case 7: LCD_ShowString(1,12,Day[6]);break;
}
}
/**
* @brief 显示当前的时间包括:年月日时分秒
* @param 无
* @retval 无
*/
void ShowTime(void) //显示年月日时分秒
{
LCD_ShowNum(1,1,DS1302_Time[0],2); //显示年
LCD_ShowChar(1,3,'-');
LCD_ShowNum(1,4,DS1302_Time[1],2); //显示月
LCD_ShowChar(1,6,'-');
LCD_ShowNum(1,7,DS1302_Time[2],2); //显示日
LCD_ShowNum(2,1,DS1302_Time[3],2); //显示时
LCD_ShowChar(2,3,':');
LCD_ShowNum(2,4,DS1302_Time[4],2); //显示分
LCD_ShowChar(2,6,':');
LCD_ShowNum(2,7,DS1302_Time[5],2); //显示秒
}
/**
* @brief 设置时间模式下显示当前的时间包括:年月日时分秒,设置位闪烁
* @param 无
* @retval 无
*/
void ShowSetTime(void) //显示年月日时分秒
{
//特殊符号显示
LCD_ShowChar(1,3,'-');
LCD_ShowChar(1,6,'-');
LCD_ShowChar(2,3,':');
LCD_ShowChar(2,6,':');
if(TimeSet_Sel == 0 && TimeSetFlag ==1)
LCD_ShowString(1,1," ");
else
LCD_ShowNum(1,1,DS1302_Time[0],2); //显示年
if(TimeSet_Sel == 1 && TimeSetFlag ==1)
LCD_ShowString(1,4," ");
else
LCD_ShowNum(1,4,DS1302_Time[1],2); //显示月
if(TimeSet_Sel == 2 && TimeSetFlag ==1)
LCD_ShowString(1,7," ");
else
LCD_ShowNum(1,7,DS1302_Time[2],2); //显示日
if(TimeSet_Sel == 3 && TimeSetFlag ==1)
LCD_ShowString(2,1," ");
else
LCD_ShowNum(2,1,DS1302_Time[3],2); //显示时
if(TimeSet_Sel == 4 && TimeSetFlag ==1)
LCD_ShowString(2,4," ");
else
LCD_ShowNum(2,4,DS1302_Time[4],2); //显示分
if(TimeSet_Sel == 5 && TimeSetFlag ==1)
LCD_ShowString(2,7," ");
else
LCD_ShowNum(2,7,DS1302_Time[5],2); //显示秒
}
/**
* @brief 越上界判断和校正
* @param 无
* @retval 无
*/
void BoundedCheckUp(void) //越上界判断函数
{
//越上界校正
if(DS1302_Time[0]>99)DS1302_Time[0] = 0; //年份越界判断
if(DS1302_Time[1]>12)DS1302_Time[1] = 1; //月份越界判断
//天数越界判断
if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
{
if(DS1302_Time[2]>30)DS1302_Time[2] = 1; //小月
}
else if(DS1302_Time[1]==2)
{
if(DS1302_Time[0]%4 == 0) //4年一闰2月29天,时钟寿命仅100年不需要考虑400年一闰
{
if(DS1302_Time[2]>29)DS1302_Time[2] = 1;
}
else
{
if(DS1302_Time[2]>28)DS1302_Time[2] = 1; //平年2月28天
}
}
else
{
if(DS1302_Time[2]>31)DS1302_Time[2] = 1; //大月
}
if(DS1302_Time[3]>23)DS1302_Time[3] = 0; //小时越界判断
if(DS1302_Time[4]>59)DS1302_Time[4] = 0; //分越界判断
if(DS1302_Time[5]>59)DS1302_Time[5] = 0; //秒越界判断
if(DS1302_Time[6]>7)DS1302_Time[6] = 1; //周内越界判断
}
/**
* @brief 越下界判断和校正
* @param 无
* @retval 无
*/
void BoundedCheckDown(void) //越下界判断函数
{
//越下界校正
if(DS1302_Time[0]<0)DS1302_Time[0] = 99; //年份越界判断
if(DS1302_Time[1]<1)DS1302_Time[1] = 12; //月份越界判断
//天数越界判断
if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
{
if(DS1302_Time[2]<1)DS1302_Time[2] = 30; //小月
if(DS1302_Time[2]>30)DS1302_Time[2] = 1; //小月
}
else if(DS1302_Time[1]==2)
{
if(DS1302_Time[0]%4 == 0) //4年一闰2月29天,时钟寿命仅100年不需要考虑400年一闰
{
if(DS1302_Time[2]<1)DS1302_Time[2] = 29;
if(DS1302_Time[2]>29)DS1302_Time[2] = 1;
}
else
{
if(DS1302_Time[2]<1)DS1302_Time[2] = 28; //平年2月28天
if(DS1302_Time[2]>28)DS1302_Time[2] = 1; //平年2月28天
}
}
else
{
if(DS1302_Time[2]<1)DS1302_Time[2] = 31; //大月
if(DS1302_Time[2]>31)DS1302_Time[2] = 1; //大月
}
if(DS1302_Time[3]<0)DS1302_Time[3] = 23; //小时越界判断
if(DS1302_Time[4]<0)DS1302_Time[4] = 59; //分越界判断
if(DS1302_Time[5]<0)DS1302_Time[5] = 59; //秒越界判断
if(DS1302_Time[6]<1)DS1302_Time[6] = 7; //周内越界判断
}
/**
* @brief 模式2,修改设置当前时间
* @param 无
* @retval 无
*/
void TimeSet(void) //设置时间函数
{
if(KeyNum == 2) //2号按键选择设置的时间位
{
Buzzer_Time(100); //蜂鸣器按键提示音
TimeSet_Sel++;
TimeSet_Sel %= 7; //索引在0~6
}
if(KeyNum == 3) //3号按键使当前时间位+1
{
Buzzer_Time(100); //蜂鸣器按键提示音
DS1302_Time[TimeSet_Sel]++;
BoundedCheckUp(); //越上界判断和校正
}
if(KeyNum == 4) //4号键使当前时间位-1
{
Buzzer_Time(100); //蜂鸣器按键提示音
DS1302_Time[TimeSet_Sel]--;
BoundedCheckDown(); //越下界判断和校正
}
ShowSetTime(); //显示当前修改后的时间
if(TimeSet_Sel == 6 && TimeSetFlag ==1) //选中时0.5s闪烁,未选中正常显示
LCD_ShowString(1,12," ");
else
TranserShowStr_Day(DS1302_Time[6]); //显示字符缩写是星期几
}
/**
* @brief 模式1,设置闹钟时间
* @param 无
* @retval 无
*/
void SetClock(void)
{
LCD_ShowString(1,1,"Clock:");
LCD_ShowNum(1,13,Clock_Sel,2);
if(KeyNum == 2) //2号按键选择设置的时间位
{
Buzzer_Time(100); //蜂鸣器按键提示音
Clock_Sel++;
Clock_Sel %= 3; //索引在0~1
}
if(KeyNum == 3) //3号按键使当前时间位+1
{
Buzzer_Time(100); //蜂鸣器按键提示音
Clock[Clock_Sel]++;
if(Clock[0]>23)Clock[0] = 0; //小时越界判断
if(Clock[1]>59)Clock[1] = 0; //分越界判断
if(Clock[2]>59)Clock[2] = 0; //秒越界判断
}
if(KeyNum == 4) //4号键使当前时间位-1
{
Buzzer_Time(100); //蜂鸣器按键提示音
Clock[Clock_Sel]--;
if(Clock[0]<0)Clock[0] = 23; //小时越界判断
if(Clock[1]<0)Clock[1] = 59; //分越界判断
if(Clock[2]<0)Clock[2] = 59; //秒越界判断
}
LCD_ShowChar(2,3,':');
LCD_ShowChar(2,6,':');
if(Clock_Sel == 0 && TimeSetFlag ==1)
LCD_ShowString(2,1," ");
else
LCD_ShowNum(2,1,Clock[0],2); //显示时
if(Clock_Sel == 1 && TimeSetFlag ==1)
LCD_ShowString(2,4," ");
else
LCD_ShowNum(2,4,Clock[1],2); //显示分
if(Clock_Sel == 2 && TimeSetFlag ==1)
LCD_ShowString(2,7," ");
else
LCD_ShowNum(2,7,Clock[2],2); //显示秒
}
void main()
{
//初始化
LCD_Init();
DS1302_Init();
DS1302_SetTime(); //给DS1302写入时间
Timer0Init(); //定时器初始化
while(1)
{
KeyNum = Key(); //接收键码
if(KeyNum == 1)
{
Buzzer_Time(100); //蜂鸣器按键提示音
if(Mode == 0)
{
Mode = 1; //切换至设置闹钟模式
LCD_Init();
Delay(100);
Clock_Sel = 0; //每次切换到设置闹钟索引清0
}