📄 ds1302.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 + -