📄 ds12c887.c
字号:
#include <ABSACC.h>
#include <c8051f020.h>
//#define uchar unsigned char
#define AD P2
//#define A_ds 0x0A
//#define B_ds 0x0B
#define CENTURY 0x32
#define YEAR 0x09
#define MONTH 0x08
#define DAY 0x07
#define WEEK 0x06
#define HOUR 0x04
#define MINUTE 0x02
#define SECOND 0x00
#define IRQ P1_7
#define RESET P1_6
#define DS P1_5
#define R_W P1_4
#define AS P1_3
#define CS P1_2
unsigned char h;
unsigned char SE;
unsigned char MI;
unsigned char HO;
unsigned char DA;
unsigned char MO;
unsigned char YE;
//READ_CMD_TIME(unsigned char y); /*y是想要读的地址,h为读出的数据*/
//void WRITE_CMD_TIME(unsigned char x,unsigned char z); /*x为地址,Z为写入的命令*/
//void GET_TIME887(void)
//void delay (unsigned int i);
/********************************************************************/
void delay (unsigned int i)
{
unsigned int j,k;
for(k=1;k<i;k++)
{
for(j=1;j<i;j++);
}
}
/*******************************************************************/
/*向不同的地址读不同的时间数据*/
/********************************************************************/
READ_CMD_TIME (unsigned char y) /*y是想要读的地址,h为读出的数据*/
{
DS=1;
AS=1;
delay(10);
CS =0;
// delay(100);
AD=y;
delay(10);
AS=0;
delay(10);
AD=0xff; //绝对需要注意的地方51单片机复用时,读完数据后须将IO口复1才能写
DS=0;
delay(50);
//delay(100);
h=AD;
delay(10);
DS=1;
// h=AD;
AS=1;
// CS=1;
return h;
}
/********************************************************************/
/***************设置12887时钟寄存器***********************************/
/*********************************************************************/
void WRITE_CMD_TIME(unsigned char x,unsigned char z) /*x为地址,Z为写入的命令*/
{
DS=1;
AS=1;
R_W=1;
delay(10);
CS=0;
delay(10); /*开始状态*/
AD=x;
delay(10);
AS=0;
delay(10);
R_W=0;
delay(50);
AD=z;
delay(10);
R_W=1;
AS=1;
DS=1;
}
/*********************************************************************/
void GET_TIME887(void)
{
SE =READ_CMD_TIME(SECOND);
MI =READ_CMD_TIME(MINUTE);
HO =READ_CMD_TIME(HOUR);
DA =READ_CMD_TIME(DAY);
MO =READ_CMD_TIME(MONTH);
YE =READ_CMD_TIME(YEAR);
}
/********************************************************************/
/****************将不同的时间复给变量,在系统程序中调用变量值就可以**/
/********************************************************************/
void main(void)
{
// P1MDIN=0xff;
//delay(99);
WDTCN = 0x07; // Watchdog Timer Control Register
WDTCN = 0xDE; // Disable WDT
WDTCN = 0xAD; // Disable WDT
RESET=0;
delay(100);
RESET=1;
//P74OUT = 0xFF;
XBR2=0x4f;
//XBR1=0xFF;
//XBR0=0xFF;
WRITE_CMD_TIME(0x0B,0x82); //芯片更新禁止
WRITE_CMD_TIME(0x0A,0xA0);
WRITE_CMD_TIME(0x0A,0x20);
WRITE_CMD_TIME(0x0B,0x02); //芯片更新恢复
//h=READ_CMD_TIME(0x0A);
//此处有错误
while(1)
{
READ_CMD_TIME(0x0A);
if((h&0x80)!=1)
{
SE =READ_CMD_TIME(SECOND);
MI =READ_CMD_TIME(MINUTE);
HO =READ_CMD_TIME(HOUR);
DA =READ_CMD_TIME(DAY);
MO =READ_CMD_TIME(MONTH);
YE =READ_CMD_TIME(YEAR);
delay(100);
}
}
}
//需要注意的是在读完地址后将相应的IO口置1才能写进数据//此函数最后输出的是
// SE MI HO DA MO YE几个变量值负给显示
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -