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

📄 ds1302.h

📁 带T6963C控制器的240128液晶图形显示C程序
💻 H
字号:
//=========================================
//-----  
//-----  DS1302驱动程序 ---------------
//-----  作者:聂金波   niejinbo999@163.com
//-----  完成日期:2008-07-28    ------
//=========================================
//-----  星期一 monday  星期二 tuesday   星期三 wednesday
//-----  星期四 thursday  星期五 friday   星期六 saturday
//-----  星期日 sunday
//-----
//-----
//==========================================

//--------------------------
#define uchar unsigned char
#define uint unsigned int
//--------------------------
//------  定义端口 ---------
sbit rst=P3^0;
sbit sclk=P3^1;
sbit io=P3^2;

//---------------------------
uchar tab_1302[7]={0,10,19,30,7,3,8};     //初始化时时间日期设置
         //秒 分 时 日月 星期 年

uchar tab1_1302[7]={0,10,19,30,7,3,8}; 
//--------------------------
//-----  函数声明  ------
//--------------------------
void ds1302();                   //获取DS1302时间
void writeds_byte(uchar);        //向DS1302写一字节
uchar readds_byte();             //从DS1302读一字节
void ds1302_init();              //DS1302初始化
void writeds_add(uchar,uchar);   //指定地址向1302写一数据
uchar readds_add(uchar);         //指定地址从1302读一数据

//=========================================
//------    函数  ------
//=========================================
//-------------------------------
//----  向DS1302写一字节 (上升沿有效) -------
//----  数据输入从低位到高位     ------------
//-------------------------------

void writeds_byte(uchar dat)    
{
  uchar i,dat_w;
  dat_w=dat;         //数据送给变量dat_w
  for(i=0;i<8;i++)
   {
    io=0;             //数据线先拉低
    if(dat_w&0x01)    //如果是1
     {io=1;}
    else              //如果是0
     {io=0;}
    dat_w=dat_w>>1;   //右移一位
    sclk=0;           //先拉低时钟信号
    sclk=1;           //拉高时钟信号   
   }    
  sclk=0;             //写一字节完毕,拉低时钟信号
}

//-------------------------------
//---- 从DS1302读一字节 (下降沿有效) --------
//---- 读出数据时从低位0位到高位7   -----------
//-------------------------------

uchar readds_byte()
{
  uchar i,k; 
  k=0;
  for(i=0;i<8;i++)
  {
   k=k>>1;           //k右移一位,确保先读来的数据在低位
   if(io)
   {k=k|0x80;}       //读取的值先送K最高位
   sclk=1;           //先拉低时钟信号
   sclk=0;
  }
  sclk=0;
  return (k);
}

//-------------------------------
//---- 指定地址写一数据  --------
//-------------------------------

void writeds_add(uchar add,uchar dat)  //dat为十进制数
{
 rst=0;
 sclk=0;
 rst=1;                               //拉高RST
 writeds_byte(add);                   // 写地址
 writeds_byte((dat/10<<4)|(dat%10));  // DS1302中的时间数据是BCD码形式
 sclk=0;
 rst=0;
}

//-------------------------------
//---- 指定地址读出一数据  ------
//-------------------------------

uchar readds_add(uchar add)
{
 uchar temp,dat1,dat2;
 rst=0;
 sclk=0;
 rst=1;
 writeds_byte(add);
 temp=readds_byte();  //读取的数据为16进制
 sclk=0;              //读取完毕,拉低SCLK
 rst=0;               //拉低SCLK
 dat1=temp/16;        //16进制转成BCD
 dat2=temp%16;
 temp=dat1*10+dat2;   //转换成10进制数字
 return (temp);     
}

//-------------------------------
//---- DS1302初始化  --------
//---- 设置初始时间  --------
//-------------------------------

void ds1302_init()
{
 uchar i,add;
 add=0x80;
 writeds_add(0x8e,0x00);    //允许写入
 for(i=0;i<7;i++)
   {
    writeds_add(add,tab1_1302[i]);
    add+=2;
   }
  writeds_add(0x90,0xa6);   //写充电控制寄存器.
  writeds_add(0x8e,0x80);   //禁止写入
}

//-------------------------------
//---- 获取DS1302时间  --------
//---- 在主函数中调用  --------
//-------------------------------

void ds1302()
{
 uchar i,add=0x81;
// writeds_add(0x8e,0x00);     //允许向DS1302写入数据
 for(i=0;i<7;i++)
  {
   tab_1302[i]=readds_add(add); //获得的数据已转换为十进制     
   add+=2;
  }
 //writeds_add(0x8e,0x80);        //获取完一次时间,禁止向DS1302写入数据,提高可靠
}

//-------------------------------
//-------------------------------
//========================================

⌨️ 快捷键说明

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