📄 ds12c887.c
字号:
#include <AT89X52.H>
#include "DS12C887.h"
#include <intrins.h>
#define NOP() _nop_();_nop_();
//===================================================
unsigned char t_hour,t_minute,t_second;
unsigned char At_hour,At_minute,At_second;
unsigned char week;
unsigned char d_year,d_month,d_day;
//===================================================
#if DS12C887_EN_ALE>0
void ALE(void)
{
DS12C887_AS=0;
NOP();
DS12C887_AS=1;
NOP();
DS12C887_AS=0;
NOP();
DS12C887_AS=1;
NOP();
DS12C887_AS=0;
NOP();
}
#endif
//-----------------------------
#if DS12C887_EN_WriteEn>0
void WriteEn(void)
{
DS12C887_RW=1;
NOP();
DS12C887_RW=0;
NOP();
DS12C887_RW=1;
}
#endif
//-----------------------------
#if DS12C887_EN_ReadEn>0
void ReadEn(void)
{
DS12C887_DS=1;
NOP();
DS12C887_DS=0;
NOP();
}
#endif
//----------------------------
#if DS12C887_EN_init >0
void DS12C887_init(void)
{
//将状态寄存器B的最高位SET设置为1
//锁存状态寄存器B地址
DS12C887_Data_Port=0xb;
ALE(); //锁存地址
//设置状态寄存器B的SET=1,开始设置其他的参数
//状态寄存器B
//bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
//SET PIE AIE UIE SQW DM 24/12 DSF
//设置允许 周期中断允许 闹钟中断 时间更新中断 允许方波生成 数据格式 时间格式 夏令时
//同时设置UIE=0(允许更新中断),DM=1(二进制数据格式),24/12=1(24小时格式)
DS12C887_Data_Port=0x96;
WriteEn(); //写入允许
//设置时标寄存器
DS12C887_Data_Port=0; //锁存秒地址
ALE(); //锁存地址
DS12C887_Data_Port=t_second;//写入秒值
WriteEn();
DS12C887_Data_Port=1; //锁存秒闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=At_second;//写入秒闹钟值
WriteEn();
DS12C887_Data_Port=2; //锁存分钟地址
ALE(); //锁存地址
DS12C887_Data_Port=t_minute;//写入分钟值
WriteEn();
DS12C887_Data_Port=3; //锁存分钟闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=At_minute;//写入分钟闹钟值
WriteEn();
DS12C887_Data_Port=4; //锁存小时地址
ALE(); //锁存地址
DS12C887_Data_Port=t_hour;//写入小时值
WriteEn();
DS12C887_Data_Port=5; //锁存小时闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=At_hour;//写入小时闹钟值
WriteEn();
//----------------------------
DS12C887_Data_Port=6; //锁存星期地址
ALE(); //锁存地址
DS12C887_Data_Port=week;//写入星期值
WriteEn();
DS12C887_Data_Port=7; //锁存日地址
ALE(); //锁存地址
DS12C887_Data_Port=d_day;//写入日值
WriteEn();
DS12C887_Data_Port=8; //锁存月地址
ALE(); //锁存地址
DS12C887_Data_Port=d_month;//写入月值
WriteEn();
DS12C887_Data_Port=9; //锁存年地址
ALE(); //锁存地址
DS12C887_Data_Port=d_year;//写入年值
WriteEn();
//设置寄存器A
//状态寄存器A
//bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
//UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
//readonly 0 1 0 0 0 0 0
DS12C887_Data_Port=0xa; //锁存寄存器A地址
ALE(); //锁存地址
DS12C887_Data_Port=0x20;//写寄存器A值
WriteEn();
//读取寄存器C,清除中断申请标志位
//状态寄存器C
//bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
//IRQF PF AF UF 0 0 0 0
//All Read Only
DS12C887_Data_Port=0xc; //锁存寄存器C地址
ALE(); //锁存地址
ReadEn();
DS12C887_DS=1;
//读取寄存器D,设置VRT位
DS12C887_Data_Port=0xd; //锁存寄存器D地址
ALE(); //锁存地址
ReadEn();
DS12C887_DS=1;
//设置寄存器B,使得SET=0
DS12C887_Data_Port=0xb; //锁存寄存器B地址
ALE(); //锁存地址
DS12C887_Data_Port=0x16;
WriteEn(); //写入允许
}
#endif
//=============================================
#if DS12C887_EN_GetTime>0
void GetTime(void)
{
DS12C887_Data_Port=0x0; //锁存秒地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
t_second=DS12C887_Data_Port;//读取秒值
DS12C887_DS=1;
DS12C887_Data_Port=0x2; //锁存分钟地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
t_minute=DS12C887_Data_Port;//读取分钟值
DS12C887_DS=1;
DS12C887_Data_Port=0x4; //锁存小时地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
t_hour=DS12C887_Data_Port;//读取小时值
DS12C887_DS=1;
}
#endif
//---------------------------------------
#if DS12C887_EN_GetAlarmTime>0
void GetAlarmTime(void)
{
DS12C887_Data_Port=0x1; //锁存秒闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
At_second=DS12C887_Data_Port;//读取秒闹钟值
DS12C887_DS=1;
DS12C887_Data_Port=0x3; //锁存分钟闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
At_minute=DS12C887_Data_Port;//读取分钟闹钟值
DS12C887_DS=1;
DS12C887_Data_Port=0x5; //锁存小时闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
At_hour=DS12C887_Data_Port;//读取小时闹钟值
DS12C887_DS=1;
}
#endif
//---------------------------------------------
#if DS12C887_EN_GetDate>0
void GetDate(void)
{
DS12C887_Data_Port=0x9; //锁存年地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
d_year=DS12C887_Data_Port;//读取年值
DS12C887_DS=1;
DS12C887_Data_Port=0x8; //锁存月地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
d_month=DS12C887_Data_Port;//读取月值
DS12C887_DS=1;
DS12C887_Data_Port=0x7; //锁存日地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
d_day=DS12C887_Data_Port;//读取日值
DS12C887_DS=1;
}
#endif
//---------------------------------------------
#if DS12C887_EN_GetWeek>0
void GetWeek(void)
{
DS12C887_Data_Port=0x6; //锁存星期地址
ALE(); //锁存地址
DS12C887_Data_Port=0xff;
ReadEn();
week=DS12C887_Data_Port;//读取星期值
DS12C887_DS=1;
}
#endif
//================================================
#if DS12C887_EN_SetTime>0
void SetTime(void)
{
DS12C887_Data_Port=0x0; //锁存秒地址
ALE(); //锁存地址
DS12C887_Data_Port=t_second;//写入秒值
WriteEn();
DS12C887_Data_Port=0x2; //锁存分钟地址
ALE(); //锁存地址
DS12C887_Data_Port=t_minute;//写入分钟值
WriteEn();
DS12C887_Data_Port=0x4; //锁存小时地址
ALE(); //锁存地址
DS12C887_Data_Port=t_hour;//写入小时值
WriteEn();
}
#endif
//---------------------------------------
#if DS12C887_EN_SetAlarmTime>0
void SetAlarmTime(void)
{
DS12C887_Data_Port=0x1; //锁存秒闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=At_second;//写入秒闹钟值
WriteEn();
DS12C887_Data_Port=0x3; //锁存分钟闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=At_minute;//写入分钟闹钟值
WriteEn();
DS12C887_Data_Port=0x5; //锁存小时闹钟地址
ALE(); //锁存地址
DS12C887_Data_Port=At_hour;//写入小时闹钟值
WriteEn();
}
#endif
//---------------------------------------------
#if DS12C887_EN_SetDate>0
void SetDate(void)
{
DS12C887_Data_Port=0x9; //锁存年地址
ALE(); //锁存地址
DS12C887_Data_Port=d_year;//写入年值
WriteEn();
DS12C887_Data_Port=0x8; //锁存月地址
ALE(); //锁存地址
DS12C887_Data_Port=d_month;//写入月值
WriteEn();
DS12C887_Data_Port=0x7; //锁存日地址
ALE(); //锁存地址
DS12C887_Data_Port=d_day;//写入日值
WriteEn();
}
#endif
//---------------------------------------------
#if DS12C887_EN_SetWeek>0
void SetWeek(void)
{
DS12C887_Data_Port=0x6; //锁存星期地址
ALE(); //锁存地址
DS12C887_Data_Port=week;//写入星期值
WriteEn();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -