📄 12887.c
字号:
/*
管脚配置:
MOT: 接地
CS: 接P27 地址:0x7f00
AS: 接单片机 ALE
R/W: 接 RW
DS: 接 RD
RESET: 接高
IRQ: 空
SQW: 空
*/
#include <reg51.h>
#define DS12887 0x7f00 //定义时钟芯片的片选基址
#define DS12887_sec DS12887+0x00 // 秒
#define DS12887_min DS12887+0x02 // 分
#define DS12887_hour DS12887+0x04 // 时
#define DS12887_day DS12887+0x06 // 星期
#define DS12887_date DS12887+0x07 // 日期
#define DS12887_month DS12887+0x08 //月份
#define DS12887_year DS12887+0x09 //年
#define DS12887_Reg_A DS12887+0x0a //寄存器A
#define DS12887_Reg_B DS12887+0x0b //寄存器B
#define DS12887_Reg_C DS12887+0x0c //寄存器C
#define DS12887_Reg_D DS12887+0x0d //寄存器D
sbit P27=P2^7;
unsigned char xdata *REG_ADD;
unsigned char Date_Time[7]={8,6,3,2,19,31,21};//年月日周时分秒 定义时间数组并设定初始值
void Delay1ms(unsigned int ms);//延时1毫秒(不够精确的)
void Init_Dis();
void Lcd_Dis_String(unsigned char addr,unsigned char *p);
void Lcd_Dis_Char(unsigned char addr,unsigned char c);
void Write_Ds12887()
{
P27=0;
REG_ADD=DS12887_Reg_B;
*REG_ADD=0x80;
REG_ADD=DS12887_year; *REG_ADD=Date_Time[0]; //年
REG_ADD=DS12887_month; *REG_ADD=Date_Time[1]; //月
REG_ADD=DS12887_date; *REG_ADD=Date_Time[2]; //日期
REG_ADD=DS12887_day; *REG_ADD=Date_Time[3]; //星期
REG_ADD=DS12887_hour; *REG_ADD=Date_Time[4]; //时
REG_ADD=DS12887_min; *REG_ADD=Date_Time[5]; //分
REG_ADD=DS12887_sec; *REG_ADD=Date_Time[6]; //秒
REG_ADD=DS12887_Reg_A; *REG_ADD=0x20;
REG_ADD=DS12887_Reg_B; *REG_ADD=0x06;
}
void Read_Ds12887()
{
unsigned char temp;
REG_ADD=DS12887_Reg_A;
do
{
temp=*REG_ADD;
}while((temp&0x80)==0x80);
REG_ADD=DS12887_year; Date_Time[0]=*REG_ADD; //年
REG_ADD=DS12887_month; Date_Time[1]=*REG_ADD; //月
REG_ADD=DS12887_date; Date_Time[2]=*REG_ADD; //日期
REG_ADD=DS12887_day; Date_Time[3]=*REG_ADD; //星期
REG_ADD=DS12887_hour; Date_Time[4]=*REG_ADD; //时
REG_ADD=DS12887_min; Date_Time[5]=*REG_ADD; //分
REG_ADD=DS12887_sec; Date_Time[6]=*REG_ADD; //秒
}
/********************************************************************/
void Display_Calendar(void)
{
//Lcd_Dis_String(0x80," ");
Lcd_Dis_String(0x80,"20 - - ");
Lcd_Dis_Char(0x82,(Date_Time[0]/10)|0X30);
Lcd_Dis_Char(0x83,(Date_Time[0]%10)|0X30);//显示年,转换成了ASC码
Lcd_Dis_Char(0x85,(Date_Time[1]/10)|0X30);
Lcd_Dis_Char(0x86,(Date_Time[1]%10)|0X30);//显示月
Lcd_Dis_Char(0x88,(Date_Time[2]/10)|0X30);
Lcd_Dis_Char(0x89,(Date_Time[2]%10)|0X30);//显示天
if(Date_Time[3]==1)
Lcd_Dis_String(0x8d,"Mon");
if(Date_Time[3]==2)
Lcd_Dis_String(0x8d,"Tue");
if(Date_Time[3]==3)
Lcd_Dis_String(0x8d,"Wen");
if(Date_Time[3]==4)
Lcd_Dis_String(0x8d,"Thu");
if(Date_Time[3]==5)
Lcd_Dis_String(0x8d,"Fri");
if(Date_Time[3]==6)
Lcd_Dis_String(0x8d,"Sat");
if(Date_Time[3]==7)
Lcd_Dis_String(0x8d,"Sun");//显示星期,以上信息均第一行显示
Lcd_Dis_String(0xc0," : :");
Lcd_Dis_Char(0xc8,(Date_Time[4]/10)|0X30);
Lcd_Dis_Char(0xc9,(Date_Time[4]%10)|0X30);//时
Lcd_Dis_Char(0xcb,(Date_Time[5]/10)|0X30);
Lcd_Dis_Char(0xcc,(Date_Time[5]%10)|0X30);//分
Lcd_Dis_Char(0xce,(Date_Time[6]/10)|0X30);
Lcd_Dis_Char(0xcf,(Date_Time[6]%10)|0X30);//秒
}
/*
void extern1_IRS(void) interrupt 2//只要把值存入外部变量就可以调用了
{
if(Right==0)//地址右移(位选择)
{
wr_com(++addr);
wr_com(0x0f);//光标闪烁
delay1ms(500);
if(addr==0x90) addr=0xbf;
if(addr==0xd0) addr=0x7f;
}
if(add==0)//数值改变
{
wr_com(0x0e);//显示光标但不闪烁
wr_com(addr);
wr_dat(num++);
wr_com(addr);//带有光标的位的数值改变
if(num==0x3a)
num=0x30;
delay1ms(500);
}*/
void main()
{
Init_Dis();
Delay1ms(1000);
Write_Ds12887();
while(1)
{
Read_Ds12887();
Display_Calendar();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -