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

📄 ds12c887.c

📁 12887+1602drive goode luck!!
💻 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 + -