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

📄 340_lcd.lst

📁 c8051f340型单片机的led灯闪烁程序
💻 LST
字号:
C51 COMPILER V7.05   340_LCD                                                               10/23/2006 10:03:07 PAGE 1   


C51 COMPILER V7.05, COMPILATION OF MODULE 340_LCD
OBJECT MODULE PLACED IN 340_lcd.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe 340_lcd.c DB OE

stmt level    source

   1          /******************************************************************************
   2          由于LV595芯片片选引脚与以太网控制芯片CP2200中断引脚复用因些在此例程中加入了将
   3          CP2200芯片中断关闭的代码。还要在建立工程文件时将CP220X_REG.C文件包含到工程中.
   4          ******************************************************************************/
   5          
   6          
   7          #include "C8051F340.h"
   8          #include <intrins.h>
   9          #include "cp220x_reg.h"
  10          
  11          #define  uchar unsigned char
  12          #define  uint  unsigned int
  13          #define  BASE_ADDRESS   0x10
  14          #define EMIF_TIMING     0x9E 
  15          
  16          
  17          //sbit spi_mosi=P0^0;
  18          //sbit SPICLK=P0^1;
  19          sbit LcdCs=P0^3;
  20          sbit led=P2^4;
  21          bit SPI_BUSY;
  22          
  23          
  24          uchar xdata virt_port;
  25          uchar xdata discode;//开关显示、光标、闪烁的命令字暂存单元
  26          uint Count1ms;
  27          signed char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x33,0x34,0x30,0x20,0x56,0x31,0x2e,0x30
  28                                      ,0x20,0x20};
  29          unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
  30                                          0x6d,0x2e,0x63,0x6e,0x20,0x20}; 
  31          void delay(uint timer);
  32          void writelcd(uchar spi_data);
  33          void writecode(uchar ins);
  34          void writedata(uchar d);
  35          void lcdinit();
  36          void lcdchar (void);
  37          void lcdaddr(uchar DDRAM);
  38          void cursoropen(uchar position);//开光标,关闪烁
  39          void displayopen(void);                 //开显示,光标、闪烁不变
  40          void ether_reset_low();
  41          void ether_reset_high (void);
  42          void Delay1ms(uint T);
  43          void EMIF_Init (void);
  44          
  45          uint da;             
  46           void delay1us(void)
  47                  {
  48   1              uchar xdata i;
  49   1              for(i=10;i>0;i--);
  50   1              } 
  51          
  52          void SPI_Init()
  53          {
  54   1          SPI0CFG   = 0x70;
  55   1          SPI0CN    = 0x01;
C51 COMPILER V7.05   340_LCD                                                               10/23/2006 10:03:07 PAGE 2   

  56   1          SPI0CKR   = 0x3B;
  57   1        
  58   1      
  59   1      } 
  60          
  61          void writelcd(uchar spi_data)      //向LV595写数据以SPI方式
  62          {
  63   1      
  64   1              uint xdata i,j;
  65   1              for(i=0;i<3;i++)
  66   1              LcdCs=0;
  67   1              SPI_BUSY=1;
  68   1              delay1us();
  69   1              SPI0DAT=spi_data;
  70   1              
  71   1           for(j=0;j<500;j++)
  72   1                      {
  73   2                 if(!SPI_BUSY)break;
  74   2                      } 
  75   1              delay1us();
  76   1              LcdCs=1;
  77   1              delay1us();
  78   1              delay1us();
  79   1              delay1us();
  80   1              delay1us();
  81   1              delay1us();
  82   1              delay1us();
  83   1              delay1us();
  84   1              for(j=0;j<5000;j++);
  85   1      
  86   1      }
  87          
  88           void writecode(uchar ins)                                  //向液晶控制模块写命令
  89               {
  90   1            uchar xdata t;
  91   1                uint xdata j;
  92   1              
  93   1                for(j=0;j<500;j++);   
  94   1                virt_port|=ins&0xf0;                                  //取高字节向1602写数据 
  95   1                writelcd(virt_port);                                  //先写高4位后再写低4位 这是在选择四个数据线的时候
  96   1           
  97   1                virt_port|=0x08;                                                
  98   1                writelcd(virt_port);                                  //使能E脚为高电平
  99   1            virt_port&=~0x08;                                 
 100   1                writelcd(virt_port);                                  //使能E脚为低电平
 101   1      
 102   1            t=ins<<4;             
 103   1            virt_port|=t&0xf0;                                //取低字节向1602写数据
 104   1                writelcd(virt_port);
 105   1            virt_port|=0x08;                                          //使能E脚为高电平
 106   1                writelcd(virt_port);
 107   1            virt_port&=~0x08;                                     //使能E脚为低电平
 108   1                writelcd(virt_port);
 109   1            virt_port=0;
 110   1                writelcd(virt_port);
 111   1           }
 112          
 113          void writedata(uchar d)                                    //写数据到1602
 114               {
 115   1            uchar xdata i,t;
 116   1                uint xdata j;
 117   1                
C51 COMPILER V7.05   340_LCD                                                               10/23/2006 10:03:07 PAGE 3   

 118   1            for(j=0;j<500;j++);               
 119   1            virt_port|=0x02;                                     //光标返回指令
 120   1                writelcd(virt_port);
 121   1            virt_port|=d&0xf0;                                   //取高字节数据给数据寄存器
 122   1                writelcd(virt_port);
 123   1            virt_port|=0x08;                     //使能E脚为高电平
 124   1                writelcd(virt_port);
 125   1            virt_port&=0xf7;                             //使能E脚为低电平
 126   1                writelcd(virt_port);
 127   1            virt_port&=0x07;                                     //设置光标右移,文字也右移
 128   1            writelcd(virt_port);
 129   1                     
 130   1            t=d&0x0f;
 131   1            virt_port|=t<<4;                                     //取低字节数据给数据寄存器
 132   1                writelcd(virt_port);
 133   1      
 134   1                virt_port|=0x08;                                 //使能E脚为高电平
 135   1                writelcd(virt_port);
 136   1            for(i=3;i>0;i--); 
 137   1            virt_port&=0xf7;                     //使能E脚为低电平
 138   1                writelcd(virt_port);
 139   1            virt_port=0;                                                 //数据清零
 140   1                writelcd(virt_port);
 141   1          }
 142           void lcdchar (void)
 143               {
 144   1           uint xdata i,j,k;
 145   1           for(j=0;j<5000;j++);                  //数据读、写操作,画面不动
 146   1           for(k=0;k<5000;k++);
 147   1        
 148   1           for(i=0;i<16;i++){
 149   2           writedata(tab1[i]);
 150   2           for(j=0;j<1000;j++);
 151   2           for(k=0;k<1000;k++);
 152   2           for(k=0;k<5000;k++);
 153   2           for(k=0;k<1000;k++);
 154   2       }
 155   1                                            
 156   1        
 157   1        writecode(0xb0);                         //换行指令                    
 158   1        for(j=0;j<5000;j++);                                        
 159   1        for(k=0;k<5000;k++);
 160   1        discode=0xb0;
 161   1        for(i=0;i<16;i++){
 162   2        writedata(Netdata[i]);
 163   2        for(j=0;j<5000;j++);
 164   2        for(k=0;k<5000;k++);
 165   2        for(k=0;k<5000;k++);    
 166   2        };
 167   1         
 168   1           }
 169          
 170           
 171          void lcdinit()
 172          {
 173   1           uint xdata i;
 174   1              
 175   1            virt_port=0x00;
 176   1                writelcd(virt_port);       //RS脚为零写指令寄存器      RW为低电平
 177   1            virt_port|=0x08;               //使能脚E=1
 178   1                writelcd(virt_port);
 179   1                virt_port&=0xf7;               //使E=0使能脚发生跳变高--低
C51 COMPILER V7.05   340_LCD                                                               10/23/2006 10:03:07 PAGE 4   

 180   1                writelcd(virt_port);
 181   1                for(i=1000;i>0;i--);       //3次延时,重要!
 182   1                for(i=8000;i>0;i--);           //用延时代替查询         
 183   1      
 184   1          
 185   1            virt_port=0;                               //写入20码,设置为4位总线方式,非常重要!!!!!
 186   1                writelcd(virt_port);
 187   1            virt_port|=0x20;                   //只写高字节
 188   1                writelcd(virt_port);
 189   1            virt_port|=0x08;           //E=1
 190   1                writelcd(virt_port);
 191   1                for(i=20;i>0;i--);             //使命令执行
 192   1            virt_port&=0xf7;           //E=0
 193   1                writelcd(virt_port);
 194   1                for(i=10;i>0;i--);
 195   1            virt_port=0;
 196   1                writelcd(virt_port);
 197   1               
 198   1               
 199   1      
 200   1            writecode(0x38);          //设两行显示,4线方式5*10字符显示
 201   1            for(i=50;i>0;i--);
 202   1                  writecode(0x06);                    //光标右移
 203   1            for(i=50;i>0;i--);
 204   1               
 205   1                
 206   1                writecode(0x0c);                  //开显示指令
 207   1            for(i=50;i>0;i--);
 208   1            
 209   1               
 210   1            writecode(0x02);                  //光标返回指令
 211   1            for(i=50;i>0;i--);
 212   1                 
 213   1          
 214   1               
 215   1                writecode(0x01);                      //清屏指令
 216   1                for(i=50;i>0;i--);
 217   1      }
 218          void port_init()
 219          {
 220   1           P0MDOUT=0xff;
 221   1           XBR0      = 0x02;
 222   1           XBR1      = 0x40;
 223   1           P1MDOUT |= 0xD8;                    // /WR and /RD are push-pull
 224   1           P2MDOUT |= 0xFF;
 225   1           P3MDOUT |= 0xFF;
 226   1           P4MDOUT |= 0xFF;
 227   1      
 228   1      
 229   1      }
 230          
 231          void main(void)
 232          {
 233   1         uint j;
 234   1         PCA0MD &= ~0x40;     //关闭看门狗定时器
 235   1         OSCICN |= 0x03;      //内部高频振荡器12M晶振做为系统时钟
 236   1         port_init();            //端口初始化
 237   1         EMIF_Init ();
 238   1         ether_reset_low();
 239   1         for(j=0;j<5000;j++);
 240   1         ether_reset_high ();
 241   1         INT0EN = 0x00;                         
C51 COMPILER V7.05   340_LCD                                                               10/23/2006 10:03:07 PAGE 5   

 242   1         INT1EN = 0x00;
 243   1         SPI_Init();
 244   1         
 245   1         IE = 0x40;
 246   1         EA=1;        
 247   1       
 248   1        
 249   1        while(1)
 250   1        {       
 251   2       lcdinit();                //液晶初始化
 252   2       lcdchar();     
 253   2       
 254   2        }
 255   1      
 256   1      }
 257          
 258          void spi_isr(void) interrupt 6 
 259          {
 260   1              if(SPIF)                
 261   1                      {
 262   2                      SPIF=0;
 263   2                      SPI_BUSY=0;
 264   2                      }
 265   1                      
 266   1      
 267   1              if(WCOL)
 268   1                      {
 269   2                      WCOL=0;
 270   2                      }
 271   1      }
 272          
 273           
 274          void ether_reset_low()
 275          {
 276   1      
 277   1         P1 &= ~0x01;               // Pull reset low
 278   1      
 279   1      }
 280          void ether_reset_high (void)
 281          {
 282   1      
 283   1         P1 |= 0x01;               // Allow /RST to rise
 284   1         while(!(P1 & 0x01));      // Wait for /RST to go high
 285   1      
 286   1      
 287   1      }
 288          
 289          void EMIF_Init (void)
 290          {
 291   1      
 292   1         EMI0CF = 0x1B;             // non-muxed mode; split mode
 293   1                                    // with bank select
 294   1      
 295   1         EMI0TC = EMIF_TIMING;      // This constant may be modified
 296   1                                    // according to SYSCLK to meet the
 297   1                                    // timing requirements for the CP2200
 298   1      
 299   1         EMI0CN = BASE_ADDRESS;     // Page of XRAM accessed by EMIF
 300   1      
 301   1      }


C51 COMPILER V7.05   340_LCD                                                               10/23/2006 10:03:07 PAGE 6   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1406    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     34      20
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4    ----
   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 + -