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

📄 lcm_t.lst

📁 多功能lcd电子钟 包含世界节日
💻 LST
📖 第 1 页 / 共 3 页
字号:
 232   1                      while(*str != '\0'){
 233   2                              lcm_w_test(1,*str++);
 234   2              }
 235   1                      *str = 0;
 236   1      }
 237          /******************************************************************************/
 238          void Delay(int num)//延时函数
 239          {
 240   1              while(num--) ;
 241   1      }       
C51 COMPILER V7.50   LCM_T                                                                 12/08/2007 10:11:44 PAGE 5   

 242          /******************************************************************************/
 243          void Init_DS18B20(void)//初始化ds1820
 244          {
 245   1              unsigned char x=0;
 246   1              DQ = 1;    //DQ复位
 247   1              Delay(8);  //稍做延时
 248   1              DQ = 0;    //单片机将DQ拉低
 249   1              Delay(80); //精确延时 大于 480us
 250   1              DQ = 1;    //拉高总线
 251   1              Delay(14);
 252   1              x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 253   1              Delay(20);
 254   1      }
 255          /******************************************************************************/
 256          unsigned char ReadOneChar(void)//读一个字节
 257          {
 258   1              unsigned char i=0;
 259   1              unsigned char dat = 0;
 260   1              for (i=8;i>0;i--)
 261   1              {
 262   2                      DQ = 0; // 给脉冲信号
 263   2                      dat>>=1;
 264   2                      DQ = 1; // 给脉冲信号
 265   2                      if(DQ)
 266   2                      dat|=0x80;
 267   2                      Delay(4);
 268   2              }
 269   1              return(dat);
 270   1      }
 271          
 272          /******************************************************************************/
 273          void WriteOneChar(unsigned char dat)//写一个字节
 274          {
 275   1              unsigned char i=0;
 276   1              for (i=8; i>0; i--)
 277   1              {
 278   2                      DQ = 0;
 279   2                      DQ = dat&0x01;
 280   2                      Delay(5);
 281   2                      DQ = 1;
 282   2                      dat>>=1;
 283   2              }
 284   1      }
 285          /******************************************************************************/
 286          unsigned int ReadTemperature(void)//读取温度
 287          {
 288   1              unsigned char a=0;
 289   1              unsigned char b=0;
 290   1              unsigned int t=0;
 291   1              float tt=0;
 292   1              Init_DS18B20();
 293   1              WriteOneChar(0xCC); // 跳过读序号列号的操作
 294   1              WriteOneChar(0x44); // 启动温度转换
 295   1              Init_DS18B20();
 296   1              WriteOneChar(0xCC); //跳过读序号列号的操作
 297   1              WriteOneChar(0xBE); //读取温度寄存器
 298   1              a=ReadOneChar();  //读低8位
 299   1              b=ReadOneChar(); //读高8位
 300   1              t=b;
 301   1              t<<=8;
 302   1              t=t|a;
 303   1              tt=t*0.0625;
C51 COMPILER V7.50   LCM_T                                                                 12/08/2007 10:11:44 PAGE 6   

 304   1              t= tt*10+0.5; //放大10倍输出并四舍五入
 305   1              return(t);
 306   1      }
 307          /*****************************************************************************/
 308          //声明
 309          void lcm_w_ss(void);void lcm_w_mm(void);
 310          void lcm_w_hh(void);void lcm_w_dd(void);
 311          void lcm_w_mo(void);void lcm_w_yy(void);void lcm_w_xq(void);
 312          unsigned char clock_in(void);
 313          void clock_out(unsigned char dd);
 314          void Init_1302(void);
 315          unsigned char read_clock(unsigned char ord);
 316          void read_clockS(void);
 317          void Set_time(unsigned char sel);
 318          void write_clock(unsigned char ord, unsigned char dd);
 319          void updata (void);
 320          /*****************************************************************************/
 321          //常用时钟数据读取
 322          void read_clockS(void){
 323   1              ss = read_clock(0x81);//读取秒数据
 324   1              mm = read_clock(0x83);//读取分钟数据
 325   1              hh = read_clock(0x85);//小时
 326   1              dd = read_clock(0x87);//日
 327   1              mo = read_clock(0x89);//月
 328   1              xq = read_clock(0x8b);//星期
 329   1              yy = read_clock(0x8d);//年
 330   1      }
 331          /*****************************************************************************/
 332          //调时用加1程序
 333          void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
 334   1        signed char address,item;
 335   1        signed char max,mini;
 336   1        lcm_w_test(0,0x9a);
 337   1        lcm_w_word("调整");
 338   1        //if(sel==6)  {lcm_w_word("秒钟");address=0x80; max=0;mini=0;}     //秒7
 339   1        if(sel==5)  {lcm_w_word("分钟");address=0x82; max=59;mini=0;}    //分钟6
 340   1        if(sel==4)  {lcm_w_word("小时");address=0x84; max=23;mini=0;}    //小时5
 341   1        if(sel==3)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;}    //星期4  
 342   1        if(sel==2)  {lcm_w_word("日期");address=0x86; max=31;mini=1;}    //日3
 343   1        if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;}    //月2
 344   1        if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;}    //年1
 345   1        
 346   1        //读取1302某地址上的数值转换成10进制赋给item 
 347   1        item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
 348   1        if(KEY_2 == 0){
 349   2              item++;//数加 1  
 350   2        }
 351   1        if(KEY_4 == 0){
 352   2              item--;//数减 1 
 353   2        }
 354   1        if(item>max) item=mini;//查看数值有效范围   
 355   1        if(item<mini) item=max;           
 356   1        write_clock(0x8e,0x00);//允许写操作
 357   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 358   1        write_clock(0x8e,0x80);//写保护,禁止写操作 
 359   1        updata ();    //刷新数据
 360   1        lcm_w_mm();//刷新 分 
 361   1      }
 362          /*****************************************************************************/
 363          //设置1302的初始时间
 364          void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
 365   1              write_clock(0x8e,0x00);//允许写操作
C51 COMPILER V7.50   LCM_T                                                                 12/08/2007 10:11:44 PAGE 7   

 366   1      
 367   1              write_clock(0x8c,0x07);//年
 368   1              write_clock(0x8a,0x01);//星期
 369   1              write_clock(0x88,0x01);//月
 370   1              write_clock(0x86,0x01);//日
 371   1              write_clock(0x84,0x00);//小时
 372   1              write_clock(0x82,0x00);//分钟
 373   1              write_clock(0x80,0x00);//秒
 374   1              write_clock(0x90,0xa5);//充电   
 375   1              write_clock(0x8e,0x80);//禁止写操作
 376   1      }
 377          /*****************************************************************************/
 378          //DS1302写数据(底层协议)
 379          void write_clock(unsigned char ord, unsigned char dd){
 380   1              clock_clk=0;
 381   1              clock_Rst=0;
 382   1              clock_Rst=1;
 383   1              clock_out(ord);
 384   1              clock_out(dd);
 385   1              clock_Rst=0;
 386   1              clock_clk=1;
 387   1      }
 388          /*****************************************************************************/
 389          //1302驱动程序(底层协议)
 390          void clock_out(unsigned char dd){
 391   1              ACC=dd;
 392   1              clock_dat=a0; clock_clk=1; clock_clk=0;
 393   1              clock_dat=a1; clock_clk=1; clock_clk=0;
 394   1              clock_dat=a2; clock_clk=1; clock_clk=0;
 395   1              clock_dat=a3; clock_clk=1; clock_clk=0;
 396   1              clock_dat=a4; clock_clk=1; clock_clk=0;
 397   1              clock_dat=a5; clock_clk=1; clock_clk=0;
 398   1              clock_dat=a6; clock_clk=1; clock_clk=0;
 399   1              clock_dat=a7; clock_clk=1; clock_clk=0;
 400   1      }
 401          /*****************************************************************************/
 402          //DS1302写入字节(底层协议)
 403          unsigned char clock_in(void){
 404   1              clock_dat=1;
 405   1              a0=clock_dat;
 406   1              clock_clk=1; clock_clk=0; a1=clock_dat;
 407   1              clock_clk=1; clock_clk=0; a2=clock_dat;
 408   1              clock_clk=1; clock_clk=0; a3=clock_dat;
 409   1              clock_clk=1; clock_clk=0; a4=clock_dat;
 410   1              clock_clk=1; clock_clk=0; a5=clock_dat;
 411   1              clock_clk=1; clock_clk=0; a6=clock_dat;
 412   1              clock_clk=1; clock_clk=0; a7=clock_dat;
 413   1              return(ACC);
 414   1      }
 415          /*****************************************************************************/
 416          //DS1302读数据(底层协议)
 417          unsigned char read_clock(unsigned char ord){
 418   1              unsigned char dd=0;
 419   1              clock_clk=0;
 420   1              clock_Rst=0;
 421   1              clock_Rst=1;
 422   1              clock_out(ord);
 423   1              dd=clock_in();
 424   1              clock_Rst=0;
 425   1              clock_clk=1;
 426   1              return(dd);
 427   1      }
C51 COMPILER V7.50   LCM_T                                                                 12/08/2007 10:11:44 PAGE 8   

 428          /*****************************************************************************/
 429          //向LCM中填写 年 数据
 430          void lcm_w_yy(void){
 431   1              //if(read_clock(0x8d) != yy){
 432   1                      yy = read_clock(0x8d);
 433   1                      lcm_w_test(0,0x83);
 434   1                      lcm_w_word("20");
 435   1                      lcm_w_test(0,0x84);
 436   1                      lcm_w_test(1,(yy/16)+0x30);     
 437   1                      lcm_w_test(1,yy%16+0x30);
 438   1      }       //}
 439          /*****************************************************************************/
 440          //向LCM中填写 月 数据
 441          void lcm_w_mo(void){
 442   1              //if(read_clock(0x89) != mo){
 443   1                      mo = read_clock(0x89);
 444   1                      lcm_w_test(0,0x90);
 445   1                              if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);}     //十位消隐
 446   1                              else{lcm_w_test(1,0x20);}//同上                 
 447   1                      lcm_w_test(1,mo%16+0x30);
 448   1                      lcm_w_test(0,0x91);
 449   1                      lcm_w_word("月");
 450   1      }       //}
 451          /*****************************************************************************/
 452          //星期处理并送入LCM的指定区域
 453          void lcm_w_xq(void){
 454   1              unsigned char sel;
 455   1      
 456   1              //if(read_clock(0x8b) != xq){
 457   1              xq = read_clock(0x8b);
 458   1              sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
 459   1              lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)
 460   1              if(sel==7)  {lcm_w_word("日");}    //
 461   1              if(sel==6)  {lcm_w_word("六");}    //
 462   1              if(sel==5)  {lcm_w_word("五");}    //
 463   1              if(sel==4)  {lcm_w_word("四");}    //
 464   1              if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效
             -。
 465   1              if(sel==2)  {lcm_w_word("二");}    //
 466   1              if(sel==1)  {lcm_w_word("一");}    //星期一
 467   1              lcm_w_test(0,0x95);
 468   1              lcm_w_word("星期");

⌨️ 快捷键说明

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