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

📄 ds1302_init.h

📁 使用IAR编写的DS1302时钟芯片驱动和4*4矩阵按键的扫描函数
💻 H
字号:
//------------------------------------------------------------------------------
//程序名称:DS1302_INIT.h
//designed by lvshichao
//2008.10.2
//------------------------------------------------------------------------------
//#include "io430.h"

#define BIT0_1302 0
#define BIT1_1302 1
#define BIT2_1302 2
#define BIT3_1302 3
#define BIT4_1302 4
#define BIT5_1302 5
#define BIT6_1302 6
#define BIT7_1302 7
//复位引脚
#define RST_CLR P2OUT&=~(1<<BIT0_1302)
#define RST_SET P2OUT|=(1<<BIT0_1302)

#define RST_IN  P2DIR&=~(1<<BIT0_1302)
#define RST_OUT P2DIR|=(1<<BIT0_1302)


//双向数据
#define IO_CLR P2OUT&=~(1<<BIT1_1302)
#define IO_SET P2OUT|=(1<<BIT1_1302)
#define IO_R   P2IN&(1<<BIT1_1302)
#define IO_IN  P2DIR&=~(1<<BIT1_1302)
#define IO_OUT P2DIR|=(1<<BIT1_1302)


//时钟信号
#define SCK_CLR P2OUT&=~(1<<BIT2_1302)
#define SCK_SET P2OUT|=(1<<BIT2_1302)

#define SCK_IN  P2DIR&=~(1<<BIT2_1302)
#define SCK_OUT P2DIR|=(1<<BIT2_1302)

//1302芯片信号定义
#define ds1302_sec_add			0x80		//秒数据地址
#define ds1302_min_add			0x82		//分数据地址
#define ds1302_hr_add			0x84		//时数据地址
#define ds1302_date_add			0x86		//日数据地址
#define ds1302_month_add		0x88		//月数据地址
#define ds1302_day_add			0x8a		//星期数据地址
#define ds1302_year_add			0x8c		//年数据地址
#define ds1302_control_add		0x8e		//控制数据地址
#define ds1302_charger_add		0x90 					 
#define ds1302_clkburst_add		0xbe
unsigned char time_buf[8] = {0x20,0x08,0x10,0x4,0x8,0x51,0x0,0x2};             //初始时间
unsigned char time_real_buf[8];

//-------------------------------------------------------------------
//函数名称:1302_delay()
//功能:函数延时
//-------------------------------------------------------------------
void delay_1302(unsigned int i)
{

 while(i--);
}
//-------------------------------------------------------------------
//函数名称:ds1302_write_byte()
//功能:向DS1302写入一字节数据
//-------------------------------------------------------------------
void ds1302_write_byte(unsigned char addr, unsigned char d) 
{
  unsigned char i;
  RST_SET;               //启动DS1302总线
  //写入目标地址:addr
  IO_OUT;
  addr=addr&0XFE;       //最低位置零
  for(i=0;i<8;i++)
     {
      if(addr&0x01)
       {
        IO_SET;
       }
      else
       {
       IO_CLR;
       } 
      SCK_SET;
      SCK_CLR;
      addr=addr>>1;
     }
  //写入数据:addr
  IO_OUT;
  for(i=0;i<8;i++)
     {
     if(d&0x01)
       {
       IO_SET;
       }
     else
      {
      IO_CLR;
      }
     SCK_SET;
     SCK_CLR;
     d=d>>1;
     }
  RST_CLR;//停止DS1302总线
}

//------------------------------------------
//文件名称:ds1302_read_byte()
//功能:从DS1302读出一字节数据
//------------------------------------------
unsigned char ds1302_read_byte(unsigned char addr)
{
        unsigned char i;
	unsigned char temp;
	RST_SET;	//启动DS1302总线
        //写入目标地址:addr
        IO_OUT;
        addr=addr|0x01; //最低位置高
        for(i=0;i<8;i++)
           {
            if(addr&0x01)
              {
              IO_SET;
              } 
            else
             {
             IO_CLR;
             } 
            SCK_SET;
            SCK_CLR;
            addr=addr>>1;
           }
        //输出数据:temp
        IO_IN;
        for(i=0;i<8;i++)
           {
            temp=temp>>1;
            if(IO_R)
             {
              temp|=0x80;
             }
            else
            {
             temp&=0x7f;
            } 
            SCK_SET;
            SCK_CLR;
           }
        
 RST_CLR;          //停止DS1302总线
 return temp;
 

}
//-----------------------------------------------------------
//文件名称:ds1302_write_time()
//功能:向DS1302写入时钟数据
//-----------------------------------------------------------
void ds1302_write_time(void) {

	ds1302_write_byte(ds1302_control_add,0x00);			//关闭写保护 
	ds1302_write_byte(ds1302_sec_add,0x80);				//暂停 
	ds1302_write_byte(ds1302_charger_add,0xa9);			//涓流充电 
	ds1302_write_byte(ds1302_year_add,time_buf[1]);		//年 
	ds1302_write_byte(ds1302_month_add,time_buf[2]);	//月 
	ds1302_write_byte(ds1302_date_add,time_buf[3]);		//日 
	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
	ds1302_write_byte(ds1302_hr_add,time_buf[4]);		//时 
	ds1302_write_byte(ds1302_min_add,time_buf[5]);		//分
	ds1302_write_byte(ds1302_sec_add,time_buf[6]);		//秒
	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
	ds1302_write_byte(ds1302_control_add,0x80);			//打开写保护 
}
//------------------------------------------------------------------
//文件名称:ds1302_read_time()
//功能:从DS1302读出时钟数据
//------------------------------------------------------------------
void ds1302_read_time(void)  { 

	time_real_buf[1]=ds1302_read_byte(ds1302_year_add);		//年 
	time_real_buf[2]=ds1302_read_byte(ds1302_month_add);		//月 
	time_real_buf[3]=ds1302_read_byte(ds1302_date_add);		//日 
	time_real_buf[4]=ds1302_read_byte(ds1302_hr_add);		//时 
	time_real_buf[5]=ds1302_read_byte(ds1302_min_add);		//分 
	time_real_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒 
	time_real_buf[7]=ds1302_read_byte(ds1302_day_add);		//周 
}
//------------------------------------------------------------------
//文件名称:ds1302_init()
//功能:DS1302初始化函数
//------------------------------------------------------------------
void ds1302_init(void) {
	
	RST_CLR;			/*RST脚置低*/
	SCK_CLR;			/*SCK脚置低*/
	RST_OUT;			/*RST脚设置为输出*/
	SCK_OUT;			/*SCK脚设置为输出*/
}

⌨️ 快捷键说明

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