/*
********************************************************************************************
* REVISION HISTORY
********************************************************************************************
*/
/*
********************************************************************************************
* INCLUDE FILES
********************************************************************************************
*/
#define DS12C887_GLOBALS
#include <MyCpu.h>
#include <MyAvrmega128.h>
/*
********************************************************************************************
* CONSTANTS
********************************************************************************************
*/
//世纪存放地址
#define D887_CENT_ADR 50
//寄存器D地址
#define D887_REGD_ADR 13
//寄存器C地址
#define D887_REGC_ADR 12
//寄存器B地址
#define D887_REGB_ADR 11
//寄存器A地址
#define D887_REGA_ADR 10
//年存放地址
#define D887_YEAR_ADR 9
//月存放地址
#define D887_MONTH_ADR 8
//天存放地址
#define D887_DAY_ADR 7
//星期存放地址
#define D887_WEEK_ADR 6
//小时报警地址
#define D887_HOURARM_ADR 5
//小时存放地址
#define D887_HOUR_ADR 4
//分钟报警地址
#define D887_MINARM_ADR 3
//分钟存放地址
#define D887_MIN_ADR 2
//秒报警地址
#define D887_SECARM_ADR 1
//秒存放地址
#define D887_SEC_ADR 0
//定义RAM最大可用字节数
#define D887_MAX_SIZE 128
//定义测试用字节地址
#define DS12C887_TEST_ADR 127
/*
********************************************************************************************
* VARIABLES
********************************************************************************************
*/
//INT8U D887_ADR[D887_MAX_SIZE] @DS12C887_ADR;
static INT16U D887_AdrStar;
/*
********************************************************************************************
* Ds12c887_SerStarAdr
*
*Description :设置12c887的起始地址
*Arguments :'staradr'ds12c887的首地址
*Returns :None
*Notes :None
********************************************************************************************
*/
void Ds12c887_SetStarAdr(INT16U staradr)
{
INT8U *padr;
D887_AdrStar = staradr;
ENTER_CRITICAL();
padr = D887_AdrStar;
*(padr + D887_REGA_ADR) = 0x2f;
EXIT_CRITICAL();
}
/*
********************************************************************************************
* Ds12c887_Read
*
*Description :从ds12c887的寄存器或sram中读一个字节数据
*Arguments :fadr - 需要读取的寄存器或sram地址
* *data - 存放读取的数据
* 'staradr'ds12c887的首地址
*Returns :None
*Notes :None
********************************************************************************************
*/
INT8U Ds12c887_Read(INT8U fadr, INT8U *data)
{
INT8U delaynum;
INT8U *padr;
if (fadr >= D887_MAX_SIZE)
{
return 0;
}
ENTER_CRITICAL();
padr = D887_AdrStar;
*data = *(padr + fadr);
EXIT_CRITICAL();
//PORTD.7 = 1;
return 1;
}
/*
********************************************************************************************
* Ds12c887_ReadBlock
*
*Description :从ds12c887的寄存器或sram中读一批字节数据
*Arguments :'adrst'需要读取的首地址
* 'num' 需要读的字节数目
* '*data'存放读取的数据
*Returns :None
*Notes :None
********************************************************************************************
*/
INT8U Ds12c887_ReadBlock(INT8U adrst, INT8U num, INT8U *data)
{
INT8U i;
for (i = 0; i < num; i++)
{
Ds12c887_Read((adrst + i), (data + i));
}
return 1;
}
/*
********************************************************************************************
* Ds12c887_Write
*
*Description :向ds12c887的寄存器或sram中写入一个字节数据,数据值来自fvalue
*Arguments :fadr - 需要写值的地址
* fvalue - 需要写的值
*Returns :None
*Notes :None
********************************************************************************************
*/
INT8U Ds12c887_Write(INT8U fadr, INT8U fvalue)
{
INT8U delaynum;
INT8U *padr;
if (fadr >= D887_MAX_SIZE)
{
return 0;
}
ENTER_CRITICAL();
padr = D887_AdrStar;
*(padr + fadr) = fvalue;
EXIT_CRITICAL();
return 1;
}
/*
********************************************************************************************
* Ds12c887_WriteBlock
*
*Description :向ds12c887的寄存器或sram中写入一批字节数据,数据值来自data
*Arguments :'adrst' 需要写值的首地址
* 'num' 需要写的字节数
* '*data' 需要写的内容
*Returns :None
*Notes :None
********************************************************************************************
*/
INT8U Ds12c887_WriteBlock(INT8U adrst, INT8U num, INT8U *data)
{
INT8U i;
for (i = 0; i < num; i++)
{
Ds12c887_Write((adrst + i), *(data + i));
}
return 1;
}
/*
********************************************************************************************
* Ds12c887_SetCent
*
*Description :设置世纪
*Arguments :'data'需要设置的世纪值,19,20
*Returns :None
*Notes :注意二进制模式下没用用
********************************************************************************************
*/
INT8U Ds12c887_SetCent(INT8U data)
{
INT8U *padr;
if ((data < 19) || (data > 20))
{
return 0;
}
ENTER_CRITICAL();
padr = D887_AdrStar;
*(padr + D887_REGB_ADR) = 0x86;
*(padr + D887_REGA_ADR) = 0x2f;
*(padr + D887_CENT_ADR) = data;
*(padr + D887_REGB_ADR) = 0x06;
EXIT_CRITICAL();
return 1;
}
/*
********************************************************************************************
* Ds12c887_SetYear
*
*Description :设置年
*Arguments :'data'需要设置的年,0-99
*Returns :None
*Notes :None
********************************************************************************************
*/
INT8U Ds12c887_SetYear(INT8U data)
{
INT8U *padr;
if (data > 99)
{
return 0;
}
ENTER_CRITICAL();
padr = D887_AdrStar;
*(padr + D887_REGB_ADR) = 0x86;
*(padr + D887_REGA_ADR) = 0x2f;
*(padr + D887_YEAR_ADR) = data;
*(padr + D887_REGB_ADR) = 0x06;
EXIT_CRITICAL();
return 1;
}
/*
********************************************************************************************
* Ds12c887_SetMonth
*
*Description :设置月
*Arguments :'data'需要设置的月,1-12
*Returns :None
*Notes :None
********************************************************************************************
*/
INT8U Ds12c887_SetMonth(INT8U data)
{
INT8U *padr;
if (data == 0)
{
return 0;
}
if (data > 12)
{
return 0;
}
ENTER_CRITICAL();
padr = D887_AdrStar;
*(padr + D887_REGB_ADR) = 0x86;
*(