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

📄 eeprom.cpp

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

#include "defines.h"
#include "EEprom.h"

/*
 使用中断的方式管理EEPROM的读写, 可以让在写EEPROM时读EEPROM需要等待的时间最少,
 最多等待8.5ms
*/
__eeprom UCHAR no_use = 0;         //开始的第一个字节不用
__eeprom UCHAR alarm_pos = 0x5a;   //当为0x5a时,启用第一组地址, 否则使用第二组地址
__eeprom UCHAR hourring1 = 0;
__eeprom ALARMBUFF alarm1[ALARM_MAX] = {0};
__eeprom UCHAR hourring2 = 0;
__eeprom ALARMBUFF alarm2[ALARM_MAX] = {0};

#if SUPPORT_LUNAR
__eeprom const USHORT gLunarMonthDays[LAST_LUNAT_YEAR-1998] = {
    0X92e0, 0Xc960,   //2000
    0Xd4a8, 0Xd4a0, 0Xda50, 0X5aa8, 0X56a0, 0Xaad8, 0X25d0, 0X92d0, 0Xc958, 0Xa950,   //2010
    0Xb4a0, 0Xb550, 0Xb550, 0X55a8, 0X4ba0, 0Xa5b0, 0X52b8, 0X52b0, 0Xa930, 0X74a8,   //2020
#if LAST_LUNAT_YEAR > 2020
    0X6aa0, 0Xad50, 0X4da8, 0X4b60, 0X9570, 0Xa4e0, 0Xd260, 0Xe930, 0Xd530, 0X5aa0,   //2030
#if LAST_LUNAT_YEAR > 2030
    0X6b50, 0X96d0, 0X4ae8, 0X4ad0, 0Xa4d0, 0Xd258, 0Xd250, 0Xd520, 0Xdaa0, 0Xb5a0,   //2040
#if LAST_LUNAT_YEAR > 2040
    0X56d0, 0X4ad8, 0X49b0, 0Xa4b8, 0Xa4b0, 0Xaa50, 0Xb528, 0X6d20, 0Xada0, 0X55b0    //2050
#endif
#endif
#endif
};

__eeprom const UCHAR gLunarMonth[(LAST_LUNAT_YEAR-1998)/2] = {
    0X00,   //2000
    0X40, 0X02, 0X07, 0X00, 0X50,   //2010
    0X04, 0X09, 0X00, 0X60, 0X04,   //2020
#if LAST_LUNAT_YEAR > 2020
    0X00, 0X20, 0X60, 0X05, 0X00,   //2030
#if LAST_LUNAT_YEAR > 2030
    0X30, 0Xb0, 0X06, 0X00, 0X50,   //2040
#if LAST_LUNAT_YEAR > 2040
    0X02, 0X07, 0X00, 0X50, 0X03    //2050
#endif
#endif
#endif
};

#if SUPPORT_LUNAR_HOLIDAY
__eeprom const UCHAR gLunarHoliday[12*(LAST_LUNAT_YEAR-1999)] = {
    0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2000
    0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2001
    0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //2002
    0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //2003
    0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2004
    0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2005
    0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2006
    0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //2007
    0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2008
    0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2009
    0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2010
    0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87,   //2011
    0X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2012
    0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2013
    0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2014
    0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2015
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2016
    0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2017
    0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2018
    0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2019
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86,   //2020
#if LAST_LUNAT_YEAR > 2020
    0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2021
    0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2022
    0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2023
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2024
    0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2025
    0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2026
    0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //2027
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2028
    0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2029
    0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2030
#if LAST_LUNAT_YEAR > 2030
    0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //2031
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2032
    0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86,   //2033
    0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X78, 0X88, 0X78, 0X87, 0X87,   //2034
    0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2035
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2036
    0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2037
    0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2038
    0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2039
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2040
#if LAST_LUNAT_YEAR > 2040
    0XA5, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2041
    0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2042
    0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2043
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X87, 0X96,   //2044
    0XA5, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2045
    0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2046
    0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2047
    0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96,   //2048
    0XA4, 0XC3, 0XA5, 0XA5, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86,   //2049
    0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X78, 0X78, 0X87, 0X87    //2050
#endif
#endif
#endif
};

//const UCHAR gLunarHolidayname[][5] = {
//    "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至",
//    "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"
//};
#endif
#endif

UCHAR CEEprom::m_data[ALARM_MAX * sizeof(ALARMBUFF)+1];
UCHAR CEEprom::m_index = 0;

#define    EERIE    3
#define    EEMWE    2
#define    EEWE     1
#define    EERE     0

UCHAR CEEprom::Read(USHORT addr)
{
    // 等待上一次写操作结束
    while(EECR & (1<<EEWE));
    // 设置地址寄存器
    EEAR = addr;
    // 设置EERE 以启动读操作
    EECR |= (1<<EERE);
    // 自数据寄存器返回数据
    return EEDR;
}

void CEEprom::Read(USHORT &data, USHORT addr)
{
    // 等待上一次写操作结束
    while(EECR & (1<<EEWE));
    // 设置地址寄存器
    EEAR = addr;
    // 设置EERE 以启动读操作
    EECR |= (1<<EERE);

    *(UCHAR*)(&data) = EEDR;
    // 设置地址寄存器
    EEAR++;
    // 设置EERE 以启动读操作
    EECR |= (1<<EERE);
    // 自数据寄存器返回数据
    *((UCHAR*)(&data)+1) = EEDR;
}

void CEEprom::Read(UCHAR* data, USHORT addr, UCHAR bytes)
{
    UCHAR i;
    // 等待上一次写操作结束
    while(EECR & (1<<EEWE));
    // 设置地址寄存器
    EEAR = addr;
    for(i = 0; i < bytes; i++){
        // 设置EERE 以启动读操作
        EECR |= (1<<EERE);
        // 自数据寄存器返回数据
        *data++ = EEDR;
        EEAR++;
    }
}

UCHAR CEEprom::Write(UCHAR data, USHORT addr)
{
    // 等待上一次写操作结束
    while(EECR & (1<<EEWE));
    // 设置地址和数据寄存器
    EEAR = addr;
    // 设置EERE 以启动读操作
    EECR |= (1<<EERE);
    if(EEDR != data){
        EEDR = data;
        // 置位EEMWE
        EECR |= (1<<EEMWE);
        // 置位EEWE 以启动写操作
        EECR |= (1<<EEWE);
        return 1;
    }
    return 0;
}

UCHAR CEEprom::Write(UCHAR data)
{
    EEAR++;
    // 设置EERE 以启动读操作
    EECR |= (1<<EERE);
    if(EEDR != data){
        EEDR = data;
        // 置位EEMWE
        EECR |= (1<<EEMWE);
        // 置位EEWE 以启动写操作
        EECR |= (1<<EEWE);
        return 1;
    }
    return 0;
}

void CEEprom::Write(UCHAR *data, USHORT addr, UCHAR bytes)
{
    UCHAR i;
    // 等待上一次写操作结束
    while(EECR & (1<<EEWE));
    // 设置地址寄存器
    EEAR = addr;
    for(i = 0; i < bytes; i++){
        // 设置EERE 以启动读操作
        EECR |= (1<<EERE);
        // 自数据寄存器返回数据
        if(*data != EEDR){
            EEDR = *data;
            // 置位EEMWE
            EECR |= (1<<EEMWE);
            // 置位EEWE 以启动写操作
            EECR |= (1<<EEWE);

        }
        data++;
        EEAR++;
    }
}

void CEEprom::LoadConfig(ALARMBUFF *alarm, UCHAR &hourring)
{
    USHORT address;
    getConfigAddress(address);

    hourring = Read(address++);
    Read((UCHAR*)alarm, address, sizeof(ALARM_MAX*sizeof(ALARMBUFF)));
}

void CEEprom::SaveConfig(const ALARMBUFF *alarm, UCHAR hourring)
{
    USHORT address;
    getConfigAddress(address);

    m_data[0] = hourring;
    memcpy(m_data+1, alarm, sizeof(ALARM_MAX*sizeof(ALARMBUFF)));
    if(!(EECR & (1<<EEWE))){//EEPROM不忙
        EECR |= 1 << EERIE;
        for(m_index = 0; m_index < sizeof(m_data);){
            if(Write(m_data[m_index++], address)) return;
        }
    }
}

void CEEprom::EEpromReady()
{
    for(; m_index < sizeof(m_data);){
        if(Write(m_data[m_index++])) return;
    }
    EECR &= ~(1 << EERIE);
}

void CEEprom::getConfigAddress(USHORT &address)
{
    UCHAR pos = CEEprom::Read(1);
    if(pos == 0x5a) address = ALARMBUFF1_ADDR;
    else address = ALARMBUFF2_ADDR;
}

⌨️ 快捷键说明

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