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

📄 lcdc_040.lst

📁 c8051f040实验程序含CAN SMBUS IIC
💻 LST
字号:
C51 COMPILER V8.02   LCDC_040                                                              03/02/2007 17:13:27 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCDC_040
OBJECT MODULE PLACED IN lcdc_040.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcdc_040.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "C8051F040.h"
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          
   5          uchar xdata virt_port;
   6          bit SPI_BUSY;
   7          unsigned char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x30,0x34,0x30,0x20,0x56,0x31,0x2e,0x30
   8                                      ,0x20,0x20};
   9          unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
  10                                          0x6d,0x2e,0x63,0x6e,0x20,0x20}; 
  11          sbit LcdCs=P2^5;
  12          void os_init();
  13          void port_init();
  14          void spi_init();
  15          void writecode(uchar ins);
  16          void writedata(uchar d);
  17          void lcdchar (void);
  18          void lcdinit();
  19          void writelcd(uchar spi_data);
  20          void main()
  21          {  
  22   1          WDTCN = 0xDE;                                           // 关闭看门狗
  23   1              WDTCN = 0xAD;
  24   1              os_init();
  25   1          port_init();
  26   1              spi_init();
  27   1                SFRPAGE   = CONFIG_PAGE;
  28   1               EIE1      = 0x01;
  29   1               EA=1;
  30   1         while(1)
  31   1         {
  32   2       
  33   2         
  34   2         lcdinit();
  35   2         lcdchar();
  36   2         }
  37   1      
  38   1      }
  39          void os_init()
  40          {
  41   1          int i = 0;
  42   1          SFRPAGE   = CONFIG_PAGE;
  43   1          OSCXCN    = 0x67;                                                                   //外部22.1184M晶振
  44   1          for (i = 0; i < 3000; i++);                         //等待外部晶振稳定 
  45   1          while ((OSCXCN & 0x80) == 0);
  46   1          CLKSEL    = 0x01;                                                                   //系统时钟不分频
  47   1      }
  48          void port_init()
  49          {
  50   1          SFRPAGE   = CONFIG_PAGE;
  51   1              P0MDOUT=0xff;
  52   1          XBR0      = 0x06;
  53   1          XBR2      = 0x40;
  54   1      
  55   1      }
C51 COMPILER V8.02   LCDC_040                                                              03/02/2007 17:13:27 PAGE 2   

  56          void spi_init()
  57          {
  58   1            SFRPAGE   = SPI0_PAGE;
  59   1            SPI0CFG   = 0x40;
  60   1            SPI0CN    = 0x01;
  61   1            SPI0CKR   = 0x6D;
  62   1      
  63   1      
  64   1      }
  65          
  66          
  67          
  68           void delay1us(void)
  69                  {
  70   1              uchar xdata i;
  71   1              for(i=10;i>0;i--);
  72   1              } 
  73          
  74          void writelcd(uchar spi_data)      //向LV595写数据以SPI方式
  75          {
  76   1        uint xdata i,j,k;
  77   1              for(i=0;i<9;i++);
  78   1              LcdCs=0;
  79   1              delay1us();     
  80   1              SPI_BUSY=1;
  81   1              SFRPAGE   = SPI0_PAGE;
  82   1              SPI0DAT=spi_data;
  83   1              for(j=0;j<500;j++)
  84   1                      {
  85   2                 if(!SPI_BUSY)break;
  86   2                      } 
  87   1              delay1us();
  88   1              
  89   1              LcdCs=1;
  90   1              delay1us();
  91   1              delay1us();
  92   1              delay1us();
  93   1              delay1us();
  94   1              delay1us();
  95   1              delay1us();
  96   1              for(k=0;k<5000;k++);
  97   1              
  98   1      /* **************************************************************************
  99   1       // 以下这段代码,是用IO口模拟SPI传输的程序
 100   1         LcdCs=0;
 101   1        for(i=0;i<8;i++)
 102   1        { SPICLK=0;
 103   1          if(spi_data&0x80)
 104   1                 spi_mosi=1;
 105   1          else 
 106   1                 spi_mosi=0;
 107   1          spi_data<<=1;
 108   1              SPICLK=1;
 109   1               for(j=0;j<10;j++)
 110   1               {_nop_();}
 111   1          SPICLK=0;
 112   1         }
 113   1         LcdCs=1;
 114   1      /***************************************************************************/
 115   1      }
 116          void writecode(uchar ins)                                   //向液晶控制模块写命令
 117               {
C51 COMPILER V8.02   LCDC_040                                                              03/02/2007 17:13:27 PAGE 3   

 118   1            uchar xdata t;
 119   1                uint xdata j;
 120   1              
 121   1                for(j=0;j<500;j++);   
 122   1                virt_port|=ins&0xf0;                                  //取高字节向1602写数据 
 123   1                writelcd(virt_port);                                  //先写高4位后再写低4位 这是在选择四个数据线的时候
 124   1           
 125   1                virt_port|=0x08;                                                
 126   1                writelcd(virt_port);                                  //使能E脚为高电平
 127   1            virt_port&=~0x08;                                 
 128   1                writelcd(virt_port);                                  //使能E脚为低电平
 129   1      
 130   1            t=ins<<4;             
 131   1            virt_port|=t&0xf0;                                //取低字节向1602写数据
 132   1                writelcd(virt_port);
 133   1            virt_port|=0x08;                                          //使能E脚为高电平
 134   1                writelcd(virt_port);
 135   1            virt_port&=~0x08;                                     //使能E脚为低电平
 136   1                writelcd(virt_port);
 137   1            virt_port=0;
 138   1                writelcd(virt_port);
 139   1           }
 140          
 141          void writedata(uchar d)                                    //写数据到1602
 142               {
 143   1            uchar xdata i,t;
 144   1                uint xdata j;
 145   1                
 146   1            for(j=0;j<500;j++);               
 147   1            virt_port|=0x02;                                     //光标返回指令
 148   1                writelcd(virt_port);
 149   1            virt_port|=d&0xf0;                                   //取高字节数据给数据寄存器
 150   1                writelcd(virt_port);
 151   1            virt_port|=0x08;                     //使能E脚为高电平
 152   1                writelcd(virt_port);
 153   1            virt_port&=0xf7;                             //使能E脚为低电平
 154   1                writelcd(virt_port);
 155   1            virt_port&=0x07;                                     //设置光标右移,文字也右移
 156   1            writelcd(virt_port);
 157   1                     
 158   1            t=d&0x0f;
 159   1            virt_port|=t<<4;                                     //取低字节数据给数据寄存器
 160   1                writelcd(virt_port);
 161   1      
 162   1                virt_port|=0x08;                                 //使能E脚为高电平
 163   1                writelcd(virt_port);
 164   1            for(i=3;i>0;i--); 
 165   1            virt_port&=0xf7;                     //使能E脚为低电平
 166   1                writelcd(virt_port);
 167   1            virt_port=0;                                                 //数据清零
 168   1                writelcd(virt_port);
 169   1          }
 170          
 171           void lcdchar (void)
 172               {
 173   1           uint xdata i,j,k;
 174   1           for(j=0;j<5000;j++);                  //数据读、写操作,画面不动
 175   1           for(k=0;k<5000;k++);
 176   1        
 177   1           for(i=0;i<16;i++)
 178   1               {
 179   2             writedata(tab1[i]);
C51 COMPILER V8.02   LCDC_040                                                              03/02/2007 17:13:27 PAGE 4   

 180   2             for(j=0;j<1000;j++);
 181   2             for(k=0;k<1000;k++);
 182   2             for(k=0;k<5000;k++);
 183   2             for(k=0;k<1000;k++);
 184   2                 for(k=0;k<5000;k++);
 185   2                 for(k=0;k<5000;k++);
 186   2                 for(k=0;k<5000;k++);
 187   2               
 188   2            }
 189   1                                              
 190   1        
 191   1            writecode(0xb0);                       // 换行                   
 192   1            for(j=0;j<5000;j++);                                        
 193   1            for(k=0;k<5000;k++);
 194   1       
 195   1           for(i=0;i<16;i++)
 196   1           {
 197   2                 writedata(Netdata[i]);
 198   2             for(j=0;j<5000;j++)      delay1us();
 199   2             for(k=0;k<5000;k++);
 200   2             for(k=0;k<5000;k++);
 201   2                 for(k=0;k<5000;k++);
 202   2                 for(k=0;k<5000;k++);
 203   2                 
 204   2                                
 205   2            };
 206   1         
 207   1           }
 208          
 209          
 210          void lcdinit()
 211          {
 212   1           uint xdata i;
 213   1              
 214   1            virt_port=0x00;
 215   1                writelcd(virt_port);       //RS脚为零写指令寄存器      RW为低电平
 216   1            virt_port|=0x08;               //使能脚E=1
 217   1                writelcd(virt_port);
 218   1                virt_port&=0xf7;               //使E=0使能脚发生跳变高--低
 219   1                writelcd(virt_port);
 220   1                for(i=1000;i>0;i--);       //3次延时,重要!
 221   1                for(i=8000;i>0;i--);           //用延时代替查询         
 222   1      
 223   1          
 224   1            virt_port=0;                               //写入20码,设置为4位总线方式,非常重要!!!!!
 225   1                writelcd(virt_port);
 226   1            virt_port|=0x20;                   //只写高字节
 227   1                writelcd(virt_port);
 228   1            virt_port|=0x08;           //E=1
 229   1                writelcd(virt_port);
 230   1                for(i=20;i>0;i--);             //使命令执行
 231   1            virt_port&=0xf7;           //E=0
 232   1                writelcd(virt_port);
 233   1                for(i=10;i>0;i--);
 234   1            virt_port=0;
 235   1                writelcd(virt_port);
 236   1               
 237   1               
 238   1      
 239   1            writecode(0x38);          //设两行显示,4线方式5*10字符显示
 240   1            for(i=50;i>0;i--);
 241   1                  writecode(0x06);                    //光标右移
C51 COMPILER V8.02   LCDC_040                                                              03/02/2007 17:13:27 PAGE 5   

 242   1            for(i=50;i>0;i--);
 243   1               
 244   1                
 245   1                writecode(0x0c);                  //开显示指令
 246   1            for(i=50;i>0;i--);
 247   1            
 248   1               
 249   1            writecode(0x02);                  //光标返回指令
 250   1            for(i=50;i>0;i--);
 251   1                 
 252   1          
 253   1               
 254   1                writecode(0x01);                      //清屏指令
 255   1                for(i=50;i>0;i--);
 256   1      }
 257          
 258          void spi_srs  () interrupt 6
 259          {
 260   1              if(SPIF)                
 261   1                      {
 262   2                SFRPAGE   = SPI0_PAGE;
 263   2                SPIF=0;
 264   2      
 265   2                      SPI_BUSY=0;
 266   2                      }
 267   1                      
 268   1      
 269   1              if(WCOL)
 270   1                      {
 271   2                 SFRPAGE   = SPI0_PAGE;
 272   2                      WCOL=0;
 273   2                      }
 274   1      
 275   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1557    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     33      22
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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