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

📄 key_040.lst

📁 c8051f040实验程序含CAN SMBUS IIC
💻 LST
字号:
C51 COMPILER V7.50   KEY_040                                                               12/05/2006 14:13:35 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE KEY_040
OBJECT MODULE PLACED IN key_040.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe key_040.c DB OE

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          
   8          unsigned char xdata tab1[8]={0x53,0x31,0x53,0x32,0x53,0x33,0x53,0x34};
   9          sbit key1=P2^0;
  10          sbit key2=P2^1;
  11          sbit key3=P2^2;
  12          sbit key4=P2^3;
  13          sbit LcdCs=P2^5;
  14          void os_init();
  15          void port_init();
  16          void spi_init();
  17          void writecode(uchar ins);
  18          void writedata(uchar d);
  19          void lcdchar (uchar da);
  20          void lcdinit();
  21          void writelcd(uchar spi_data);
  22          void delay(uint d);
  23          void main()
  24          {  
  25   1          WDTCN = 0xDE;                                           // 关闭看门狗
  26   1              WDTCN = 0xAD;
  27   1              os_init();
  28   1          port_init();
  29   1              spi_init();
  30   1                SFRPAGE   = CONFIG_PAGE;
  31   1               EIE1      = 0x01;
  32   1               EA=1;
  33   1         while(1)
  34   1         {
  35   2         if(key1==0)
  36   2         { 
  37   3         delay(2000); 
  38   3         lcdinit();
  39   3         lcdchar(6);
  40   3              }
  41   2              if(key2==0)
  42   2              { delay(2000); 
  43   3            lcdinit();
  44   3            lcdchar(4);
  45   3         }
  46   2        if(key3==0)
  47   2              { delay(2000); 
  48   3            lcdinit();
  49   3            lcdchar(2);
  50   3         }
  51   2         if(key4==0)
  52   2              { delay(2000); 
  53   3            lcdinit();
  54   3            lcdchar(0);
  55   3         }
C51 COMPILER V7.50   KEY_040                                                               12/05/2006 14:13:35 PAGE 2   

  56   2        
  57   2         }
  58   1      
  59   1      }
  60          void os_init()
  61          {
  62   1          int i = 0;
  63   1          SFRPAGE   = CONFIG_PAGE;
  64   1          OSCXCN    = 0x67;                                                                   //外部22.1184M晶振
  65   1          for (i = 0; i < 3000; i++);                         //等待外部晶振稳定 
  66   1          while ((OSCXCN & 0x80) == 0);
  67   1          CLKSEL    = 0x01;                                                                   //系统时钟不分频
  68   1      }
  69          void port_init()
  70          {
  71   1          SFRPAGE   = CONFIG_PAGE;
  72   1              P0MDOUT=0xff;
  73   1          XBR0      = 0x06;
  74   1          XBR2      = 0x40;
  75   1              P2MDOUT=0xff;
  76   1      
  77   1      }
  78          void spi_init()
  79          {
  80   1            SFRPAGE   = SPI0_PAGE;
  81   1            SPI0CFG   = 0x40;
  82   1            SPI0CN    = 0x01;
  83   1            SPI0CKR   = 0x6D;
  84   1      
  85   1      
  86   1      }
  87          
  88           void delay(uint d)
  89           {uint i,j;
  90   1        for(i=0;i<d;i++);
  91   1              {
  92   2              for(j=10;j>0;j--);
  93   2              }
  94   1      
  95   1       }
  96           void delay1us(void)
  97                  {
  98   1              uchar xdata i;
  99   1              for(i=10;i>0;i--);
 100   1              } 
 101          
 102          void writelcd(uchar spi_data)      //向LV595写数据以SPI方式
 103          {
 104   1        uint xdata i,j,k;
 105   1              for(i=0;i<9;i++);
 106   1              LcdCs=0;
 107   1              delay1us();     
 108   1              SPI_BUSY=1;
 109   1              SFRPAGE   = SPI0_PAGE;
 110   1              SPI0DAT=spi_data;
 111   1              for(j=0;j<500;j++)
 112   1                      {
 113   2                 if(!SPI_BUSY)break;
 114   2                      } 
 115   1              delay1us();
 116   1              
 117   1              LcdCs=1;
C51 COMPILER V7.50   KEY_040                                                               12/05/2006 14:13:35 PAGE 3   

 118   1              delay1us();
 119   1              delay1us();
 120   1              delay1us();
 121   1              delay1us();
 122   1              delay1us();
 123   1              delay1us();
 124   1              for(k=0;k<5000;k++);
 125   1              
 126   1      /* **************************************************************************
 127   1       // 以下这段代码,是用IO口模拟SPI传输的程序
 128   1         LcdCs=0;
 129   1        for(i=0;i<8;i++)
 130   1        { SPICLK=0;
 131   1          if(spi_data&0x80)
 132   1                 spi_mosi=1;
 133   1          else 
 134   1                 spi_mosi=0;
 135   1          spi_data<<=1;
 136   1              SPICLK=1;
 137   1               for(j=0;j<10;j++)
 138   1               {_nop_();}
 139   1          SPICLK=0;
 140   1         }
 141   1         LcdCs=1;
 142   1      /***************************************************************************/
 143   1      }
 144          void writecode(uchar ins)                                   //向液晶控制模块写命令
 145               {
 146   1            uchar xdata t;
 147   1                uint xdata j;
 148   1              
 149   1                for(j=0;j<500;j++);   
 150   1                virt_port|=ins&0xf0;                                  //取高字节向1602写数据 
 151   1                writelcd(virt_port);                                  //先写高4位后再写低4位 这是在选择四个数据线的时候
 152   1           
 153   1                virt_port|=0x08;                                                
 154   1                writelcd(virt_port);                                  //使能E脚为高电平
 155   1            virt_port&=~0x08;                                 
 156   1                writelcd(virt_port);                                  //使能E脚为低电平
 157   1      
 158   1            t=ins<<4;             
 159   1            virt_port|=t&0xf0;                                //取低字节向1602写数据
 160   1                writelcd(virt_port);
 161   1            virt_port|=0x08;                                          //使能E脚为高电平
 162   1                writelcd(virt_port);
 163   1            virt_port&=~0x08;                                     //使能E脚为低电平
 164   1                writelcd(virt_port);
 165   1            virt_port=0;
 166   1                writelcd(virt_port);
 167   1           }
 168          
 169          void writedata(uchar d)                                    //写数据到1602
 170               {
 171   1            uchar xdata i,t;
 172   1                uint xdata j;
 173   1                
 174   1            for(j=0;j<500;j++);               
 175   1            virt_port|=0x02;                                     //光标返回指令
 176   1                writelcd(virt_port);
 177   1            virt_port|=d&0xf0;                                   //取高字节数据给数据寄存器
 178   1                writelcd(virt_port);
 179   1            virt_port|=0x08;                     //使能E脚为高电平
C51 COMPILER V7.50   KEY_040                                                               12/05/2006 14:13:35 PAGE 4   

 180   1                writelcd(virt_port);
 181   1            virt_port&=0xf7;                             //使能E脚为低电平
 182   1                writelcd(virt_port);
 183   1            virt_port&=0x07;                                     //设置光标右移,文字也右移
 184   1            writelcd(virt_port);
 185   1                     
 186   1            t=d&0x0f;
 187   1            virt_port|=t<<4;                                     //取低字节数据给数据寄存器
 188   1                writelcd(virt_port);
 189   1      
 190   1                virt_port|=0x08;                                 //使能E脚为高电平
 191   1                writelcd(virt_port);
 192   1            for(i=3;i>0;i--); 
 193   1            virt_port&=0xf7;                     //使能E脚为低电平
 194   1                writelcd(virt_port);
 195   1            virt_port=0;                                                 //数据清零
 196   1                writelcd(virt_port);
 197   1          }
 198          
 199           void lcdchar (uchar da)
 200               {
 201   1           uint xdata i,j,k;
 202   1           for(j=0;j<5000;j++);                  //数据读、写操作,画面不动
 203   1           for(k=0;k<5000;k++);
 204   1        
 205   1           for(i=da;i<da+2;i++)
 206   1               {
 207   2             writedata(tab1[i]);
 208   2             for(j=0;j<1000;j++);
 209   2             for(k=0;k<1000;k++);
 210   2             for(k=0;k<5000;k++);
 211   2             for(k=0;k<1000;k++);
 212   2                 for(k=0;k<5000;k++);
 213   2                 for(k=0;k<5000;k++);
 214   2                 for(k=0;k<5000;k++);
 215   2               
 216   2            }
 217   1                                              
 218   1        
 219   1           
 220   1       
 221   1         
 222   1         
 223   1           }
 224          
 225          
 226          void lcdinit()
 227          {
 228   1           uint xdata i;
 229   1              
 230   1            virt_port=0x00;
 231   1                writelcd(virt_port);       //RS脚为零写指令寄存器      RW为低电平
 232   1            virt_port|=0x08;               //使能脚E=1
 233   1                writelcd(virt_port);
 234   1                virt_port&=0xf7;               //使E=0使能脚发生跳变高--低
 235   1                writelcd(virt_port);
 236   1                for(i=1000;i>0;i--);       //3次延时,重要!
 237   1                for(i=8000;i>0;i--);           //用延时代替查询         
 238   1      
 239   1          
 240   1            virt_port=0;                               //写入20码,设置为4位总线方式,非常重要!!!!!
 241   1                writelcd(virt_port);
C51 COMPILER V7.50   KEY_040                                                               12/05/2006 14:13:35 PAGE 5   

 242   1            virt_port|=0x20;                   //只写高字节
 243   1                writelcd(virt_port);
 244   1            virt_port|=0x08;           //E=1
 245   1                writelcd(virt_port);
 246   1                for(i=20;i>0;i--);             //使命令执行
 247   1            virt_port&=0xf7;           //E=0
 248   1                writelcd(virt_port);
 249   1                for(i=10;i>0;i--);
 250   1            virt_port=0;
 251   1                writelcd(virt_port);
 252   1               
 253   1               
 254   1      
 255   1            writecode(0x38);          //设两行显示,4线方式5*10字符显示
 256   1            for(i=50;i>0;i--);
 257   1                  writecode(0x06);                    //光标右移
 258   1            for(i=50;i>0;i--);
 259   1               
 260   1                
 261   1                writecode(0x0c);                  //开显示指令
 262   1            for(i=50;i>0;i--);
 263   1            
 264   1               
 265   1            writecode(0x02);                  //光标返回指令
 266   1            for(i=50;i>0;i--);
 267   1                 
 268   1          
 269   1               
 270   1                writecode(0x01);                      //清屏指令
 271   1                for(i=50;i>0;i--);
 272   1      }
 273          
 274          void spi_srs  () interrupt 6
 275          {
 276   1              if(SPIF)                
 277   1                      {
 278   2                SFRPAGE   = SPI0_PAGE;
 279   2                SPIF=0;
 280   2      
 281   2                      SPI_BUSY=0;
 282   2                      }
 283   1                      
 284   1      
 285   1              if(WCOL)
 286   1                      {
 287   2                 SFRPAGE   = SPI0_PAGE;
 288   2                      WCOL=0;
 289   2                      }
 290   1      
 291   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1355    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =      9      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 + -