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

📄 ds1302main.c

📁 用ds1302写的数字时钟
💻 C
字号:
//2007.6.01   19:46
//designed by lianghongzhi
#include"reg52.h"
#include"intrins.h"

sbit LCD1602_RS=P0^7;   //data command select  1 data  0 command  pin 4 
sbit LCD1602_RW=P0^6;   //read write select   1 read   0 write     pin 5
sbit LCD1602_EN=P0^5;   //LCD enable signal             pin 6

sbit T_CLK=P1^0;
sbit T_IO=P1^2;
sbit T_RST=P1^4;
#define LCDIO  P2
//lcd part
#define  LINE1     0
#define  LINE2     1
#define  LINE1_HEAD    0x80
#define  LINE2_HEAD    0xc0
#define  LCD_DELAY_TIME   40
#define  DATA_MODE    0x38
#define  OPEN_SCREEN    0x0c
#define  DISPLAY_ADDRESS   0x80
#define  CLEARSCREEN    LCD_en_command(0x01)
#define  COMMAND_SLOT   LCD1602_RS=LOW; LCD1602_RW=LOW;LCD1602_EN=LOW
#define  DATA_SLOT    LCD1602_RS=HIGH;LCD1602_RW=LOW;LCD1602_EN=LOW
//common part 
#define  HIGH     1
#define  LOW      0
#define  TRUE      1
#define  ZERO      0 
#define  MSB       0x80
#define  LSB        0x01
code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
//Write
#define Time_sec_W(dat)    v_W1302(0x80,(dat))    //write second
#define Time_min_W(dat)    v_W1302(0x82,(dat))    //write minute
#define Time_hou_W(dat)    v_W1302(0x84,(dat))    //write hour
#define Time_dat_W(dat)    v_W1302(0x86,(dat))    //write date
#define Time_mon_W(dat)    v_W1302(0x88,(dat))    //write month
#define Time_yea_W(dat)    v_W1302(0x8c,(dat))    //write year
#define Time_wee_W(dat)    v_W1302(0x8a,(dat))    //write week

//Read
#define Time_sec_R()       uc_R1302(0x81)            //read second
#define Time_min_R()       uc_R1302(0x83)            //read minute
#define Time_hou_R()       uc_R1302(0x85)            //read hour
#define Time_dat_R()       uc_R1302(0x87)            //read date
#define Time_mon_R()       uc_R1302(0x89)            //read month
#define Time_yea_R()       uc_R1302(0x8d)            //read year
#define Time_wee_R()       uc_R1302(0x8b)            //read week
	//unsigned char ucCurtime[7];
	//code unsigned char set_1302_code[7]={0x00,0x30,0x18,0x04,0x16,0x06,0x05}; 
void v_RTInputByte(unsigned char ucDa)         //写入一字节数据
    {
         unsigned char i;
         for(i=0;i<8;i++)
       {
		T_IO=(bit)(ucDa&0x01);
         T_CLK=1;                  
         T_CLK=0;                       //数据写入必须上升沿,
         ucDa>>=1;
         }
     }
   unsigned char uc_RTOutputByte()             //读取一字节数据
{
         unsigned char i;
         unsigned char ucDa=0x00;
          for(i=8;i>0;i--)
       {
		
        ucDa>>=1; 
        T_CLK=0;              
        if(T_IO) ucDa|=0x80;
        T_CLK=1;
       }
      return(ucDa);
}
void v_W1302(unsigned char ucAddr,unsigned char ucDa)                  //往DS1302写入数据
{
           T_RST=0;
            T_CLK=0;
           T_RST=1;
           v_RTInputByte(ucAddr);                   //地址,命令
           v_RTInputByte(ucDa);                      //写一字节数据
           T_CLK=1;
            T_RST=0;
}
unsigned char uc_R1302(unsigned char ucAddr)                       //读取DS1302某地址的数据
{
            unsigned char ucDa,ucDa_Dat;
            T_RST=0;
             T_CLK=0;
                T_RST=1;
                //T_CLK=0;
             v_RTInputByte(ucAddr);                  //地址,命令 
            ucDa=uc_RTOutputByte();                  //读一字节数据
           // T_CLK=1;
              T_RST=0;
              ucDa_Dat=ucDa/16;
              ucDa=ucDa%16;
              ucDa=ucDa+ucDa_Dat*10;
              return(ucDa);
}
/*void v_BurstW1302T(uchar *pSecDa)                   //往DS1302写入时钟数据(多字节方式)
{
         uchar i;
         v_W1302(0x8e,0x00);                          //控制命令,WP=0,写操作?
         T_RST=0;
         T_CLK=0;
         T_RST=1;
         v_RTInputByte(0xbe);                      //时钟多字节写命令
          for(i=8;i>0;i--)                         //7字节时钟数据+一字节控制
{
           v_RTInputByte(*pSecDa);                 //写一字节数据
             pSecDa++;
}
     T_CLK=1;
      T_RST=0;
}
void v_BurstR1302T(uchar *pSecDa)                     //读取DS1302时钟数据
{
                uchar i;
              T_RST=0;
              T_CLK=0;
               T_RST=1;
              v_RTInputByte(0xbf);                 //时钟多字节读命令
             for(i=8;i>0;i--) 
{
            *pSecDa=uc_RTOutputByte();                       //读一字节数据
             pSecDa++;
}
             T_CLK=1;
              T_RST=0;
}
void v_BurstW1302R(uchar *pReDa)                      //往DS1302寄存器写入数据(寄存器多字节方式)
{
       uchar i;
     v_W1302(0x8e,0x00);                 //控制命令,WP=0,写操作?
      T_RST=0;
        T_CLK=0;
        T_RST=1;
         v_RTInputByte(0xfe);                       // 时钟多字节写命令
         for(i=31;i>0;i--)
{
        v_RTInputByte(*pReDa);                     //写一字节数据
         pReDa++;
}
        T_CLK=1;
         T_RST=0;
}
void v_BurstR1302R(uchar *pReDa)                        //读取DS1302寄存器数据
{
     uchar i;
       T_RST=0;
        T_CLK=0;
        T_RST=1;
         v_RTInputByte(0xff);                       //时钟多字节读命令
       for(i=31;i>0;i--)
            {
             *pReDa=uc_RTOutputByte();
             pReDa++;
            }
            T_CLK=1; 
            T_RST=0;
}*/
/*void v_Set1302(void)                      //设置初始时间
{
          uchar i;
          uchar ucAddr=0x80;
                            //控制命令,WP=0,写操作?
         for(i=0;i<7;i++)
{
             v_W1302(ucAddr,set_1302_code[i]);              //秒 分 时 日 月 星期 年
              ucAddr+=2;
}
                         //控制命令,WP=1,写保护?
}
void v_Get1302(void)                 //读取DS1302当前时间
{
           uchar i;
            uchar ucAddr=0x81;
            for(i=0;i<7;i++)
{             
        ucCurtime[i]=uc_R1302(ucAddr);            //格式为:  秒 分 时 月 星期 年
        ucAddr+=2;
}
}*/

/******************** LCD PART *************************************/
void LCD_delay(void)   
{
 unsigned char i;
 for(i=LCD_DELAY_TIME;i>ZERO;i--);//be sure lcd reset
}
/********************************************************************/  
void LCD_en_command(unsigned char command)
{
 LCDIO=command;
 COMMAND_SLOT;
 LCD_delay();
 LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_en_dat(unsigned char dat)
{
 LCDIO=dat;
 DATA_SLOT;
 LCD_delay();
 LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
 unsigned char address;
 if (y == LINE1) 
  address = LINE1_HEAD + x;
 else 
     address = LINE2_HEAD + x;
 LCD_en_command(address); 
}
/********************************************************************/
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
{
 LCD_set_xy( x, y ); 
 LCD_en_dat(dat);
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
    LCD_set_xy( X, Y ); //set address 
    while (*s)  // write character
    {
     LCDIO=*s;
        LCD_en_dat(*s);   
  s ++;
    }
}
/********************************************************************/
void LCD_init(void)
{ 
 CLEARSCREEN;//clear screen 
 LCD_en_command(DATA_MODE);//set 8 bit data transmission mode 
 LCD_en_command(OPEN_SCREEN);//open display (enable lcd display)
 LCD_en_command(DISPLAY_ADDRESS);//set lcd first display address 
 CLEARSCREEN;//clear screen
}
void main()
{
	 unsigned  char  key,sec,min,hour;
	 unsigned  char year,mon,dat;
     LCD_init();
     T_RST=0;
      T_CLK=0;
     T_RST=1;
     v_RTInputByte(0x8e); 
      v_RTInputByte(0x00); 
     T_RST=0;
   Time_sec_W(0x10);            //write second
   Time_min_W(0x59);           //write minute
   Time_hou_W(0x23);        //write hour
   Time_dat_W(0x30);        //write date
   Time_mon_W(5);        //write month
   Time_yea_W(0x07);     //write year
   Time_wee_W(3);        //write week*/
   
  for(;;)
	 {
		sec=Time_sec_R()  ;
		key=sec%10;
        LCD_write_char(0x0f,LINE2,key|0x30);
        key=sec/10;
        LCD_write_char(0x0e,LINE2,key|0x30);
        min=Time_min_R() ;
        key=min%10;
        LCD_write_char(0x0c,LINE2,key|0x30);
        key=min/10;
        LCD_write_char(0x0b,LINE2,key|0x30);
        hour=Time_hou_R() ;
        key=hour%10;
        LCD_write_char(0x09,LINE2,key|0x30);
        key=hour/10;
        LCD_write_char(0x08,LINE2,key|0x30);
	    year=Time_yea_R() ;
	    key=year%10;
        LCD_write_char(0x03,LINE1,key|0x30);
        key=year/10;
        LCD_write_char(0x02,LINE1,key|0x30);
        mon=Time_mon_R() ;
        key=mon/10;
       LCD_write_char(0x05,LINE1,key|0x30); 
        key=mon%10;
        LCD_write_char(0x06,LINE1,key|0x30);
        dat=Time_dat_R() ;
        key=dat/10;
        LCD_write_char(0x08,LINE1,key|0x30);
        key=dat%10;
        LCD_write_char(0x09,LINE1,key|0x30);
        LCD_write_string(0x00,LINE1,"20");
        LCD_write_string(0x04,LINE1,"-");
        LCD_write_string(0x07,LINE1,"-");
        LCD_write_string(0x0d,LINE2,":");
        LCD_write_string(0x0a,LINE2,":");
        LCD_write_string(0x0b,LINE1,day[2]);
}
}

⌨️ 快捷键说明

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