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

📄 pcf8591-da-lcd1602-c51.lst

📁 RZ-51V20 实例程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 322          // 返回接收的数据
 323          // 函数功能: 接收一字节子程序
 324          //-------------------------------------------------------------------
 325          uchar IICreceiveByte(void)
 326          {
 327   1              uchar idata n=8;     // 从SDA线上读取一上数据字节,共八位
 328   1              uchar tdata=0;
 329   1              while(n--)
 330   1              {
 331   2                 SDA = 1;
 332   2                 SCL = 1;
 333   2                 tdata =tdata<<1;                 //左移一位
 334   2                      if(SDA == 1)
 335   2                        tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
 336   2                      else
 337   2                        tdata = tdata&0xfe;   // 否则数据的最后一位置0
 338   2                 SCL = 0;
 339   2               }
 340   1      
 341   1               return(tdata);
 342   1      }
 343          //-------------------------------------------------------------------
 344          // 函数名称: DAC_PCF8591
 345          // 入口参数: slave_add从机地址,n要发送的数据个数
 346          // 函数功能: 发送n位数据子程序
 347          //-------------------------------------------------------------------
 348          void DAC_PCF8591(uchar controlbyte)
 349          {
 350   1      
 351   1              iic_start();                    // 启动I2C
 352   1              delayNOP();
 353   1      
 354   1              IICSendByte(PCF8591_WRITE);     // 发送地址位
 355   1              check_ACK();                    // 检查应答位
 356   1          if(flag == 1)
 357   1               {
 358   2                      SystemError = 1;
 359   2                      return;                     // 若非应答,置错误标志位
 360   2           }
 361   1          IICSendByte(controlbyte&0x77);      //Control byte
 362   1              check_ACK();                    //检查应答位
 363   1          if(flag == 1)
 364   1               {
 365   2                      SystemError = 1;
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 7   

 366   2                      return;                    // 若非应答,置错误标志位
 367   2               }
 368   1      }
 369          
 370          //-------------------------------------------------------------------
 371          // 函数名称: ADC_PCF8591
 372          // 入口参数: controlbyte控制字
 373          // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
 374          //-------------------------------------------------------------------
 375          /*
 376          void ADC_PCF8591(uchar controlbyte)
 377          {
 378              uchar idata i; //,receive_da;
 379          
 380                  iic_start();
 381          
 382                  IICSendByte(PCF8591_WRITE);     //控制字
 383                  check_ACK();
 384                  if(flag == 1)
 385                  {
 386                          SystemError = 1;
 387                          return;
 388                  }
 389          
 390                  IICSendByte(controlbyte);       //控制字
 391                  check_ACK();
 392                  if(flag == 1)
 393                  {
 394                          SystemError = 1;
 395                          return;
 396                  }
 397          
 398              iic_start();                //重新发送开始命令
 399                  IICSendByte(PCF8591_READ);      //控制字
 400                  check_ACK();
 401                  if(flag == 1)
 402                  {
 403                          SystemError = 1;
 404                          return;
 405                  }
 406          
 407              IICreceiveByte();   //空读一次,调整读顺序
 408              slave_ACK();        //收到一个字节后发送一个应答位
 409          
 410          //      while(i<4)
 411                  for(i=0;i<4;i++)
 412                  {
 413                  //  receive_da=IICreceiveByte();
 414                  //  receivebuf[i]=receive_da;
 415                receivebuf[i] = IICreceiveByte();
 416                    slave_ACK();       //收到一个字节后发送一个应答位
 417                  }
 418                  slave_NOACK();       //收到最后一个字节后发送一个非应答位
 419                  iic_stop();
 420          }*/
 421          
 422          /*********************************************************
 423            输出三角波
 424          *********************************************************/
 425          void  Triangle()
 426          {
 427   1          uchar l;
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 8   

 428   1          for(l=0;l<255;l++)
 429   1               { 
 430   2                 IICSendByte(l);             //data byte
 431   2                 check_ACK();            //检查应答位
 432   2             if(flag == 1)
 433   2                 {
 434   3                      SystemError = 1;
 435   3              return;               //置错误标志位SystemError
 436   3                 }
 437   2               }
 438   1      
 439   1            for(l=255;l>1;l--)
 440   1               { 
 441   2                 IICSendByte(l);             //data byte
 442   2                 check_ACK();            //检查应答位
 443   2             if(flag == 1)
 444   2                 {
 445   3                      SystemError = 1;
 446   3              return;               //置错误标志位SystemError
 447   3                 }
 448   2               }
 449   1      }
 450          
 451          /*********************************************************
 452            输出方波函数
 453          *********************************************************/
 454          void  Square()
 455          {
 456   1           IICSendByte(N);         //data byte
 457   1               check_ACK();            //检查应答位
 458   1           if(flag == 1)
 459   1               {
 460   2                 SystemError = 1;
 461   2             return;               //置错误标志位SystemError
 462   2               }
 463   1            delay(15);
 464   1                N=~N;
 465   1      }
 466          
 467          /*********************************************************
 468            输出正弦波函数
 469          *********************************************************/
 470          void  sin()
 471          {
 472   1        uint i;
 473   1        for(i=0; i<256; i++)
 474   1        {
 475   2          IICSendByte(sin_tab[i]);      //data byte
 476   2              check_ACK();                  //检查应答位
 477   2          if(flag == 1)
 478   2               {
 479   3                 SystemError = 1;
 480   3             return;                    //置错误标志位SystemError
 481   3               }
 482   2        }
 483   1      
 484   1      }
 485          
 486          /*********************************************************
 487            输出锯齿波函数
 488          *********************************************************/
 489          void  Sawtooth()
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 9   

 490          {
 491   1        uchar l;
 492   1          for(l=0;l<255;l++)
 493   1               { 
 494   2                 IICSendByte(l);             //data byte
 495   2                 check_ACK();            //检查应答位
 496   2             if(flag == 1)
 497   2                 {
 498   3                      SystemError = 1;
 499   3              return;                //置错误标志位SystemError
 500   3                 }
 501   2               }
 502   1      }
 503          
 504          /*********************************************************
 505            功能健函数
 506          *********************************************************/
 507          void  keyscan()
 508          {
 509   1         uchar m;
 510   1         if((K2==0)&(!START))       //启动输出后,屏蔽K2健
 511   1         {
 512   2           k_count++;
 513   2           beep();   
 514   2           switch (k_count)
 515   2           {
 516   3              case 1: 
 517   3              lcd_pos(0x00);
 518   3                  for(m=0;m<16;m++)
 519   3              lcd_wdat(dis2[m]);
 520   3           
 521   3              lcd_pos(0x40);
 522   3                  for(m=0;m<16;m++)
 523   3              lcd_wdat(dis5[m]);
 524   3              out1=1;
 525   3                      out4=0;
 526   3              break;
 527   3        
 528   3              case 2: 
 529   3              lcd_pos(0x40);
 530   3                  for(m=0;m<16;m++)
 531   3              lcd_wdat(dis6[m]); 
 532   3              out1=0;
 533   3                      out2=1;
 534   3              break;
 535   3            
 536   3                      case 3: 
 537   3              lcd_pos(0x40);
 538   3                  for(m=0;m<16;m++)
 539   3              lcd_wdat(dis7[m]);
 540   3                      out2=0;
 541   3                      out3=1;
 542   3           
 543   3              break;
 544   3      
 545   3              case 4: 
 546   3              lcd_pos(0x40);
 547   3                  for(m=0;m<16;m++)
 548   3              lcd_wdat(dis8[m]);
 549   3              k_count=0;
 550   3              out3=0;
 551   3                      out4=1;
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 10  

 552   3              break;
 553   3           
 554   3              default:  
 555   3              out4=0; out3=0; out2=0; out1=0;
 556   3              break;
 557   3           }   
 558   2         }
 559   1         
 560   1          if(K3==0)        //启动输出
 561   1              {
 562   2                 START=1;
 563   2                 beep();
 564   2              }
 565   1      
 566   1              if(K4==0)       //停止输出
 567   1              {
 568   2                 START=0;
 569   2                 beep();
 570   2              }
 571   1      }
 572          
 573          /*******************************************************************/
 574          /*                                                                 */
 575          /*  主函数                                                         */
 576          /*                                                                 */
 577          /*******************************************************************/
 578          main()
 579          {
 580   1          uchar i;
 581   1          delay(10);                 //延时
 582   1          lcd_init();                //初始化LCD
 583   1      
 584   1          lcd_pos(0);                //设置显示位置为第一行
 585   1          for(i=0;i<16;i++) 
 586   1          lcd_wdat(dis1[i]);         //显示字符
 587   1       
 588   1      
 589   1          lcd_pos(0x40);             //设置显示位置为第二行
 590   1          for(i=0;i<16;i++)
 591   1          lcd_wdat(dis2[i]);         //显示字符
 592   1      
 593   1          delay(1500);
 594   1      
 595   1          lcd_pos(0);                //设置显示位置为第一行
 596   1          for(i=0;i<16;i++) 
 597   1          lcd_wdat(dis3[i]);         //显示字符
 598   1       
 599   1          lcd_pos(0x40);             //设置显示位置为第二行
 600   1          for(i=0;i<16;i++)
 601   1          lcd_wdat(dis4[i]);         //显示字符
 602   1      
 603   1              DAC_PCF8591(0x40);
 604   1        
 605   1              while(1)
 606   1          {
 607   2                 keyscan();
 608   2               
 609   2                 while(out1&START)
 610   2                 {
 611   3               sin();              //输出正弦波
 612   3               keyscan();
 613   3                 }
C51 COMPILER V8.18   PCF8591_DA_LCD1602_C51                                                01/04/2010 16:31:41 PAGE 11  

 614   2      
 615   2             while(out2&START)
 616   2                 {
 617   3               Square();           //输出方波
 618   3               keyscan();
 619   3                 }
 620   2      
 621   2                 while(out3&START) 
 622   2                 {
 623   3               Triangle();        //输出三角波
 624   3               keyscan();
 625   3                 }
 626   2            
 627   2                  while(out4&START)
 628   2                 {
 629   3               Sawtooth();        //输出锯齿波
 630   3               keyscan();
 631   3                 }    
 632   2          }
 633   1      }
 634          
 635          //*********************************************************


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    882    ----
   CONSTANT SIZE    =    392    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       1
   IDATA SIZE       =      4       2
   BIT SIZE         =      7       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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