#include "control.h"
#include "lcd1602.h"
#include "timing.h"
#include "key.h"
System_Port system_info;
void System_Init(void)
{
system_info.sta=Nomal_Operation;
system_info.alarm_enable=DISABLE;
system_info.buzz_enable=DISABLE;
BUZZ=0;
LcdShowStr(0,0,"20 - - D");
LcdShowStr(0,1," : : Normal");
}
void show_bcd_array(struct sTime time)
{
LcdShowBCD(2,0,time.year);
LcdShowBCD(5,0,time.mon);
LcdShowBCD(8,0,time.day);
LcdShowBCD(0,1,time.hour);
LcdShowBCD(3,1,time.min);
LcdShowBCD(6,1,time.sec);
}
void BUZZ_Check(void)
{
if(system_info.buzz_enable==ENABLE)
{
if(system_info.buzz_flag)
{
system_info.buzz_flag=0;
BUZZ=!BUZZ;
}
}
}
void Compare_Alarm(void)
{
if(system_info.alarm_enable==ENABLE)
if(system_info.AlarmTime.year==system_info.CurTime.year)
if(system_info.AlarmTime.mon==system_info.CurTime.mon)
if(system_info.AlarmTime.day==system_info.CurTime.day)
if(system_info.AlarmTime.hour==system_info.CurTime.hour)
if(system_info.AlarmTime.min==system_info.CurTime.min)
if(system_info.AlarmTime.sec==system_info.CurTime.sec)
system_info.buzz_enable=ENABLE;
}
void RefreshTime(void)
{
if(timing_info.flag_200ms)
{
timing_info.flag_200ms=0;
if(system_info.sta==Nomal_Operation)
{
if(system_info.alarm_enable)
{
LcdShowChar(15,0,'E');
}
else
LcdShowChar(15,0,'D');
GetRealTime(&system_info.CurTime);
show_bcd_array(system_info.CurTime);
Compare_Alarm();
}
}
}
void SetLeftShift(void)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:system_info.SetIndex=13;LcdSetCursor(7,1);break;
case 3:system_info.SetIndex=2;LcdSetCursor(2,0);break;
case 4:system_info.SetIndex=3;LcdSetCursor(3,0);break;
case 5:system_info.SetIndex=4;LcdSetCursor(5,0);break;
case 6:system_info.SetIndex=5;LcdSetCursor(6,0);break;
case 7:system_info.SetIndex=6;LcdSetCursor(8,0);break;
case 8:system_info.SetIndex=7;LcdSetCursor(9,0);break;
case 9:system_info.SetIndex=8;LcdSetCursor(0,1);break;
case 10:system_info.SetIndex=9;LcdSetCursor(1,1);break;
case 11:system_info.SetIndex=10;LcdSetCursor(3,1);break;
case 12:system_info.SetIndex=11;LcdSetCursor(4,1);break;
case 13:system_info.SetIndex=12;LcdSetCursor(6,1);break;
default:break;
}
}
}
void SetRightShift(void)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:system_info.SetIndex=3;LcdSetCursor(3,0);break;
case 3:system_info.SetIndex=4;LcdSetCursor(5,0);break;
case 4:system_info.SetIndex=5;LcdSetCursor(6,0);break;
case 5:system_info.SetIndex=6;LcdSetCursor(8,0);break;
case 6:system_info.SetIndex=7;LcdSetCursor(9,0);break;
case 7:system_info.SetIndex=8;LcdSetCursor(0,1);break;
case 8:system_info.SetIndex=9;LcdSetCursor(1,1);break;
case 9:system_info.SetIndex=10;LcdSetCursor(3,1);break;
case 10:system_info.SetIndex=11;LcdSetCursor(4,1);break;
case 11:system_info.SetIndex=12;LcdSetCursor(6,1);break;
case 12:system_info.SetIndex=13;LcdSetCursor(7,1);break;
case 13:system_info.SetIndex=2;LcdSetCursor(2,0);break;
default:break;
}
}
}
void RefreshCursor(void)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:LcdSetCursor(2,0);break;
case 3:LcdSetCursor(3,0);break;
case 4:LcdSetCursor(5,0);break;
case 5:LcdSetCursor(6,0);break;
case 6:LcdSetCursor(8,0);break;
case 7:LcdSetCursor(9,0);break;
case 8:LcdSetCursor(0,1);break;
case 9:LcdSetCursor(1,1);break;
case 10:LcdSetCursor(3,1);break;
case 11:LcdSetCursor(4,1);break;
case 12:LcdSetCursor(6,1);break;
case 13:LcdSetCursor(7,1);break;
default:break;
}
}
}
u8 IncBCDHigh(u8 bcd)
{
if((bcd&0xf0)<0x90)
bcd+=0x10;
else
bcd&=0x0f;
return bcd;
}
u8 IncBCDLow(u8 bcd)
{
if((bcd&0x0f)<0x09)
bcd+=0x01;
else
bcd&=0xf0;
return bcd;
}
u8 DecBCDHigh(u8 bcd)
{
if((bcd&0xf0)>0x00)
bcd-=0x10;
else
bcd|=0x90;
return bcd;
}
u8 DecBCDLow(u8 bcd)
{
if((bcd&0x0f)>0x00)
bcd-=0x01;
else
bcd|=0x09;
return bcd;
}
void UP_Action(struct sTime *tim)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:tim->year=IncBCDHigh(tim->year);break;
case 3:tim->year=IncBCDLow(tim->year);break;
case 4:tim->mon=IncBCDHigh(tim->mon);break;
case 5:tim->mon=IncBCDLow(tim->mon);break;
case 6:tim->day=IncBCDHigh(tim->day);break;
case 7:tim->day=IncBCDLow(tim->day);break;
case 8:tim->hour=IncBCDHigh(tim->hour);break;
case 9:tim->hour=IncBCDLow(tim->hour);break;
case 10:tim->min=IncBCDHigh(tim->min);break;
case 11:tim->min=IncBCDLow(tim->min);break;
case 12:tim->sec=IncBCDHigh(tim->sec);break;
case 13:tim->sec=IncBCDLow(tim->sec);break;
default:break;
}
show_bcd_array(*tim);
RefreshCursor();
}
}
void DEC_Action(struct sTime *tim)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:tim->year=DecBCDHigh(tim->year);break;
case 3:tim->year=DecBCDLow(tim->year);break;
case 4:tim->mon=DecBCDHigh(tim->mon);break;
case 5:tim->mon=DecBCDLow(tim->mon);break;
case 6:tim->day=DecBCDHigh(tim->day);break;
case 7:tim->day=DecBCDLow(tim->day);break;
case 8:tim->hour=DecBCDHigh(tim->hour);break;
case 9:tim->hour=DecBCDLow(tim->hour);break;
case 10:tim->min=DecBCDHigh(tim->min);break;
case 11:tim->min=DecBCDLow(tim->min);break;
case 12:tim->sec=DecBCDHigh(tim->sec);break;
case 13:tim->sec=DecBCDLow(tim->sec);break;
default:break;
}
show_bcd_array(*tim);
RefreshCursor();
}
}
void UP_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:UP_Action(&system_info.SetTime);break;
case SET_ALARM:UP_Action(&system_info.SetAlarmTime);break;
default:break;
}
}
void DEC_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:DEC_Action(&system_info.SetTime);break;
case SET_ALARM:DEC_Action(&system_info.SetAlarmTime);break;
default:break;
}
}
void Affirm_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:
{
SetRealTime(&system_info.SetTime);
system_info.sta=SET_ALARM;
system_info.SetAlarmTime=system_info.SetTime;
LcdClear();
LcdShowStr(0,0,"20 - - Set");
LcdShowStr(0,1," : : Alarm");
show_bcd_array(system_info.SetAlarmTime);
LcdSetCursor(2,0);
LcdOpenCursor();
system_info.SetIndex=2;
break;
}
case SET_ALARM:
{
system_info.AlarmTime=system_info.SetAlarmTime;
system_info.sta=Nomal_Operation;
LcdClear();
LcdShowStr(0,0,"20 - - ");
LcdShowStr(0,1," : : Normal");
LcdCloseCursor();
break;
}
default:break;
}
}
void Exit_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:
{
system_info.sta=SET_ALARM;
system_info.SetAlarmTime=system_info.CurTime;
LcdClear();
LcdShowStr(0,0,"20 - - Set");
LcdShowStr(0,1," : : Alarm");
show_bcd_array(system_info.SetAlarmTime);
LcdSetCursor(2,0);
LcdOpenCursor();
system_info.SetIndex=2;
break;
}
case SET_ALARM:
{
system_info.sta=Nomal_Operation;
LcdClear();
LcdShowStr(0,0,"20 - - ");
LcdShowStr(0,1," : : Normal");
LcdCloseCursor();
break;
}
default:break;
}
}
void Edit_Press(void)
{
switch(system_info.sta)
{
case Nomal_Operation:
{
system_info.sta=SET_TIME;
system_info.SetTime=system_info.CurTime;
LcdClear();
LcdShowStr(0,0,"20 - - Set");
LcdShowStr(0,1," : : Time");
show_bcd_array(system_info.SetTime);
LcdSetCursor(2,0);
LcdOpenCursor();
system_info.SetIndex=2;
break;
}
default:break;
}
}
void Alarm_Config_Press(void)
{
if(system_info.alarm_enable==ENABLE)
{
system_info.alarm_enable=DISABLE;
if(system_info.buzz_enable==ENABLE)
{
BUZZ=0;
system_info.buzz_enable=DISABLE;
}
}
else
system_info.alarm_enable=ENABLE;
}
void key_specific_action(u8 i)
{
switch(i)
{
case 0:Alarm_Config_Press();break;
case 1:Affirm_Press();break;
case 2:Exit_Press();break;
case 3:Edit_Press();break;
case 4:DEC_Press();break;
case 5:UP_Press();break;
case 6:SetRightShift();break;
case 7:SetLeftShift();break;
default:break;
}
}
void control(void)
{
RefreshTime();
key_action();
BUZZ_Check();
}
#include "lcd1602.h"
#include "timing.h"
#include "key.h"
System_Port system_info;
void System_Init(void)
{
system_info.sta=Nomal_Operation;
system_info.alarm_enable=DISABLE;
system_info.buzz_enable=DISABLE;
BUZZ=0;
LcdShowStr(0,0,"20 - - D");
LcdShowStr(0,1," : : Normal");
}
void show_bcd_array(struct sTime time)
{
LcdShowBCD(2,0,time.year);
LcdShowBCD(5,0,time.mon);
LcdShowBCD(8,0,time.day);
LcdShowBCD(0,1,time.hour);
LcdShowBCD(3,1,time.min);
LcdShowBCD(6,1,time.sec);
}
void BUZZ_Check(void)
{
if(system_info.buzz_enable==ENABLE)
{
if(system_info.buzz_flag)
{
system_info.buzz_flag=0;
BUZZ=!BUZZ;
}
}
}
void Compare_Alarm(void)
{
if(system_info.alarm_enable==ENABLE)
if(system_info.AlarmTime.year==system_info.CurTime.year)
if(system_info.AlarmTime.mon==system_info.CurTime.mon)
if(system_info.AlarmTime.day==system_info.CurTime.day)
if(system_info.AlarmTime.hour==system_info.CurTime.hour)
if(system_info.AlarmTime.min==system_info.CurTime.min)
if(system_info.AlarmTime.sec==system_info.CurTime.sec)
system_info.buzz_enable=ENABLE;
}
void RefreshTime(void)
{
if(timing_info.flag_200ms)
{
timing_info.flag_200ms=0;
if(system_info.sta==Nomal_Operation)
{
if(system_info.alarm_enable)
{
LcdShowChar(15,0,'E');
}
else
LcdShowChar(15,0,'D');
GetRealTime(&system_info.CurTime);
show_bcd_array(system_info.CurTime);
Compare_Alarm();
}
}
}
void SetLeftShift(void)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:system_info.SetIndex=13;LcdSetCursor(7,1);break;
case 3:system_info.SetIndex=2;LcdSetCursor(2,0);break;
case 4:system_info.SetIndex=3;LcdSetCursor(3,0);break;
case 5:system_info.SetIndex=4;LcdSetCursor(5,0);break;
case 6:system_info.SetIndex=5;LcdSetCursor(6,0);break;
case 7:system_info.SetIndex=6;LcdSetCursor(8,0);break;
case 8:system_info.SetIndex=7;LcdSetCursor(9,0);break;
case 9:system_info.SetIndex=8;LcdSetCursor(0,1);break;
case 10:system_info.SetIndex=9;LcdSetCursor(1,1);break;
case 11:system_info.SetIndex=10;LcdSetCursor(3,1);break;
case 12:system_info.SetIndex=11;LcdSetCursor(4,1);break;
case 13:system_info.SetIndex=12;LcdSetCursor(6,1);break;
default:break;
}
}
}
void SetRightShift(void)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:system_info.SetIndex=3;LcdSetCursor(3,0);break;
case 3:system_info.SetIndex=4;LcdSetCursor(5,0);break;
case 4:system_info.SetIndex=5;LcdSetCursor(6,0);break;
case 5:system_info.SetIndex=6;LcdSetCursor(8,0);break;
case 6:system_info.SetIndex=7;LcdSetCursor(9,0);break;
case 7:system_info.SetIndex=8;LcdSetCursor(0,1);break;
case 8:system_info.SetIndex=9;LcdSetCursor(1,1);break;
case 9:system_info.SetIndex=10;LcdSetCursor(3,1);break;
case 10:system_info.SetIndex=11;LcdSetCursor(4,1);break;
case 11:system_info.SetIndex=12;LcdSetCursor(6,1);break;
case 12:system_info.SetIndex=13;LcdSetCursor(7,1);break;
case 13:system_info.SetIndex=2;LcdSetCursor(2,0);break;
default:break;
}
}
}
void RefreshCursor(void)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:LcdSetCursor(2,0);break;
case 3:LcdSetCursor(3,0);break;
case 4:LcdSetCursor(5,0);break;
case 5:LcdSetCursor(6,0);break;
case 6:LcdSetCursor(8,0);break;
case 7:LcdSetCursor(9,0);break;
case 8:LcdSetCursor(0,1);break;
case 9:LcdSetCursor(1,1);break;
case 10:LcdSetCursor(3,1);break;
case 11:LcdSetCursor(4,1);break;
case 12:LcdSetCursor(6,1);break;
case 13:LcdSetCursor(7,1);break;
default:break;
}
}
}
u8 IncBCDHigh(u8 bcd)
{
if((bcd&0xf0)<0x90)
bcd+=0x10;
else
bcd&=0x0f;
return bcd;
}
u8 IncBCDLow(u8 bcd)
{
if((bcd&0x0f)<0x09)
bcd+=0x01;
else
bcd&=0xf0;
return bcd;
}
u8 DecBCDHigh(u8 bcd)
{
if((bcd&0xf0)>0x00)
bcd-=0x10;
else
bcd|=0x90;
return bcd;
}
u8 DecBCDLow(u8 bcd)
{
if((bcd&0x0f)>0x00)
bcd-=0x01;
else
bcd|=0x09;
return bcd;
}
void UP_Action(struct sTime *tim)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:tim->year=IncBCDHigh(tim->year);break;
case 3:tim->year=IncBCDLow(tim->year);break;
case 4:tim->mon=IncBCDHigh(tim->mon);break;
case 5:tim->mon=IncBCDLow(tim->mon);break;
case 6:tim->day=IncBCDHigh(tim->day);break;
case 7:tim->day=IncBCDLow(tim->day);break;
case 8:tim->hour=IncBCDHigh(tim->hour);break;
case 9:tim->hour=IncBCDLow(tim->hour);break;
case 10:tim->min=IncBCDHigh(tim->min);break;
case 11:tim->min=IncBCDLow(tim->min);break;
case 12:tim->sec=IncBCDHigh(tim->sec);break;
case 13:tim->sec=IncBCDLow(tim->sec);break;
default:break;
}
show_bcd_array(*tim);
RefreshCursor();
}
}
void DEC_Action(struct sTime *tim)
{
if(system_info.sta!=Nomal_Operation)
{
switch(system_info.SetIndex)
{
case 2:tim->year=DecBCDHigh(tim->year);break;
case 3:tim->year=DecBCDLow(tim->year);break;
case 4:tim->mon=DecBCDHigh(tim->mon);break;
case 5:tim->mon=DecBCDLow(tim->mon);break;
case 6:tim->day=DecBCDHigh(tim->day);break;
case 7:tim->day=DecBCDLow(tim->day);break;
case 8:tim->hour=DecBCDHigh(tim->hour);break;
case 9:tim->hour=DecBCDLow(tim->hour);break;
case 10:tim->min=DecBCDHigh(tim->min);break;
case 11:tim->min=DecBCDLow(tim->min);break;
case 12:tim->sec=DecBCDHigh(tim->sec);break;
case 13:tim->sec=DecBCDLow(tim->sec);break;
default:break;
}
show_bcd_array(*tim);
RefreshCursor();
}
}
void UP_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:UP_Action(&system_info.SetTime);break;
case SET_ALARM:UP_Action(&system_info.SetAlarmTime);break;
default:break;
}
}
void DEC_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:DEC_Action(&system_info.SetTime);break;
case SET_ALARM:DEC_Action(&system_info.SetAlarmTime);break;
default:break;
}
}
void Affirm_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:
{
SetRealTime(&system_info.SetTime);
system_info.sta=SET_ALARM;
system_info.SetAlarmTime=system_info.SetTime;
LcdClear();
LcdShowStr(0,0,"20 - - Set");
LcdShowStr(0,1," : : Alarm");
show_bcd_array(system_info.SetAlarmTime);
LcdSetCursor(2,0);
LcdOpenCursor();
system_info.SetIndex=2;
break;
}
case SET_ALARM:
{
system_info.AlarmTime=system_info.SetAlarmTime;
system_info.sta=Nomal_Operation;
LcdClear();
LcdShowStr(0,0,"20 - - ");
LcdShowStr(0,1," : : Normal");
LcdCloseCursor();
break;
}
default:break;
}
}
void Exit_Press(void)
{
switch(system_info.sta)
{
case SET_TIME:
{
system_info.sta=SET_ALARM;
system_info.SetAlarmTime=system_info.CurTime;
LcdClear();
LcdShowStr(0,0,"20 - - Set");
LcdShowStr(0,1," : : Alarm");
show_bcd_array(system_info.SetAlarmTime);
LcdSetCursor(2,0);
LcdOpenCursor();
system_info.SetIndex=2;
break;
}
case SET_ALARM:
{
system_info.sta=Nomal_Operation;
LcdClear();
LcdShowStr(0,0,"20 - - ");
LcdShowStr(0,1," : : Normal");
LcdCloseCursor();
break;
}
default:break;
}
}
void Edit_Press(void)
{
switch(system_info.sta)
{
case Nomal_Operation:
{
system_info.sta=SET_TIME;
system_info.SetTime=system_info.CurTime;
LcdClear();
LcdShowStr(0,0,"20 - - Set");
LcdShowStr(0,1," : : Time");
show_bcd_array(system_info.SetTime);
LcdSetCursor(2,0);
LcdOpenCursor();
system_info.SetIndex=2;
break;
}
default:break;
}
}
void Alarm_Config_Press(void)
{
if(system_info.alarm_enable==ENABLE)
{
system_info.alarm_enable=DISABLE;
if(system_info.buzz_enable==ENABLE)
{
BUZZ=0;
system_info.buzz_enable=DISABLE;
}
}
else
system_info.alarm_enable=ENABLE;
}
void key_specific_action(u8 i)
{
switch(i)
{
case 0:Alarm_Config_Press();break;
case 1:Affirm_Press();break;
case 2:Exit_Press();break;
case 3:Edit_Press();break;
case 4:DEC_Press();break;
case 5:UP_Press();break;
case 6:SetRightShift();break;
case 7:SetLeftShift();break;
default:break;
}
}
void control(void)
{
RefreshTime();
key_action();
BUZZ_Check();
}