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

📄 ds1307.lst

📁 这是8051单片机模拟IIC总线
💻 LST
📖 第 1 页 / 共 3 页
字号:
 268   3                              {
 269   4                                      v = 15;
 270   4                                      lcd_dis_num(v);
 271   4                                      break;
 272   4                              }
 273   3                              default:
 274   3      //                      case 16:
 275   3                              {
 276   4                                      v = 16;
 277   4                                      lcd_dis_num(v);
 278   4                                      break;
 279   4                              }
 280   3                      }
 281   2      
 282   2      
 283   2              }
 284   1      }
 285          
 286          
 287          void lcd_ini()
 288          {
 289   1              delay(100);
 290   1              lcd_wrc(0x34);
 291   1              lcd_wrc(0x30);
 292   1              lcd_wrc(0x01);
 293   1              lcd_wrc(0x06);
 294   1              lcd_wrc(0x0c);
 295   1              delay(100);
 296   1      }       
 297          void lcd_wrc(uchar com)
 298          {
 299   1              lcd_checkbusy();
 300   1              rs = 0;
 301   1              rw = 0;
 302   1              e = 1;
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 6   

 303   1              P0 = com;       
 304   1              P0 = com;
 305   1              delay(10);
 306   1              e = 0;
 307   1      }
 308          
 309          void lcd_wrd(uchar dat)
 310          {
 311   1              lcd_checkbusy();
 312   1              rs = 1;
 313   1              rw = 0;
 314   1              e = 1;
 315   1              P0 = dat;
 316   1              P0 = dat;
 317   1              delay(5);
 318   1              e = 0;
 319   1      }
 320          void lcd_checkbusy()
 321          {
 322   1              uchar busy;
 323   1              P0 = 0XFF;
 324   1              busy = P0;
 325   1              if(busy>0x7f)
 326   1              {
 327   2                      rs = 0;
 328   2                      rw = 1;
 329   2                      e = 1;
 330   2                      busy = P0;
 331   2                      e = 0;
 332   2                      delay(10);
 333   2              }
 334   1      }
 335          uchar lcd_rdd();
 336          void delay(uchar n)
 337          {
 338   1              while(n--);
 339   1      }
 340          void lcd_on()
 341          {
 342   1              lcd_deng = 0;
 343   1      }
 344          void lcd_off()
 345          {
 346   1              lcd_deng = 1;
 347   1      }
 348          uchar lcd_read_ac()
 349          {
 350   1              uchar dat;
 351   1      //      P0 = 0X00;
 352   1              rs = 0;
 353   1              rw = 1;
 354   1              e = 1;
 355   1              dat = P0;
 356   1              dat = P0;
 357   1              e = 0;
 358   1              return(dat&0x7f);
 359   1      }
 360          void lcd_dis_num(uint dat)
 361          {
 362   1          uint a=0;
 363   1          dat =dat%10000;
 364   1          a =dat/1000;
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 7   

 365   1          lcd_wrd(0x30+a);
 366   1          dat =dat%1000;
 367   1          a =dat/100;
 368   1          lcd_wrd(0x30+a);
 369   1          dat =dat%100;
 370   1          a=dat/10;
 371   1          lcd_wrd(0x30+a);
 372   1          dat =dat%10;
 373   1          lcd_wrd(0x30+dat);
 374   1      }
 375          void lcd_dis_ch(uchar h,uchar l)
 376          {
 377   1          lcd_wrd(h);
 378   1          lcd_wrd(l);
 379   1      }
 380          
 381          void lcd_add(uchar h,uchar l)       //定位地址
 382          {
 383   1        l--;
 384   1        switch(h)
 385   1        {
 386   2          case 1:
 387   2          {
 388   3            lcd_wrc(0x80+l);
 389   3            break;
 390   3          }
 391   2          case 2:
 392   2          {
 393   3            lcd_wrc(0x90+l);
 394   3            break;
 395   3          }
 396   2          case 3:
 397   2          {
 398   3            lcd_wrc(0x88+l);
 399   3            break;
 400   3          }
 401   2          case 4:
 402   2          {
 403   3            lcd_wrc(0x98+l);
 404   3            break;
 405   3          }
 406   2        }
 407   1      }
 408          
 409          
 410          unsigned char key_data()      //判断键值
 411          {
 412   1              uchar a=0,b=0,c=0,d=0,i=0;
 413   1              a = 0xef;
 414   1              for(i = 0;i<4;i++)      //读行
 415   1              {
 416   2                  P1 = a;
 417   2                      delay(10);
 418   2                  b = P1;
 419   2                      b = b&0x0f;
 420   2      //      b = b>>4;
 421   2                  if(b!=0x0F)   //表示有键按下
 422   2              {
 423   3                              delay(200);   //软件延时   确认有键按下
 424   3                              b = P1&0X0F;
 425   3      //              b = b>>4;
 426   3                      if(b != 0x0F)
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 8   

 427   3                      {  
 428   4      //                      return b;
 429   4      
 430   4                                      c=b;
 431   4                              if(c==0X07)
 432   4                              {
 433   5                                      d=i*4+3;
 434   5                              }
 435   4                              else if(c==0X0B)
 436   4                              {
 437   5                                      d=i*4+2;
 438   5                              }
 439   4                              else if(c==0X0D)
 440   4                              {
 441   5                                      d=i*4+1;
 442   5                              }
 443   4                              else if(c==0X0E)
 444   4                              {
 445   5                                      d=i*4;
 446   5                              }
 447   4                                  break;
 448   4                              }
 449   3                      }
 450   2              else
 451   2                  {
 452   3                      a = a<<1;
 453   3                              a = a+0x01;
 454   3                      if(a==0xFF)
 455   3                      {
 456   4      //                      return 0x0f;
 457   4                                      d = 0x0f+1;
 458   4                                      break;
 459   4                      }
 460   3              }
 461   2              }
 462   1      //      d=d-1;
 463   1              return d;
 464   1      
 465   1      
 466   1      
 467   1      }
 468          
 469          
 470          /*******************************************************************
 471                               起动总线函数               
 472          函数原型: void  Start_I2c();  
 473          功能:       启动I2C总线,即发送I2C起始条件.
 474            
 475          ********************************************************************/
 476          
 477          void Start_I2c()                //起动总线函数
 478          {
 479   1              SDA=1;   //发送起始条件的数据信号
 480   1              _Nop();
 481   1              SCL=1;
 482   1              _Nop();    //起始条件建立时间大于4.7us,延时
 483   1              _Nop();
 484   1              _Nop();
 485   1              _Nop();
 486   1              _Nop();    
 487   1              SDA=0;   //发送起始信号
 488   1              _Nop();    // 起始条件锁定时间大于4
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 9   

 489   1              _Nop();
 490   1              _Nop();
 491   1              _Nop();
 492   1              _Nop();       
 493   1              SCL=0;   //钳住I2C总线,准备发送或接收数据 
 494   1              _Nop();
 495   1              _Nop();
 496   1      }
 497          
 498          
 499          
 500          /*******************************************************************
 501                                结束总线函数               
 502          函数原型: void  Stop_I2c();  
 503          功能:       结束I2C总线,即发送I2C结束条件.
 504            
 505          ********************************************************************/
 506          void Stop_I2c()         //结束总线函数
 507          {
 508   1              SDA=0;  /*发送结束条件的数据信号*/
 509   1              _Nop();   /*发送结束条件的时钟信号*/
 510   1              SCL=1;  /*结束条件建立时间大于4*/
 511   1              _Nop();
 512   1              _Nop();
 513   1              _Nop();
 514   1              _Nop();
 515   1              _Nop();
 516   1              SDA=1;  /*发送I2C总线结束信号*/
 517   1              _Nop();
 518   1              _Nop();
 519   1              _Nop();
 520   1              _Nop();
 521   1      }
 522          
 523          
 524          
 525          
 526          /*******************************************************************
 527                           字节数据传送函数               
 528          函数原型: void  SendByte(uchar c);
 529          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 530               此状态位进行操作.(不应答或非应答都使ack=0 假)     
 531               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 532          ********************************************************************/
 533          void  SendByte(uchar c)         //字节数据传送函数send
 534          {
 535   1              uchar BitCnt;
 536   1              for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
 537   1          {
 538   2              if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
 539   2              else  SDA=0;                
 540   2              _Nop();
 541   2              SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
 542   2              _Nop(); 
 543   2              _Nop();               /*保证时钟高电平周期大于4*/
 544   2              _Nop();

⌨️ 快捷键说明

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