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

📄 lcd_040.lst

📁 本程序是C8051F040的LCD范例程序。用SPI总线的LV595芯片输出脚控制LCD。
💻 LST
字号:
C51 COMPILER V7.50   LCD_040                                                               10/08/2006 13:29:10 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE LCD_040
OBJECT MODULE PLACED IN lcd_040.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd_040.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "C8051F040.h"
   2          #include <intrins.h>
   3          
   4          #define  uchar unsigned char
   5          #define  uint unsigned int
   6          
   7          void writelcd(uchar spi_data);
   8          void writecode(uchar ins);
   9          void writedata(uchar d);
  10          void lcdinit();
  11          void lcdchar (void);
  12          void Oscillator_Init();
  13          void port_init();
  14          
  15          sbit spi_mosi=P0^4;
  16          sbit SPICLK=P0^2;
  17          sbit LcdCs=P1^1;
  18          
  19          uchar xdata virt_port;
  20          uchar xdata discode;//开关显示、光标、闪烁的命令字暂存单元
  21          
  22          signed char xdata tab1[16]={0x20,0x20,0x42,0x54,0x20,0x46,0x33,0x34,0x30,0x20,0x56,0x31,0x2e,0x30
  23                                      ,0x20,0x20};
  24          unsigned char xdata Netdata[16]={0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
  25                                          0x6d,0x2e,0x63,0x6e,0x20,0x20}; 
  26          
  27          /****************************************************************************
  28          *
  29          *主函数中执行显示
  30          *****************************************************************************/
  31          void main()
  32          {
  33   1        WDTCN = 0xDE;                  // 关看门狗定时器
  34   1        WDTCN = 0xAD;
  35   1        Oscillator_Init();             //时钟初始化
  36   1        port_init();                   //端口初始化
  37   1       //   lcdinit();                                         //液晶初始化
  38   1        
  39   1         while(1)
  40   1        {     
  41   2         //   LcdCs=1;
  42   2      //      SPICLK=1;
  43   2      //      spi_mosi=1;
  44   2          writelcd(0x03);
  45   2              //lcdchar();                                     //显示字符
  46   2         }
  47   1      }
  48          /*****************************************************************************
  49          *
  50          *初始化时钟选择外22.1184Mhz 晶振做
  51          ******************************************************************************/
  52          void Oscillator_Init()
  53          {
  54   1          int i = 0;
  55   1          SFRPAGE   = CONFIG_PAGE;
C51 COMPILER V7.50   LCD_040                                                               10/08/2006 13:29:10 PAGE 2   

  56   1          OSCXCN    = 0x67;
  57   1          for (i = 0; i < 3000; i++);  // 初始化时等待1毫秒
  58   1          while ((OSCXCN & 0x80) == 0);
  59   1          CLKSEL    = 0x01;
  60   1      }
  61          /*****************************************************************************
  62          *
  63          *向LV595写数据以SPI方式
  64          *****************************************************************************/
  65          void writelcd(uchar spi_data)      
  66          {
  67   1        uchar xdata i;
  68   1        
  69   1         LcdCs=0;
  70   1        for(i=0;i<8;i++)
  71   1        { 
  72   2          SPICLK=0;
  73   2              if(spi_data&0x80)
  74   2                 spi_mosi=1;
  75   2          else 
  76   2                 spi_mosi=0;
  77   2          spi_data<<=1;
  78   2              SPICLK=1;
  79   2          SPICLK=0;
  80   2         }
  81   1         LcdCs=1;
  82   1      }
  83          
  84          /*****************************************************************************
  85          *
  86          * 向液晶控制模块写命令
  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          *
 114          * 写数据到1602控制模块
 115          *******************************************************************************/
 116          void writedata(uchar d)                                    
 117               {
C51 COMPILER V7.50   LCD_040                                                               10/08/2006 13:29:10 PAGE 3   

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

 180          ********************************************************************************/ 
 181           void lcdinit()
 182          {
 183   1           uint xdata i;
 184   1              
 185   1            virt_port=0x00;
 186   1                writelcd(virt_port);       //RS脚为零写指令寄存器      RW为低电平
 187   1            virt_port|=0x08;               //使能脚E=1
 188   1                writelcd(virt_port);
 189   1                virt_port&=0xf7;               //使E=0使能脚发生跳变高--低
 190   1                writelcd(virt_port);
 191   1                for(i=1000;i>0;i--);       //3次延时,重要!
 192   1                for(i=8000;i>0;i--);           //用延时代替查询         
 193   1      
 194   1          
 195   1            virt_port=0;                               //写入20码,设置为4位总线方式,非常重要!!!!!
 196   1                writelcd(virt_port);
 197   1            virt_port|=0x20;                   //只写高字节
 198   1                writelcd(virt_port);
 199   1            virt_port|=0x08;           //E=1
 200   1                writelcd(virt_port);
 201   1                for(i=20;i>0;i--);             //使命令执行
 202   1            virt_port&=0xf7;           //E=0
 203   1                writelcd(virt_port);
 204   1                for(i=10;i>0;i--);
 205   1            virt_port=0;
 206   1                writelcd(virt_port);
 207   1                writecode(0x38);              //设两行显示,4线方式5*10字符显示
 208   1            for(i=50;i>0;i--);
 209   1                  writecode(0x06);                    //光标右移
 210   1            for(i=50;i>0;i--);
 211   1               
 212   1                
 213   1                writecode(0x0c);                  //开显示指令
 214   1            for(i=50;i>0;i--);
 215   1            
 216   1               
 217   1            writecode(0x02);                  //光标返回指令
 218   1            for(i=50;i>0;i--);
 219   1                 
 220   1          
 221   1               
 222   1                writecode(0x01);                      //清屏指令
 223   1                for(i=50;i>0;i--);
 224   1      }
 225          /******************************************************************************
 226          *
 227          *引脚初始化
 228          *******************************************************************************/
 229          void port_init()
 230          {
 231   1          SFRPAGE   = CONFIG_PAGE;
 232   1          P1MDOUT   = 0xff;
 233   1          XBR2      = 0x40;
 234   1         
 235   1      }  
 236          
 237          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1232    ----
C51 COMPILER V7.50   LCD_040                                                               10/08/2006 13:29:10 PAGE 5   

   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     34      16
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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