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