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

📄 ds1302.c

📁 AVR Devolpment Board
💻 C
字号:
#include "avr/io.h"
#include "spi.h"
#include "ds1302.h"

#define UCHAR  unsigned char

#define DA_CS_SET()    PORTA|= (1<<PA2)
#define DA_CS_RESET()  PORTA&=~(1<<PA2)
#define RTC_CE_SET()   PORTC|= (1<<PC7)
#define RTC_CE_RESET() PORTC&=~(1<<PC7)

#define RTC_DISABLE()  RTC_CE_RESET()
#define RTC_ENABLE()   RTC_CE_SET()


void DS1302_Config(void)//IO初始化
{
	DDRA |= (1<<PA2);
	DDRC |= (1<<PC7);
	DA_CS_SET();
	SPI_Init();
}


void Write1302(unsigned char dat)
{
	SPI_Write(dat);
}

unsigned char Read1302(void)
{
	unsigned dat=0;
	dat=SPI_Read();
	return dat;                 //将读出的数据返回
}

unsigned char  ReadSet1302(unsigned char Cmd)
{
	unsigned char dat;
	
	RTC_ENABLE();         //CE=1 启动数据传输
	Write1302(Cmd);       //写入命令字
	dat = Read1302();     //读出数据
	RTC_DISABLE();        //CE=0 禁止数据传递
	return dat;           //将读出的数据返回
}

void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
	RTC_ENABLE();
	Write1302(Cmd); //写入命令字
	Write1302(dat); //写数据
	RTC_DISABLE();
}

void DS1302TimeInit(void)
{
	/*==================秒   分   时   日   月   周   年=======================================*/
	UCHAR inittime[7]={0x30,0x30,0x12,0x15,0x06,0x02,0x10};	//初始化设置为:10年06月15日星期2,12点30分30
	UCHAR i=7;
	WriteSet1302(0x8E,0x00);
	while(i--)
		WriteSet1302(0x80+i*2,inittime[i]);
	WriteSet1302(0x8E,0x80);
}


unsigned char DS1302TimeRead(unsigned char TimeReg)
{
	unsigned char Time,ReadValue;
	ReadValue = ReadSet1302(TimeReg+1);   //从寄存器读数据
    Time =((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化
	return Time;
}


//根据选择调整相应项目并写入DS1302
//****DS1302写入相应数据****
void DS1302TimeSet(UCHAR TimeReg,UCHAR sel) 
{
	UCHAR item,ReadValue;
	UCHAR max=0,min=0;
	switch(TimeReg)
	{
		case DS_YEAR   : max=99;min=0; break;    //年
		case DS_MONTH  : max=12;min=1; break;    //月
		case DS_DAY    : max=31;min=1; break;    //日
		case DS_WEEK   : max= 7;min=1; break;    //星期
		case DS_HOUR   : max=23;min=0; break;    //小时
		case DS_MINUTE : max=59;min=0; break;    //分钟
		case DS_SECOND : max=59;min=0; break;    //秒
		case DS_LIGHT  : max=59;min=0; break;    //背光时间,最长1分钟
		case DS_CLOCK_K: max= 1;min=0; break;    //闹铃开关寄存器
		case DS_CLOCK_H: max=23;min=0; break;    //闹铃时寄存器
		case DS_CLOCK_M: max=59;min=0; break;    //闹铃分寄存器
		default: break;
	}

	ReadValue = ReadSet1302(TimeReg+1);
	item      = ReadValue/16*10+ReadValue%16;
	if(sel==0)
	{ 
		item++;
		if(item>max) 
			item=min;
	}  
	else
	{
	 	if(item<=min)
			item=max+1;
		item--; 
	}  	
           
	WriteSet1302(0x8e,0x00);                   //允许写操作
	WriteSet1302(TimeReg,item/10*16+item%10);  //写入DS1302 //转成BCD码
	WriteSet1302(0x8e,0x80);                   //写保护,禁止写操作  
}

⌨️ 快捷键说明

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