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

📄 drv_1302.c

📁 该模板使用于周立功公司研发的EasyARM2100系列开发板
💻 C
字号:
#include "system.h"

#define D1302_IO_DDR_SET     IO1DIR=IO1DIR|0x02000000
#define D1302_IO_DDR_CLR     IO1DIR=IO1DIR&0xfdffffff



extern uint8 set_year_value;
extern uint8 set_month_value;
extern uint8 set_day_value;
extern uint8 set_hour_value;
extern uint8 set_minute_value;
extern uint8 set_second_value;

extern uint8 real_year_value;
extern uint8 real_month_value;
extern uint8 real_day_value;
extern uint8 real_hour_value;
extern uint8 real_minute_value;
extern uint8 real_second_value;

void delayus(uint8 time)
{
 unsigned char i;
for(i=0;i<time;i++);
}

uint8  read_bit_ds1302(void)
    {
     uint8  data;
     D1302_IO_DDR_CLR;
     data =((IO1PIN&D1302_IO)>>25);
     delayus(1);    
     return data;
    }


uint8  read_byte_ds1302(void)
    {
     uint8 i;
     uint8 datak = 0;
     for(i=0;i<8;i++)
       {
        datak = datak >> 1;    
        if(read_bit_ds1302()) datak |= 0x80;
       }
      return datak;
    }


void DS1302_init(void)
    {
     delayus(1);
     write_clock(CONTROL_ADDRESS,0x00);   //open write protection 
     write_clock(TRICKLE_ADDRESS,0xA5);   //select R1=2K,one DIODE 
      real_second_value=read_clock(SECOND_ADDRESS);
     if(real_second_value>59)
      real_second_value=0;
      write_clock(SECOND_ADDRESS,real_second_value);  //start real time clock
     real_year_value=read_clock(YEAR_ADDRESS);  
    if(real_year_value>99) 
     real_year_value=0;
    real_month_value=read_clock(MONTH_ADDRESS);
    if(real_month_value>12)
     real_month_value=1;
    real_day_value=read_clock(DAY_ADDRESS);
    if(real_day_value>31)
     real_day_value=1;       
     }


uint8 read_clock(uint8 address)
{
  uint8 temp;
  uint8 i,temp1,temp2;

   IO0CLR |=D1302_CLK;       //DS1302_CLK=0;
   delayus(1);
   IO0SET |= D1302_RST;      //DS1302_RST=1;
   delayus(2);
   address|=0x01;          //read clock
   D1302_IO_DDR_SET;
   
   for(i=0;i<8;i++)        //command in
    {
      temp=address;
      temp&=0x01;
      address>>=1;
      IO0CLR |=D1302_CLK;   // DS1302_CLK=0; 
      delayus(1);
      if(1==temp)
         {
          IO1SET|=D1302_IO;
         }
         
      else
         {
          IO1CLR|=D1302_IO;
         }
      delayus(1);
      IO0SET|=D1302_CLK;
    }
     
    for(i=0;i<8;i++)        //data out
     {
      IO0CLR|=D1302_CLK;
      temp>>=1;
     if((IO1PIN&0x02000000)!=0)
       {
        temp|=0x80;
       }
     IO0SET|=D1302_CLK;
     }
   
   IO0CLR|=D1302_RST;
   delayus(1);
   IO0CLR|=D1302_CLK;

   temp2=temp;        //BCD code -->HEX code
   temp1=temp2>>4;   
   temp1&=0x07;
   temp&=0x0f;
   temp+=(temp1*10);

   return (temp);
}



void write_clock(uint8 address,uint8 set_clock)
{ 
  uint8 temp;
  uint8 i,temp1;

   IO0CLR|=D1302_CLK;//=0;
   delayus(1);
   IO0SET|= D1302_RST;//=1;
   delayus(2);

   address&=0xfe;    //write clock
   D1302_IO_DDR_SET;
   
   for(i=0;i<8;i++)  //command in
     {
      temp=address;
      temp&=0x01;
      address>>=1;
      IO0CLR|= D1302_CLK;//=0;
      delayus(1);
      if(1==temp)
         {
         IO1SET|=D1302_IO;
         }
       else
         {
          IO1CLR|=D1302_IO;
         }
       delayus(1);
       IO0SET|= D1302_CLK;//=1;
     }

   set_clock&=0x7f;      //24 hour model
   temp1=set_clock%10;   // HEX code -->  BCD code
   temp=set_clock/10;
   temp<<=4;
   temp1+=temp;

   for(i=0;i<8;i++)  //data in
    {
     temp=temp1;
     temp&=0x01;
     temp1>>=1;
     IO0CLR|= D1302_CLK;//=0;
     delayus(1);
     if(1==temp)
       {
       IO1SET|=D1302_IO;
       }
     else
       {
       IO1CLR|=D1302_IO;
       }
      delayus(1);
      IO0SET|= D1302_CLK;//=1;
     }

     IO0CLR|= D1302_RST;//=0;
     delayus(1);
     IO0CLR|= D1302_CLK;//=0;
}
    
void set_time(void)
   {
    DS1302_init();  //DS1302初始化
   /* write_clock(SECOND_ADDRESS,0x00);
    write_clock(HOUR_ADDRESS,12);  //write  11 hour
    write_clock(CONTROL_ADDRESS,0x80); //写保护
    write_clock(MINUTE_ADDRESS,05); //write 10 minute
	write_clock(CONTROL_ADDRESS,0x80); //写保护
    real_second_value=read_clock(SECOND_ADDRESS);
    if(real_second_value>59)
    real_second_value=0;
    write_clock(SECOND_ADDRESS,real_second_value);  //start real time clock
   
    real_hour_value=read_clock(HOUR_ADDRESS);
    if(real_hour_value>23)
     real_hour_value=0;
    real_minute_value=read_clock(MINUTE_ADDRESS);
    if(real_minute_value>59)
     real_minute_value=0;     
    real_second_value=read_clock(SECOND_ADDRESS);
    if(real_second_value>59)
    real_second_value=0; */
   }
   
   
 
   void D1302_test(void)
   {  UART0_SendByte(0xaa);
      real_hour_value=read_clock(HOUR_ADDRESS);
      if(real_hour_value>23)
      real_hour_value=0;
      UART0_SendByte(real_hour_value);
      real_minute_value=read_clock(MINUTE_ADDRESS);
      if(real_minute_value>59)
       real_minute_value=0; 
      UART0_SendByte(real_minute_value);    
      real_second_value=read_clock(SECOND_ADDRESS);
      if(real_second_value>59)
      real_second_value=0; 
      UART0_SendByte(real_second_value);
      UART0_SendByte(0x55);
   }
   
   void read_rtc(void)
   {
   
      real_hour_value=read_clock(HOUR_ADDRESS);
    if(real_hour_value>23)
     real_hour_value=0;
    real_minute_value=read_clock(MINUTE_ADDRESS);
    if(real_minute_value>59)
     real_minute_value=0;     
    real_second_value=read_clock(SECOND_ADDRESS);
    if(real_second_value>59)
     real_second_value=0; 
     }

⌨️ 快捷键说明

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