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

📄 clock.c

📁 使用DS1302+12864液晶+红外线遥控器,进行无线遥控来改变所有关于时间的设置.包括年,月,日等等的数字时钟的程序~
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*****************************************************************************/



/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
write_clock(0x8e,0x00);//允许写操作

write_clock(0x8c,0x07);//年.
write_clock(0x8a,0x01);//星期.
write_clock(0x88,0x12);//月.
write_clock(0x86,0x31);//日.
write_clock(0x84,0x23);//小时.
write_clock(0x82,0x59);//分钟.
write_clock(0x80,0x00);//秒.
write_clock(0x90,0xa5);//充电. 
write_clock(0x8e,0x80);//禁止写操作. 
}
/*****************************************************************************/



/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
if(read_clock(0x85) != hh){
    hh = read_clock(0x85);
//     if (hh > 0x07 && hh < 0x22 && w == 0){
//      beep = 0; led_r = 0;
//      DelayM(100);
//      beep = 1; led_r = 1;
//     }
    }
    lcm_w_test(0,0x88);
    lcm_w_test(1,(hh/16)+0x30);
    lcm_w_test(1,hh%16+0x30);
    
} //}
/*****************************************************************************/


/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){
if(read_clock(0x87) != dd){
    dd = read_clock(0x87);
    lcm_w_test(0,0x92);
     if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);} //十位消隐
     else{lcm_w_test(1,0x20);}//同上  
    lcm_w_test(1,dd%16+0x30);
    lcm_w_test(0,0x93);
    lcm_w_word("日    ");
    
} }
/*****************************************************************************/


/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
unsigned char sel;

if(read_clock(0x8b) != xq){
xq = read_clock(0x8b);
sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)
if(sel==7)    {lcm_w_word("日");}      //
     if(sel==6)    {lcm_w_word("六");}      //
     if(sel==5)    {lcm_w_word("五");}      //
     if(sel==4)    {lcm_w_word("四");}      //
     if(sel==3)    {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
     if(sel==2)    {lcm_w_word("二");}      //
     if(sel==1)    {lcm_w_word("一");}      //星期一
lcm_w_test(0,0x95);
lcm_w_word("星期");
}
}
/*****************************************************************************/


/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
if(read_clock(0x89) != mo){
    mo = read_clock(0x89);
    lcm_w_test(0,0x90);
     if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);} //十位消隐
     else{lcm_w_test(1,0x20);}//同上   
    lcm_w_test(1,mo%16+0x30);
    lcm_w_test(0,0x91);
    lcm_w_word("月");
} }
/*****************************************************************************/


/*****************************************************************************/
//向LCM中填写 年 数据
void lcm_w_yy(void){
if(read_clock(0x8d) != yy){
    yy = read_clock(0x8d);
    lcm_w_test(0,0x83);
    lcm_w_word("20");
    lcm_w_test(0,0x84);
    lcm_w_test(1,(yy/16)+0x30); 
    lcm_w_test(1,yy%16+0x30);
} 
}
/*****************************************************************************/



/*****************************************************************************/
//刷新数据
void updata (void){
    lcm_w_hh();//刷新 小时 
    lcm_w_dd();//刷新 日
    lcm_w_xq();//更新星期值 
    lcm_w_mo();//刷新 月
    lcm_w_yy();//刷新 年
  
}
/*****************************************************************************/



/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
if(read_clock(0x83) != mm){  
    mm = read_clock(0x83);
    if( w == 0){    
//     days();      //节日显示
     updata (); //刷新数据
    }    
}
lcm_w_test(0,0x89); 
lcm_w_test(1,0x3a);     //":"
lcm_w_test(1,(mm/16)+0x30);
lcm_w_test(1,mm%16+0x30);
lcm_w_test(1,0x2e);    //"." 
}
/*****************************************************************************/



/*****************************************************************************/
//向LCM中填写 秒 数据
void lcm_w_ss(void){
unsigned int i=0;
unsigned char a=0,b=0,c=0;
if(read_clock(0x81) != ss){ //判断是否需要更新
    ss = read_clock(0x81); //更新数据
    lcm_w_test(0,0x8b);    //秒值在LCM上的写入位置
    lcm_w_test(1,(ss/16)+0x30); //写十位  
    lcm_w_test(1,ss%16+0x30); //写个位
    lcm_w_mm();//刷新 分  
// lcm_w_test(0,0x8d);    //温度在LCM上的写入位置  
            }
}
/*****************************************************************************/


/*****************************************************************************/
//调时用加1程序

void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
    signed char address,item;
    signed char max,mini;
    lcm_w_test(0,0x9a);
    lcm_w_word("调整");
    //if(sel==6)    {lcm_w_word("秒钟");address=0x80; max=0;mini=0;}       //秒7
    if(sel==5)    {lcm_w_word("分钟");address=0x82; max=59;mini=0;}      //分钟6
    if(sel==4)    {lcm_w_word("小时");address=0x84; max=23;mini=0;}      //小时5
    if(sel==3)    {lcm_w_word("星期");address=0x8a; max=7;mini=1;}      //星期4  
    if(sel==2)    {lcm_w_word("日期");address=0x86; max=31;mini=1;}      //日3
    if(sel==1)    {lcm_w_word("月份");address=0x88; max=12;mini=1;}      //月2
    if(sel==0)    {lcm_w_word("年份");address=0x8c; max=99; mini=0;}      //年1
  
    //读取1302某地址上的数值转换成10进制赋给item 
    item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
    if(date[2]==0x19){
     item++;//数加 1  
    }
    if(date[2]==0x1D){
     item--;//数减 1 
    }
    if(item>max) item=mini;//查看数值有效范围   
    if(item<mini) item=max;           
    write_clock(0x8e,0x00);//允许写操作
    write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
    write_clock(0x8e,0x80);//写保护,禁止写操作 
    updata (); //刷新数据
    lcm_w_mm();//刷新 分 
}
/*****************************************************************************/



//---主程序---//

main() {
      unsigned char e=0;

SP=0x60;                                    //堆栈指针
      EX0=1;                                      //允许外部中断0,用于检测红外遥控器按键
      EA=1;                                       //总中断开
yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新 .
    DelayM(900);         
lcm_init();//初始化液晶显示器
lcm_clr();//清屏 .
lcm_w_word("    12864LcdClock                    Hello !!         from DoYoung.net");//显示欢迎字
DelayM(3000); //显示等留3秒

lcm_clr();//清屏 .

while(1)
{
      P0=date[3];
    lcm_w_ss();
//    date[3]=0xff;

    //-----------------------------
    if(date[2]==0x00)
    {
     Init_1302();
     date[2]=0xff;
    }
    //-----------------------------

    //----------------------------
    if(date[2]==0x01)
    {
     write_clock(0x8e,0x00);//允许写操作
     write_clock(0x80,0x00);//秒.
     write_clock(0x90,0xa5);//充电. 
     write_clock(0x8e,0x80);//禁止写操作. 
     date[2]=0xff;
  
    }
  

    //----------------------------------------------------------
    if(date[2]==0x0c && w == 1) //当是调时状态 本键用于调整下一项.
     {
      e++;
      if (e >= 6 ){e = 0;}
      Set_time(e);//调整
      date[2]=0xff;    
     }

     if(date[2] == 0x0c && w == 0)    //当是正常状态时就进入调时状态
     {       
      lcm_clr();//清屏.
      w=1;     //进入调时    
      Set_time(e);//调整
      date[2]=0xff;    

     }
    //---------------------------------------------------------------   



//***************************************************************************
           if(date[2]==0x19 && w == 1){    
      Set_time(e);//调整
      date[2]=0xff;
       
          }


//***************************************************************************


//***************************************************************************
           if(date[2]==0x1D && w == 1){    
      Set_time(e);//调整.
      date[2]=0xff;

          }

//****************************************************************************
   

}   

}

⌨️ 快捷键说明

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