?? ds1302.c
字號:
#define DS1302_FUNC
#include "..\include\DSP281x_Device.h"
#include "..\include\DS1302.h"
#include "..\include\lcd.h"
#include "..\include\key.h"
#define uchar Uint16
struct rtcclocktype faultregister={0x80,6,3,6,6,6,6,6};
void rtcio_init(void)
{
// GpioDataRegs.GPDCLEAR.all |=1;
// GpioDataRegs.GPDCLEAR.all |=2;
EALLOW;
GpioMuxRegs.GPDDIR.all|=0x0023;//as output
GpioMuxRegs.GPDMUX.all&=(~0x0023);//as gpio
GpioMuxRegs.GPDQUAL.all &=0xff00;//no qual
EDIS;
GpioDataRegs.GPDCLEAR.all |=1;
GpioDataRegs.GPDCLEAR.all |=2;
}//Gpio initial
void rtc_ce(uint16 horl)
{
if(horl==0)
GpioDataRegs.GPDCLEAR.all |=1;
if(horl==1)
GpioDataRegs.GPDSET.all |=1;
}//bit rst control function
void rtc_clk(uint16 horl)
{
if(horl==0)
GpioDataRegs.GPDCLEAR.all |=2;
if(horl==1)
GpioDataRegs.GPDSET.all |=2;
}//bit clk ctrl function
void rtc_do(uint16 horl)
{
EALLOW;
GpioMuxRegs.GPDDIR.all|=(1<<5);
//GpioMuxRegs.GPDQUAL.all &=0xff00;//no qual
EDIS;
if(horl==0)
{
GpioDataRegs.GPDCLEAR.all |=0x20;
}
if(horl==1)
{
GpioDataRegs.GPDSET.all |=0x20;
}
}//data bit ctrl input
uint16 rtc_di(void)
{
uint16 tmp=0;
EALLOW;
GpioMuxRegs.GPDDIR.all&=~(1<<5);
//GpioMuxRegs.GPDQUAL.all &=0xff00;//no qual
EDIS;
tmp=GpioDataRegs.GPDDAT.bit.GPIOD5;
return tmp<<7;
}//data bit ctrl output
uint16 read_time()
{
uint16 tmp;
tmp=rtc_read(0x80);
return tmp;
}
uint16 rtc_init()
{
uint16 status=0,tmp=0;
uint16 second[2]={0,0};
uint16 *lcd,*shuma;
uint16 KeyValue[2];
rtcio_init();
tmp=rtc_read(0x86);
lcd_putchar((uchar *)"輸入時間",3,2,8);
while(!second[0])
{
second[0]=key_read();
switch(second[0])
{
case NUM1: KeyValue[0]=1;lcd=(uint16 *)"1";break;
case NUM2: KeyValue[0]=2;lcd=(uchar *)"2";break;
case NUM3: KeyValue[0]=3;lcd=(uchar *)"3";break;
case NUM4: KeyValue[0]=4;lcd=(uchar *)"4";break;
case NUM5: KeyValue[0]=5;lcd=(uchar *)"5";break;
case NUM6: KeyValue[0]=6;lcd=(uchar *)"6";break;
case NUM7: KeyValue[0]=7;lcd=(uchar *)"7";break;
case NUM8: KeyValue[0]=8;lcd=(uchar *)"8";break;
case NUM9: KeyValue[0]=9;lcd=(uchar *)"9";break;
case NUM0: KeyValue[0]=0;lcd=(uchar *)"0";break;
}
lcd_putchar(lcd,3,15,1);
}
while(!second[1])
{
second[1]=key_read();
switch(second[1])
{
case NUM1: KeyValue[1]=1;shuma=(uchar *)"1";break;
case NUM2: KeyValue[1]=2;shuma=(uchar *)"2";break;
case NUM3: KeyValue[1]=3;shuma=(uchar *)"3";break;
case NUM4: KeyValue[1]=4;shuma=(uchar *)"4";break;
case NUM5: KeyValue[1]=5;shuma=(uchar *)"5";break;
case NUM6: KeyValue[1]=6;shuma=(uchar *)"6";break;
case NUM7: KeyValue[1]=7;shuma=(uchar *)"7";break;
case NUM8: KeyValue[1]=8;shuma=(uchar *)"8";break;
case NUM9: KeyValue[1]=9;shuma=(uchar *)"9";break;
case NUM0: KeyValue[1]=0;shuma=(uchar *)"0";break;
}
lcd_putchar(shuma,3,16,1);
}
KeyValue[1]=KeyValue[0]*10+KeyValue[1];
second[1] = second[1]*10+second[0];
rtc_write(KeyValue[1],0x80);
//while(1)
tmp=rtc_read(0x80);
return tmp;
/*
tmp=rtc_read(0x82);
tmp=rtc_read(0x84);
tmp=rtc_read(0x86);
tmp=rtc_read(0x88);
tmp=rtc_read(0x8a);
tmp=rtc_read(0x8c);
rtc_write(22,0x82);
rtc_write(22,0x84);
rtc_write(22,0x86);
rtc_write(22,0x88);
rtc_write(22,0x8a);
rtc_write(22,0x8c);
tmp=rtc_read(0x82);
tmp=rtc_read(0x84);
tmp=rtc_read(0x86);
tmp=rtc_read(0x88);
tmp=rtc_read(0x8a);
tmp=rtc_read(0x8c);
*/
//rtc_write(10,0x80);
for(;;)
{
tmp=rtc_read(0x80);
tmp=rtc_read(0x82);
}
/*
rtc_write(11,0x82);
rtc_write(11,0x84);
rtc_write(11,0x86);
rtc_write(11,0x88);
rtc_write(11,0x8a);
rtc_write(11,0x8c);
tmp=rtc_read(0x82);
tmp=rtc_read(0x84);
tmp=rtc_read(0x86);
tmp=rtc_read(0x88);
tmp=rtc_read(0x8a);
tmp=rtc_read(0x8c);*/
/*
#define RTCADDRW 0x80 //senond
#define RTCBURSTADDRW 0xbe //10111110 read 1 and write 0,clock burst
#define RAMADDRW 0xc0 //10110000
#define RAMBURSTADDRW 0xfe //111111110 ram30
#define PROTECREGISTER 0x8e //10001110 control
#define CHARGECON 0x90 //10010000 trickle charge
#define READOFFSET 1 //
#define NEXTADDR 2
*/
/*
uint16 status=0,tmp=0;
rtcio_init();
// structdatainit((uint16 *)&local_rtc_time,6,0);
//if halt or enalbe charge or time is bad,status=1
tmp=rtc_read(RTCADDRW);
if((tmp&0x80)==0x80)
status=1;
if(rtc_readtime()==1)
status=1;
tmp=rtc_read(CHARGECON);
if((tmp&0xf0==0xa0)||(tmp&0x0f!=0x0f))
status=1;
if(status)
{
rtc_write(0,PROTECREGISTER);//disa protect
rtc_write(0x80,RTCADDRW);//disa clk
rtc_write(0xff,CHARGECON);//disa charge;
rtc_write(faultregister.second|0x80,RTCADDRW);
rtc_write(faultregister.minute,RTCADDRW+2);
rtc_write(faultregister.hour,RTCADDRW+4);
rtc_write(faultregister.day,RTCADDRW+6);
rtc_write(faultregister.month,RTCADDRW+8);
rtc_write(faultregister.year,RTCADDRW+12);
//add check if write success
if(rtc_readtime()==1)
{
structdatainit((uint16 *)&local_rtc_time,6,0);
return 1;
}
//if enalbe charge return error
tmp=rtc_read(CHARGECON);
if(tmp!=0xff)
return 1;
rtc_write(faultregister.second&0x7f,RTCADDRW);//enable clk
rtc_write(0x80,PROTECREGISTER);//enable protect
//if halt return error
if(rtc_read(RTCADDRW)&0x80==0x80)
return 1;
}
return 0;
*/
}
uint16 bcdtobin(uint16 data,uint16 tobin)
{
uint16 tmp;
if(tobin)
{
data &=0x00ff;
return (data>>4)*10+(data&0x000f);
}
else
{
tmp=data%100;
tmp/=10;
tmp<<=4;
return tmp+(data%100)%10;
}
}
void rtc_write(uint16 data,uint16 addr)
{
uint16 i;
rtcio_init();
rtc_ce(1);
for (i=0;i<8;i++)
{ rtc_clk(0);
rtc_do(addr&1);
delayus(5);
rtc_clk(1);
delayus(5);
addr=(addr>>1);
}//從右向左寫。低位到高位
for (i=0;i<8;i++)
{ rtc_clk(0);
rtc_do(data&1);
delayus(5);
rtc_clk(1);
delayus(5);
data=(data>>1);
}
rtc_clk(0);
delayus(2);
rtc_ce(0);
}//data first,add last
uint16 rtc_read(uint16 addr)
{
uint16 i;
uint16 tmp=0;
addr++;//secondry addr
rtcio_init();
rtc_ce(1);
for (i=0;i<8;i++)
{ rtc_clk(0);
rtc_do(addr&1);
delayus(5);
rtc_clk(1);
delayus(5);
addr=(addr>>1);
}
rtc_di();
delayus(1);
for (i=0;i<8;i++)
{ rtc_clk(0);
//delayus(2);
tmp|=rtc_di();
delayus(5);
if(i<7)
{
rtc_clk(1);
//tmp=rtc_di();
delayus(5);
tmp>>=1;
}
}
rtc_ce(0);
return tmp;
}//read a data,8 bits
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -