单片机时钟程序(2)control.c

#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();


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值