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

📄 ds1302.c

📁 Maxim实时时钟芯片DS1302驱动程序
💻 C
字号:
#include"ds1302.h"
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[8];
unsigned char TimeString[8];

/*
unsigned char xdata Second;
unsigned char xdata Minute;
unsigned char xdata Hour;
unsigned char xdata Week;
unsigned char xdata Day;
unsigned char xdata Month;
unsigned char xdata Year;
unsigned char xdata DateString[8];
unsigned char xdata TimeString[8];
*/

unsigned char code date[]=
{
0x00,0x00,0x00,0x10,0xE8,0x24,0x27,0x24,0xFC,0x12,0x12,0x10,0x00,0x00,0x00,0x00,
0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//"年"0

0x00,0x00,0x00,0x00,0x00,0xFC,0x24,0x92,0x92,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x10,0x20,0x1F,0x00,0x00,0x00,0x00,0x00,//"月"1

0x00,0x00,0x00,0x00,0xF8,0x88,0x88,0x44,0x44,0x04,0xFC,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0F,0x08,0x04,0x04,0x04,0x08,0x0F,0x00,0x00,0x00,0x00,0x00,//"日"2

0x00,0x00,0x00,0x00,0x8E,0x32,0x2A,0xEA,0xAA,0x91,0x91,0x0F,0x00,0x00,0x00,0x00,
0x00,0x24,0x22,0x21,0x21,0x25,0x25,0x3F,0x12,0x12,0x10,0x10,0x10,0x10,0x00,0x00,//"星"3

0x00,0x00,0x08,0x08,0xFE,0xA8,0x04,0xFF,0x04,0x00,0xF8,0x24,0x04,0xFC,0x00,0x00,
0x02,0x22,0x12,0x0A,0x07,0x02,0x06,0x49,0x21,0x18,0x07,0x01,0x10,0x3F,0x00,0x00//"期"4
};

unsigned char code bt[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,//"-"0

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,//"-"1

0x00,0x00,0x80,0x80,0x80,0xF0,0xF0,0x00,0xF0,0xF0,0x00,0x80,0xC0,0x40,0x00,0x00,
0x00,0x18,0x18,0x08,0x08,0x1F,0x1F,0x00,0x0F,0x1F,0x19,0x18,0x18,0x18,0x18,0x08,//"北"2

0x00,0x40,0x60,0x20,0xA0,0xA0,0xA0,0xB0,0xB0,0xA0,0xA0,0xA0,0x60,0x60,0x60,0x00,
0x00,0x10,0x10,0x18,0x0B,0x1F,0x22,0x3E,0x1E,0x02,0x0F,0x09,0x10,0x10,0x00,0x00,//"京"3

0x00,0xE0,0xE0,0x20,0xE0,0xE0,0x80,0xC0,0xC0,0xC0,0xD0,0xF0,0xC0,0xC0,0xC0,0x40,
0x00,0x0F,0x0F,0x09,0x0F,0x0F,0x00,0x13,0x12,0x30,0x30,0x1F,0x00,0x00,0x00,0x00,//"时"4

0x00,0x00,0x00,0xC0,0x10,0xB0,0x80,0xA0,0xA0,0xA0,0xA0,0x20,0xE0,0xE0,0x00,0x00,
0x10,0x10,0x1C,0x0F,0x00,0x0F,0x0A,0x0A,0x0A,0x0B,0x0F,0x00,0x3F,0x3F,0x00,0x00,//"间"5

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,//"-"6

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00//"-"7

};

unsigned char code shuzi[]=
{
0x00,0x30,0x08,0x28,0x5A,0x8A,0x5F,0x45,0x95,0x55,0x04,0x04,0x0C,0x00,0x00,0x00,
0x08,0x08,0x04,0x02,0x09,0x08,0x25,0x56,0x0C,0x05,0x02,0x02,0x04,0x04,0x04,0x00,//"零"0

0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"一"1

0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x18,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,
0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x04,0x00,//"二"2

0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x88,0x88,0x88,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,//"三"3

0x00,0x70,0x90,0x10,0x10,0xF0,0x10,0x10,0xF8,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
0x00,0x00,0x07,0x04,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x07,0x00,0x00,0x00,//"四"4

0x00,0x00,0x00,0x80,0x88,0x88,0x78,0x44,0x44,0x44,0xC4,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x18,0x0F,0x08,0x08,0x08,0x0F,0x08,0x08,0x08,0x08,0x00,0x00,//"五"5

0x00,0x40,0x40,0x40,0x40,0x40,0x44,0x48,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,
0x00,0x10,0x10,0x08,0x04,0x02,0x00,0x00,0x01,0x02,0x04,0x18,0x00,0x00,0x00,0x00,//"六"6

0x00,0x00,0x00,0x00,0xF8,0x88,0x88,0x44,0x44,0x04,0xFC,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0F,0x08,0x04,0x04,0x04,0x08,0x0F,0x00,0x00,0x00,0x00,0x00,//"日"

0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x80,0x80,0x40,0x40,0x20,0x20,0x20,0x00,0x00,
0x02,0x02,0x02,0x02,0x01,0x01,0x0F,0x10,0x10,0x10,0x10,0x10,0x1C,0x00,0x00,0x00,//"七"7

0x00,0x00,0x00,0x00,0xC0,0x04,0x08,0x30,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x0C,0x08,0x08,0x00,//"八"8

0x00,0x40,0x40,0x40,0x40,0xC0,0x3E,0x20,0x20,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x20,0x10,0x08,0x06,0x01,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,//"九"9

0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFE,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00//"十"10

};


void DS1302InputByte(unsigned char d) 	//实时时钟写入一字节(内部函数)
{ 
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;           	
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1; 
    } 
}

unsigned char DS1302OutputByte(void) 	//实时时钟读取一字节(内部函数)
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1; 
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    } 
    return(ACC); 
}

void Write1302(unsigned char ucAddr, unsigned char ucData)	//ucAddr: DS1302地址, ucData: 要写的数据
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
	DS1302InputByte(ucAddr);       	// 地址,命令 
    DS1302InputByte(ucData);       	// 写1Byte数据
	DS1302_CLK = 1;
    DS1302_RST = 0;
} 

unsigned char Read1302(unsigned char ucAddr)	//读取DS1302某地址的数据
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令 
    ucData = DS1302OutputByte();         // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

void DS1302_SetProtect(bit flag)        //是否写保护
{
	if(flag)
		Write1302(0x8E,0x10);			//0x80?
	else
		Write1302(0x8E,0x00);
}

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数
{
	DS1302_SetProtect(0);
	Write1302(Address, ((Value/10)<<4 | (Value%10))); 
}
//仅仅得到时分秒
void GetHMSOnly(void)
{
	unsigned char ReadValue;
	ReadValue = Read1302(DS1302_SECOND);
	Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_MINUTE);
	Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_HOUR);
	Hour = ((ReadValue&0x30)>>4)*10 + (ReadValue&0x0F);
	
}

void DS1302_GetTime(void)
{
	unsigned char ReadValue;
	ReadValue = Read1302(DS1302_SECOND);
	Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_MINUTE);
	Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_HOUR);
	Hour = ((ReadValue&0x30)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_DAY);
	Day = ((ReadValue&0x30)>>4)*10 + (ReadValue&0x0F);	
	ReadValue = Read1302(DS1302_WEEK);
	Week = ((ReadValue&0x00)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_MONTH);
	Month = ((ReadValue&0x10)>>4)*10 + (ReadValue&0x0F);
	ReadValue = Read1302(DS1302_YEAR);
	Year = ((ReadValue&0xF0)>>4)*10 + (ReadValue&0x0F);	
}

void DateToStr(void)
{
	DateString[0] = '2';
	DateString[1] = '0';

	DateString[2] = Year/10 + '0';	//年
	DateString[3] = Year%10 + '0';

	DateString[4] = Month/10 + '0';	//月
	DateString[5] = Month%10 + '0';

	DateString[6] =Day/10 + '0';	//日
	DateString[7] =Day%10 + '0';
}

void TimeToStr(void)
{
	TimeString[0] =Hour/10 + '0';
	TimeString[1] =Hour%10 + '0';
	TimeString[2] =':';
	TimeString[3] =Minute/10 + '0';
	TimeString[4] =Minute%10 + '0';
	TimeString[5] = ':';
	TimeString[6] =Second/10 + '0';
	TimeString[7] =Second%10 + '0';
}

void Init_DS1302(void)
{
	//打开时钟运行
	unsigned char Second=Read1302(DS1302_SECOND);
	if(Second&0x80)																																				  
		DS1302_SetTime(DS1302_SECOND,0);
	
	//两个二极管8k电阻串联充电
	Write1302(0x90,0xab);	
}
/***********************************************************
					实用时钟函数
************************************************************/

unsigned char InputDisp2nums(unsigned char x, unsigned char y)
{
	unsigned char a[2]={0,0},b;
	
	//输入第一位数
	PutStr(x,y,"__" );
	while(1)
	{
		a[0]=InfKey();
		if(a[0]>=0 && a[0]<=9){PutChar(x,y,a[0]+'0');break;}
			else if((a[0]==DEFAULT)||(a[0]==ENTER)){delay_50ms(5);return DEFAULT;};
	}
	delay_50ms(4);
	//输入第二位数
	while(1)
	{
		a[1]=InfKey();
		if(a[1]>=0 && a[1]<=9){PutChar(x,y+1,a[1]+'0');break;}
			else if(a[1]==ENTER){PutChar(x,y,'0');PutChar(x,y+1,a[0]+'0');return a[0];}
				else if(a[1]==CLR)return InputDisp2nums(x,y);
					else if(a[1]==DEFAULT){delay_50ms(5);return DEFAULT;};	
	}
	delay_50ms(4);
	
	//两位都输入后判断
	while(1)
	{
		b=InfKey();
		if(b==ENTER)return (a[0]*10+a[1]);
			else if(b==CLR)return InputDisp2nums(x,y);
				else if(b==DEFAULT){delay_50ms(5);return DEFAULT;};
   	}
}

void SetTime(void)
{
	unsigned char flag=0,a,def;
	DS1302_SetProtect(0);        //关写保护
	DS1302_GetTime();

	ClearScr();
	while(1)
	{
		PutStr(0,0,"Year:");
		if(DEFAULT!=(def=InputDisp2nums(0,5)))Year=def;
		PutChar(0,5,'0');
		DispInt(0,6,Year);

		PutStr(0,8,"Month:");
		do
		{
			if(DEFAULT!=(def=InputDisp2nums(0,14)))
			Month=def;
		}
		while(Month<1&&Month>12);
		PutChar(0,14,'0');
		DispInt(0,15,Month);

		PutStr(1,0,"Day:");
		if(DEFAULT!=(def=InputDisp2nums(1,4)))
		Day=def;
		PutChar(1,4,'0');
		DispInt(1,5,Day);

		PutStr(1,8,"Week:");
		do
		{
			if(DEFAULT!=(def=InputDisp2nums(1,13)))
			Week=def;
		}
		while(Week<1&&Week>7);
		PutChar(1,13,'0');
		DispInt(1,14,Week);
		
		PutStr(2,0,"Hour:");
		do
		{
			if(DEFAULT!=(def=InputDisp2nums(2,5)))
			Hour=def;
		}
		while(Hour>24);
		PutChar(2,5,'0');
		DispInt(2,6,Hour);

		PutStr(2,8,"Min:");
		do
		{
			if(DEFAULT!=(def=InputDisp2nums(2,12)))
			Minute=def;
		}
		while(Minute>60);
		PutChar(2,12,'0');
		DispInt(2,13,Minute);
		
		PutStr(3,0,"Sec:");
		do
		{
			if(DEFAULT!=(def=InputDisp2nums(3,4)))
			Second=def;
		}
		while(Second>60);
		PutChar(3,4,'0');
		DispInt(3,5,Second);

		PutStr(3,9,"E C B");
		
		while(1)
		{	
			a=InfKey();
			if(a==ENTER){flag=1;break;}
				else if(a==CLR){flag=0;break;}
					else if(a==BACK){flag=3;break;}
		}
		if(flag)break;
		ClearScr();
	}
	if(flag==3)
	{
		DS1302_SetProtect(1);        //开写保护
		return;
	}
	// 设置时间函数
	DS1302_SetTime(DS1302_SECOND,Second);        
	DS1302_SetTime(DS1302_MINUTE,Minute);        
	DS1302_SetTime(DS1302_HOUR,Hour);        
	DS1302_SetTime(DS1302_WEEK,Week);        
	DS1302_SetTime(DS1302_DAY,Day);        
	DS1302_SetTime(DS1302_MONTH,Month);        
	DS1302_SetTime(DS1302_YEAR,Year);

	DS1302_SetProtect(1);        //开写保护
}

void DispTime(void)
{
	unsigned char i;
	Init_DS1302();
	DS1302_SetProtect(1);        //写保护

	ClearScr ();	//清屏
	PutHazs(0,0,8,bt);	//显示"北京时间"
	PutHaz(2,2,3,date);	//星
	PutHaz(2,3,4,date);	//期
	PutHaz(3,2,0,date);	//年
	PutHaz(3,4,1,date);	//月
	PutHaz(3,6,2,date);	//日
	while(~Irq)
	{
		DS1302_GetTime();
		
		//时间
		TimeToStr();
		for(i=0;i<8;i++)
		PutChar(1,i+3,TimeString[i]);
		//年月日
		DateToStr();
		for(i=0;i<4;i++)
		PutChar(3,i,DateString[i]);		
		for(i=4;i<6;i++)
		PutChar(3,i+2,DateString[i]);
		for(i=6;i<8;i++)
		PutChar(3,i+4,DateString[i]);
		//星期
		PutHaz(2,4,Week,shuzi);
	}
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -