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

📄 ds1602+1302_01.c

📁 51单片机试验板-sch-pcb-4.0M.zip
💻 C
字号:
#include<reg51.h>

/***************************1302:引角配置**********************/
sbit RST_1302=P1^1;
sbit IO_1302=P1^2;
sbit CLK_1302=P1^0;

/****************************1602:引脚配置**********************/
sbit RS_1602=P2^0;
sbit RW_1602=P2^1;
sbit E_1602=P2^2;
sbit BUSY=P0^7;


sbit  ACC0=ACC^0;
sbit  ACC7=ACC^7;
unsigned char   gen_char[5]={"TIME:"};
unsigned char   time_char[10]={'0','1','2','3','4','5','6','7','8','9'};


/*************************************延时程序=a*1ms*********/
void delay(unsigned char a)
{
   unsigned char i;
   while(a-- !=0)
   {
      for(i=0;i<125;i++);
   }
}


/*********************************************************/
/*                  DS1302                               */
/*                                                       */
/********************************************************/
void write_dat_1302(unsigned char dat)     //DS1302:写入操作
{
   unsigned char i;
   ACC=dat;
   for(i=8;i>0;i--)
   { 
      IO_1302=ACC0;
	  CLK_1302=0;     
      CLK_1302=1;
      ACC=ACC>>1;
   }
}

unsigned char read_dat_1302(void)        //DS1302:读取操作   
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
      ACC=ACC>>1;
	  CLK_1302 = 1;
	  CLK_1302 = 0;
      ACC7 = IO_1302;
   }
   return(ACC);

}

void write_1302(unsigned char addr,unsigned char dat) //DS1302:写入数据(先送地址,再写数据?
{
   RST_1302=0;    //停止工作
   CLK_1302=0;                                 
   RST_1302=1;   //重新工作
   write_dat_1302(addr);    //写入地址
   
   write_dat_1302(dat);
   RST_1302=0;
   CLK_1302=1;
}

unsigned char read_1302(unsigned char addr)   //DS1302:读取数据(先送地址,再读数据)
{
   unsigned char temp;
   RST_1302=0;                        //停止工作
   CLK_1302=0;  
   RST_1302=1;                         //重新工作
   write_dat_1302(addr);   //写入地址
   temp=read_dat_1302();
   RST_1302=0;
   CLK_1302=1;     //停止工作
   return(temp);
}
  
  
/**************************************************************/
/*                          LCD:     1602                     */
/*                                                            */
/**************************************************************/


/*************************************1602:检测忙*************/
void detect_busy_1602(void)
{	
    do{
		P0= 0xff;
		RS_1602=0;
		RW_1602=1;
		E_1602=0;
		delay(2);
		E_1602=1;
	  }while(BUSY);
}


/************************************1602:写指令***********/
void write_cmd_1602(unsigned char cmd,unsigned char i)
{  
   if(i) 
   detect_busy_1602();
   P0=cmd;
   RS_1602=0;
   RW_1602=0;
   E_1602=0;
   E_1602=1;
}

/***************************************1602:写数据********/
void write_dat_1602(unsigned char  dat)
{  
   detect_busy_1602();
   P0=dat;
   RS_1602=1;
   RW_1602=0;
   E_1602=0;
   E_1602=1;
}

/*************************************1602:初始化************/
void ini_1602()
{
   delay(15);             
   write_cmd_1602(0x38,0);  //三次显示模式设置,不检测忙信号
   delay(5);
   write_cmd_1602(0x38,0);
   delay(5);
   write_cmd_1602(0x38,0);
   write_cmd_1602(0x08,1); //显示关闭
   write_cmd_1602(0x01,1); //显示清屏
   write_cmd_1602(0x06,1); //光标设置;光标加1;字符左移
   write_cmd_1602(0x0c,1); //显示打开
}

/******************************************1602:时钟显示***********/
void time_show_1602(unsigned char *poi)
{
   unsigned char i;
   write_cmd_1602(0xc8,1);   //显示秒
   i=*poi/16;
   write_dat_1602(time_char[i]);//十位
   i=*poi%16;
   write_dat_1602(time_char[i]);//个位
   poi+=1;

   write_cmd_1602(0xc5,10);  //显示分
   i=*poi/16;
   write_dat_1602(time_char[i]);//十位
   i=*poi%16;
   write_dat_1602(time_char[i]);//个位
   poi+=1;

   write_cmd_1602(0xc2,1);  //显示时
   i=*poi/16;
   write_dat_1602(time_char[i]);//十位
   i=*poi%16;
   write_dat_1602(time_char[i]); //个位

   
}
/**********************************************************/
void main(void)
{
   unsigned char clk_time[3]={0x00,0x00,0x12};  //秒,分,时寄存器初始值
   unsigned char  temp=0x80;       // 地址80:秒写入寄存器  
   unsigned char i;
   write_1302(0x8e,0x00);             //WP=0 写操作
   for(i=0;i<3;i++)
   {
   write_1302(temp,clk_time[i]);
   temp+=2;
   }
   write_1302(0x8e,0x80);             //WP=1 写保护
  


   ini_1602();  
   write_cmd_1602(0x82,1);
   for(i=0;i<5;i++)
   {
      write_dat_1602(gen_char[i]);
   }
   write_cmd_1602(0xc4,1);
   write_dat_1602(':');
   write_cmd_1602(0xc7,1);
   write_dat_1602(':');

   while(1)
   {
     time_show_1602(clk_time);
     temp=0x81;                   // 地址81:秒写入寄存器  
	 for(i=0;i<3;i++)            //更新时间
	 {
         
	   clk_time[i]=read_1302(temp);
	   temp+=2;
	 }
   }
 
}

⌨️ 快捷键说明

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