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

📄 lcdc_040.lst

📁 新华龙公司的C8051F040的实验板BTF040的实验程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 446   1        SFRPAGE=temppage;
 447   1      }
 448          
 449          
 450          
 451           void spi_init()
 452          {
 453   1            SFRPAGE   = SPI0_PAGE;
 454   1            SPI0CFG   = 0x40;
 455   1            SPI0CN    = 0x01;
 456   1            SPI0CKR   = 0x6D;
 457   1      
 458   1      
 459   1      }
 460          
 461          
 462          
 463           void delay1us(void)
 464                  {
 465   1              uchar xdata i;
 466   1              for(i=10;i>0;i--);
 467   1              } 
 468          
 469          void writelcd(uchar spi_data)      //向LV595写数据以SPI方式
 470          {
 471   1        uint xdata i,j,k;
 472   1              for(i=0;i<9;i++);
 473   1              LcdCs=0;
 474   1              delay1us();     
 475   1              SPI_BUSY=1;
 476   1              SFRPAGE   = SPI0_PAGE;
 477   1              SPI0DAT=spi_data;
 478   1              for(j=0;j<500;j++)
 479   1                      {
 480   2                 if(!SPI_BUSY)break;
 481   2                      } 
 482   1              delay1us();
 483   1              
 484   1              LcdCs=1;
 485   1              delay1us();
 486   1              delay1us();
 487   1              delay1us();
 488   1              delay1us();
 489   1              delay1us();
C51 COMPILER V7.08   LCDC_040                                                              04/24/2008 15:54:41 PAGE 9   

 490   1              delay1us();
 491   1              for(k=0;k<5000;k++);
 492   1              
 493   1      /* **************************************************************************
 494   1       // 以下这段代码,是用IO口模拟SPI传输的程序
 495   1         LcdCs=0;
 496   1        for(i=0;i<8;i++)
 497   1        { SPICLK=0;
 498   1          if(spi_data&0x80)
 499   1                 spi_mosi=1;
 500   1          else 
 501   1                 spi_mosi=0;
 502   1          spi_data<<=1;
 503   1              SPICLK=1;
 504   1               for(j=0;j<10;j++)
 505   1               {_nop_();}
 506   1          SPICLK=0;
 507   1         }
 508   1         LcdCs=1;
 509   1      /***************************************************************************/
 510   1      }
 511          void writecode(uchar ins)                                   //向液晶控制模块写命令
 512               {
 513   1            uchar xdata t;
 514   1                uint xdata j;
 515   1              
 516   1                for(j=0;j<500;j++);   
 517   1                virt_port|=ins&0xf0;                                  //取高字节向1602写数据 
 518   1                writelcd(virt_port);                                  //先写高4位后再写低4位 这是在选择四个数据线的时候
 519   1           
 520   1                virt_port|=0x08;                                                
 521   1                writelcd(virt_port);                                  //使能E脚为高电平
 522   1            virt_port&=~0x08;                                 
 523   1                writelcd(virt_port);                                  //使能E脚为低电平
 524   1      
 525   1            t=ins<<4;             
 526   1            virt_port|=t&0xf0;                                //取低字节向1602写数据
 527   1                writelcd(virt_port);
 528   1            virt_port|=0x08;                                          //使能E脚为高电平
 529   1                writelcd(virt_port);
 530   1            virt_port&=~0x08;                                     //使能E脚为低电平
 531   1                writelcd(virt_port);
 532   1            virt_port=0;
 533   1                writelcd(virt_port);
 534   1           }
 535          
 536          void writedata(uchar d)                                    //写数据到1602
 537               {
 538   1            uchar xdata i,t;
 539   1                uint xdata j;
 540   1                
 541   1            for(j=0;j<500;j++);               
 542   1            virt_port|=0x02;                                     //光标返回指令
 543   1                writelcd(virt_port);
 544   1            virt_port|=d&0xf0;                                   //取高字节数据给数据寄存器
 545   1                writelcd(virt_port);
 546   1            virt_port|=0x08;                     //使能E脚为高电平
 547   1                writelcd(virt_port);
 548   1            virt_port&=0xf7;                             //使能E脚为低电平
 549   1                writelcd(virt_port);
 550   1            virt_port&=0x07;                                     //设置光标右移,文字也右移
 551   1            writelcd(virt_port);
C51 COMPILER V7.08   LCDC_040                                                              04/24/2008 15:54:41 PAGE 10  

 552   1                     
 553   1            t=d&0x0f;
 554   1            virt_port|=t<<4;                                     //取低字节数据给数据寄存器
 555   1                writelcd(virt_port);
 556   1      
 557   1                virt_port|=0x08;                                 //使能E脚为高电平
 558   1                writelcd(virt_port);
 559   1            for(i=3;i>0;i--); 
 560   1            virt_port&=0xf7;                     //使能E脚为低电平
 561   1                writelcd(virt_port);
 562   1            virt_port=0;                                                 //数据清零
 563   1                writelcd(virt_port);
 564   1          }
 565          
 566           void lcdchar (void)
 567               {
 568   1           uint xdata i,j,k;
 569   1           for(j=0;j<5000;j++);                  //数据读、写操作,画面不动
 570   1           for(k=0;k<5000;k++);
 571   1        
 572   1           for(i=0;i<8;i++)
 573   1               {
 574   2             writedata(rdata[i]);
 575   2             for(j=0;j<1000;j++);
 576   2             for(k=0;k<1000;k++);
 577   2             for(k=0;k<5000;k++);
 578   2             for(k=0;k<1000;k++);
 579   2                 for(k=0;k<5000;k++);
 580   2                 for(k=0;k<5000;k++);
 581   2                 for(k=0;k<5000;k++);
 582   2               
 583   2            }
 584   1                                              
 585   1        
 586   1          
 587   1         
 588   1           }
 589          
 590          
 591          void lcdinit()
 592          {
 593   1           uint xdata i;
 594   1              
 595   1            virt_port=0x00;
 596   1                writelcd(virt_port);       //RS脚为零写指令寄存器      RW为低电平
 597   1            virt_port|=0x08;               //使能脚E=1
 598   1                writelcd(virt_port);
 599   1                virt_port&=0xf7;               //使E=0使能脚发生跳变高--低
 600   1                writelcd(virt_port);
 601   1                for(i=1000;i>0;i--);       //3次延时,重要!
 602   1                for(i=8000;i>0;i--);           //用延时代替查询         
 603   1      
 604   1          
 605   1            virt_port=0;                               //写入20码,设置为4位总线方式,非常重要!!!!!
 606   1                writelcd(virt_port);
 607   1            virt_port|=0x20;                   //只写高字节
 608   1                writelcd(virt_port);
 609   1            virt_port|=0x08;           //E=1
 610   1                writelcd(virt_port);
 611   1                for(i=20;i>0;i--);             //使命令执行
 612   1            virt_port&=0xf7;           //E=0
 613   1                writelcd(virt_port);
C51 COMPILER V7.08   LCDC_040                                                              04/24/2008 15:54:41 PAGE 11  

 614   1                for(i=10;i>0;i--);
 615   1            virt_port=0;
 616   1                writelcd(virt_port);
 617   1               
 618   1               
 619   1      
 620   1            writecode(0x38);          //设两行显示,4线方式5*10字符显示
 621   1            for(i=50;i>0;i--);
 622   1                  writecode(0x06);                    //光标右移
 623   1            for(i=50;i>0;i--);
 624   1               
 625   1                
 626   1                writecode(0x0c);                  //开显示指令
 627   1            for(i=50;i>0;i--);
 628   1            
 629   1               
 630   1            writecode(0x02);                  //光标返回指令
 631   1            for(i=50;i>0;i--);
 632   1                 
 633   1          
 634   1               
 635   1                writecode(0x01);                      //清屏指令
 636   1                for(i=50;i>0;i--);
 637   1      }
 638          
 639          void spi_srs  () interrupt 6
 640          {
 641   1              if(SPIF)                
 642   1                      {
 643   2                SFRPAGE   = SPI0_PAGE;
 644   2                SPIF=0;
 645   2      
 646   2                      SPI_BUSY=0;
 647   2                      }
 648   1                      
 649   1      
 650   1              if(WCOL)
 651   1                      {
 652   2                 SFRPAGE   = SPI0_PAGE;
 653   2                      WCOL=0;
 654   2                      }
 655   1      
 656   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1701    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     17      22
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5      10
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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