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

📄 ds1302.c

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