?? 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 + -