📄 eeprom.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 + -