⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.cpp

📁 c语言源玛,扫描的游戏代码,攻大家看.多体意见
💻 CPP
字号:

#include "ClockApp.h"
#include "Calendar.h"
#include "EEprom.h"
#include "Ring.h"

// m_view_type:
//    0: 月日星期时分秒
//    1: 年月日星期节气
//    2: 闹钟
//    3: 农历月日节气


CClock::CClock()
{
    m_month = 1; m_day = 1;
#ifdef WIN32
    m_year = 0;
    m_hour = m_min = m_sec = 0;
    m_tick = m_view_tick = m_view_type = 0;
    m_alarm_index = 0;
#endif
#if SUPPORT_LUNAR
    m_lunar_mon = 11; m_lunar_day = 25;
#if SUPPORT_LUNAR_HOLIDAY
    m_lunar_holiday = 23; m_lunar_holiday_wait = 5;
//    m_lunar_holiday_wait =
#endif
//            CCalendar::GetLunar(
//                      m_lunar_mon,
//                      m_lunar_day,
//#if SUPPORT_LUNAR_HOLIDAY
//                      m_lunar_holiday,
//#endif
//                      m_year, m_month,
//                      m_day);
#endif
    m_week_day = 6;
    //m_week_day = CCalendar::GetWeekday(year, month, day)
    CEEprom::LoadConfig(m_alarmBuff, m_hour_ring);
}

CClock::~CClock()
{
}

bool CClock::OnKeyPress(UCHAR key, UCHAR sec, UCHAR down)
{
    if(!down && !sec){
        m_view_tick = 4 * 16;//显示4秒钟
#if SUPPORT_LUNAR
        if(KEY_RIGHT == key){
            m_view_type = 3;//显示农历
            Refresh();
        }else
#endif
        if(KEY_PREV == key || KEY_NEXT == key){
            memset(&led, 0, sizeof(led));
            CClockApp::clockApp->Flash(NULL);//不要豆豆跳动
            if(m_view_type != 2) m_alarm_index = 0;
            else if(key == KEY_PREV){
                if(!m_alarm_index) m_alarm_index = ALARM_MAX-1;
                else m_alarm_index--;
            }else{
                if(m_alarm_index >= ALARM_MAX-1) m_alarm_index = 0;
                else m_alarm_index++;
            }
            AlarmbuffToLedbuff(led, m_alarmBuff[m_alarm_index], m_alarm_index);
            led.dot = 1;
            CClockApp::clockApp->Display(led);
            m_view_type = 2; //显示闹钟
        }else/* if(KEY_LEFT == key)*/{
            m_view_type = 1;//显示年月日
            Refresh();
        }//else return false;
        return true;
    }else if(down && KEY_LEFT == key && m_view_type == 1){
        if(sec > 2){
            //在看年月日的时候长时间按住left
            m_view_tick = 4 * 16;//显示4秒钟
            m_hour_ring = !m_hour_ring;
            //保存设置
            CEEprom::SaveConfig(m_alarmBuff, m_hour_ring);
            if(m_hour_ring) CRing::Beep(1000, 16);
            CClockApp::clockApp->CleanKeystate();
        }
        return true;
    }
    return false;
}

void CClock::OnTick()
{
    if(m_view_tick && !--m_view_tick)
        m_view_type = 0;

    if(++m_tick & 0x0f) return;

    for(;;){
        if(++m_sec < 60) break;
        m_sec = 0;
        if(++m_min < 60) break;
        m_min = 0;
        if(++m_hour < 24) break;
        m_hour = 0;

        for(;;){
            ++m_day;
            if(m_day <= 28) break;
            if(m_day <= 31 &&
                ((m_month < 8 && (m_month & 1)) || (m_month > 7 && !(m_month & 1))) ) break;
            if(m_day <= 30 && (m_month == 4 || m_month == 6 || m_month == 9 || m_month == 11)) break;
            if(!(m_year & 3)){//闰年
                if(m_day <= 29) break;
            }
            m_day = 1;

            if(++m_month < 13) break;
            m_month = 1;
            if(++m_year >= 100) m_year = 0;
            break;
        }
        //重新计算星期
        if(m_week_day == 6) m_week_day = 0;
        else m_week_day++;

#if SUPPORT_LUNAR
        //重新计算农历
#if SUPPORT_LUNAR_HOLIDAY
        m_lunar_holiday_wait =
#endif
          CCalendar::GetLunar(
                   m_lunar_mon,
                   m_lunar_day,
#if SUPPORT_LUNAR_HOLIDAY
                   m_lunar_holiday,
#endif
                   m_year, m_month,
                   m_day);
#endif
        break;
    }
    if(m_view_type != 2) Refresh();
    //半点和整点报时
    if((!m_min || m_min == 30) &&
        !m_sec && m_hour_ring &&
        m_hour >= 7 && m_hour <= 22) CRing::Beep(1000, 16);
    //闹钟
    UCHAR i;
    for(i = 0; i < ALARM_MAX; i++){
        if(m_alarmBuff[i].enable &&
            !m_sec &&
            m_alarmBuff[i].hour == m_hour && m_alarmBuff[i].min == m_min &&
            (m_alarmBuff[i].week & (1<<m_week_day)) ){
            //播放铃声 m_alarmBuff[i].ring
            CRing::Play(m_alarmBuff[i].ring);
            break;
        }
    }
}

void CClock::GetTime(UCHAR &year, UCHAR &month, UCHAR &day, UCHAR &hour, UCHAR &min, UCHAR &sec)
{
    year = m_year; month = m_month; day = m_day;
    hour = m_hour; min = m_min; sec = m_sec;
}

void CClock::SetTime(UCHAR year, UCHAR month, UCHAR day, UCHAR hour, UCHAR min, UCHAR sec)
{
    m_year = year; m_month = month; m_day = day;
    m_hour = hour; m_min = min; m_sec = sec;

    //计算星期
    m_week_day = CCalendar::GetWeekday(year, month, day);
#if SUPPORT_LUNAR
    //计算农历
#if SUPPORT_LUNAR_HOLIDAY
    m_lunar_holiday_wait =
#endif
        CCalendar::GetLunar(
                   m_lunar_mon,
                   m_lunar_day,
#if SUPPORT_LUNAR_HOLIDAY
                   m_lunar_holiday,
#endif
                   m_year, m_month,
                   m_day);
#endif
    m_tick = 0;
}

void CClock::OnSetFocus()
{
    CClockApp::clockApp->Flash(NULL);
    m_view_tick = m_view_type = 0;
    Refresh();
}

void CClock::Refresh()
{
    memset(&led, 0, sizeof(led));
    if(CClockApp::clockApp->GetCurrentFunc() == this){//正常工作模式
        if(m_view_type == 3 && m_lunar_mon & 0xf0){
            //闰月
            led.lunMon1 = led.lunMon2 = 0x7f;
            CClockApp::clockApp->Flash(&led);//让月份跳动
        }
        if(!m_view_type){
            led.dot = 1;
            CClockApp::clockApp->Flash(&led);//让豆豆跳动
        }

#if SUPPORT_LUNAR_HOLIDAY
        if((m_view_type == 1 && !m_lunar_holiday_wait) ||//显示日期时,今日就是某节气
            m_view_type == 3){ //显示农历时
            if(m_lunar_holiday > 9)led.lunarholiday1 = DataLed[m_lunar_holiday / 10];
            led.lunarholiday2 = DataLed[m_lunar_holiday % 10];
        }
#endif
        if(m_view_type <= 1){
            //月
            if(m_month > 9) led.mon1 = DataLed[1];
            led.mon2 = DataLed[m_month % 10];
            //日
            if(m_day > 9) led.day1 = DataLed[m_day / 10];
            led.day2 = DataLed[m_day % 10];
            //星期
            if(m_week_day) led.week = DataLed[m_week_day];
            else led.week = 127;
        }
        if(m_view_type == 1){//显示年月日
            //年
            led.year1 = DataLed[2];
            led.year2 = DataLed[0];
            led.year3 = DataLed[m_year / 10];
            led.year4 = DataLed[m_year % 10];
            //整点报时
            if(m_hour_ring) led.hourring = 0x7f;
#if SUPPORT_LUNAR
        }else if(m_view_type == 3){//显示农历
#if SUPPORT_LUNAR_HOLIDAY
            if(m_lunar_holiday_wait){
                if(m_lunar_holiday_wait > 9)
                    led.lunHolidayWait1 = DataLed[1];
                led.lunHolidayWait2 = DataLed[m_lunar_holiday_wait % 10];
            }
#endif
            //月
            if((m_lunar_mon & 0x0f) > 9) led.lunMon1 = DataLed[1];
            led.lunMon2 = DataLed[(m_lunar_mon & 0x0f) % 10];
            //日
            if(m_lunar_day > 9) led.lunDay1 = DataLed[m_lunar_day / 10];
            led.lunDay2 = DataLed[m_lunar_day % 10];
#endif
        }else if(!m_view_type){//显示时间
            //时
            if(m_hour > 9) led.hour1 = DataLed[m_hour / 10];
            led.hour2 = DataLed[m_hour % 10];
            //分
            led.min1 = DataLed[m_min / 10];
            led.min2 = DataLed[m_min % 10];
            //秒
            led.sec1 = DataLed[m_sec / 10];
            led.sec2 = DataLed[m_sec % 10];
            //豆豆
            led.dot = 1;
        }
        CClockApp::clockApp->Display(led);
    }
}

void CClock::AlarmbuffToLedbuff(LEDBUFF &led, const ALARMBUFF &alarm, UCHAR index)
{
    led.mon1 = 127 - 64; //'O'
    if(alarm.enable){
        led.mon2 = 127 - 64 - 8; //'n'
    }else{
        led.mon2 = led.day1 = 127 - 2 - 4 - 8;//'F'
    }
    led.week = DataLed[index+1];
    //时
    if(alarm.hour > 9) led.hour1 = DataLed[alarm.hour / 10];
    led.hour2 = DataLed[alarm.hour % 10];
    //分
    led.min1 = DataLed[alarm.min / 10];
    led.min2 = DataLed[alarm.min % 10];
    //铃声
    UCHAR ring = alarm.ring+1;
    if(ring > 9) led.ring1 = DataLed[ring / 10];
    led.ring2 = DataLed[ring % 10];
    //星期标志
    led.weeksel = alarm.week;
}

void CClock::GetAlarm(ALARMBUFF &alarm, UCHAR index)
{
    if(index < ALARM_MAX){
        alarm = m_alarmBuff[index];
    }
}

void CClock::SetAlarm(ALARMBUFF &alarm, UCHAR index)
{
    if(index < ALARM_MAX){
        m_alarmBuff[index] = alarm;
        //保存设置
        CEEprom::SaveConfig(m_alarmBuff, m_hour_ring);
    }
}

void CClock::SetSecondZero()
{
    if(m_sec < 30){
        m_sec = 0;
        m_tick = 0;
        Refresh();
    }else{
        m_tick = 0x0f;
        m_sec = 59;
        OnTick();
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -