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

📄 1302.c

📁 DS1302时钟驱动程序
💻 C
字号:
/******************************************************************************
该程序里面的延时采用汇编的形式,因此在换了晶振之后就必须的改变汇编中的空指令的
条数
该程序是在mega16,8M外部晶振的条件下调试的,胡绍新
******************************************************************************/
#include"mega16.h"
#include"delay.h"
#include"chuankou.c" 
#include"avryejing.c"
#define sck    PORTA.0
#define io     PORTA.1
#define io_in  PINA.1
#define io_en  DDRA.1
#define rest   PORTA.2  
struct time
{unsigned char year;	   //年
 unsigned char month;       //月
 unsigned char day;	   //日
 unsigned char week;	   //周
 unsigned char hour;	   //时
 unsigned char min;	   //分
 unsigned char sec;	   //秒
}shijian,shijian2;
unsigned char DAA(unsigned char w)
{unsigned char k1;
 unsigned char k2;
 k1=w&0x0f;
 k2=w>>4;
 k2=k2&0x0f;
 return k2*10+k1;
 }
void sendbyte(unsigned char w)
{unsigned char i=0;
 rest=1;  //启动数据传输,开始传输数据
 for(i=0;i<8;i++)
 //while(1)
  {if(w&0x01)
     io=1;
       else 
        io=0;
   #asm
   NOP 
   NOP 
   #endasm
   sck=0;
   #asm
   NOP 
   NOP 
   #endasm
   sck=1;
   w=w>>1;
   }
 } 

unsigned char  receive()
{unsigned char temp=0;
 unsigned char i=0;
 rest=1;//启动数据传输
 io_en=0;//将数据口置位输入模式
 for(i=0;i<8;i++)
  {temp=temp>>1;
   sck=1;
   #asm
   NOP 
   NOP 
   #endasm
   sck=0;
   #asm
   NOP 
   NOP 
   #endasm
   if(io_in)temp|=0x80;
    else temp&=0x7f;
   
   }
 io_en=1;
 return temp;  
 } 
void wr1302(unsigned char address,unsigned char data)
{io_en=1;//将数据口置为输出状态
 rest=0;
 sck=0;
 rest=1;
 sendbyte(address);
 sendbyte(data);
 rest=0;
 io=1;
 }
unsigned char  read1302(unsigned char address)
{unsigned char temp=0;
 io_en=1;//将数据口置为输出状态
 rest=0;
 #asm
 NOP 
 NOP 
 #endasm
 sck=0;
 rest=1;
 sendbyte(address);
 temp=receive();
 rest=0;
 io=1; 
 return temp;
 }
main()
{unsigned char k=0;
 unsigned char k2=0;
 unsigned char k3=0;
 unsigned char i=0;
 DDRA=0x0f;
 PORTA=0x0f;
 delay_ms(300);
 rest_lcd(); 
 for(i=0;i<11;i++)chinese(0,4+2*i,i);
 chinese(2,9,18);
 chinese(2,11,19);
 chinese(2,13,11);
 chinese(2,15,12);  //1302时钟
 
 chinese(6,9,13);
 chinese(6,13,14);
 chinese(6,17,15);  //年月日 
 word(7,5,18);
 word(7,6,16);
 word(7,7,16);
 
 chinese(9,9,11);
 chinese(9,13,16);
 chinese(9,17,17);  //时分秒 
 
 chinese(12,11,20);
 chinese(12,13,21); 
 
 
 xianshi(12345678,0);
 wr1302(0x8e,0x00);//允许写入数据
 //wr1302(0xbf,0x00);
 //wr1302(0x84,0x16);
 //wr1302(0x82,0x56);
 
 k=read1302(0x81);
 wr1302(0x90,0xa7);
 //k=DAA(k); 
 if(k&0x80)
 {wr1302(0x80,0x00);
  }
  /*
 //初始化程序
 wr1302(0x80,0x00);//秒
 wr1302(0x82,0x17);//分
 wr1302(0x84,0x13);//时
 wr1302(0x86,0x27);//日
 wr1302(0x88,0x01);//月
 wr1302(0x8a,0x06);//周
 wr1302(0x8c,0x07);//年
 ///
*/
 while(1)
 {//wr1302(0xc0,0x08);
  shijian.sec=DAA(read1302(0x81));
  shijian.min=DAA(read1302(0x83));
  shijian.hour=DAA(read1302(0x85));
  shijian.day=DAA(read1302(0x87));
  shijian.month=DAA(read1302(0x89));
  shijian.week=DAA(read1302(0x8b));
  shijian.year=DAA(read1302(0x8d));
  
  if(shijian2.sec!=shijian.sec)shuxian(10,15,shijian.sec,2);
  if(shijian2.min!=shijian.min)shuxian(10,11,shijian.min,2);
  if(shijian2.hour!=shijian.hour)shuxian(10,7,shijian.hour,2);
  if(shijian2.day!=shijian.day)shuxian(7,15,shijian.day,2);
  if(shijian2.month!=shijian.month)shuxian(7,11,shijian.month,2);
  if(shijian2.week!=shijian.week)shuxian(13,15,shijian.week,2); 
  if(shijian2.year!=shijian.year)shuxian(7,7,shijian.year,2);

  shijian2=shijian;
  xianshi((long)k3*10000+(long)k2*100+k,0);  
  delay_ms(1000);
  }
 }

⌨️ 快捷键说明

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