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

📄 lcd.lst

📁 C8051F120与串口、并口、D12、USB、LCD应用
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 1   


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

stmt level    source

   1          #include <string.h>
   2          #include <stdio.h>
   3          #include <absacc.h>
   4          #include "ASCII.h"
   5          #include "LCD.h"
   6          #include "System.h"
   7          
   8          #define BASE 0x8000
   9          
  10          //
  11          unsigned char code line[] = {"肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀肀"}; // 分割线
  12          unsigned char code UpArrow[]={"芗"};
  13          unsigned char code DownArrow[]={"兦"};
  14          unsigned char code LeftArrow[]={"阼"};
  15          unsigned char code RightArrow[]={"囿"};
  16          
  17          //写命令函数
  18          void CmdWrite(unsigned char n)    
  19          {
  20   1           RES=1;
  21   1           A0=1;
  22   1           WR=0;
  23   1               P6MDOUT = 0XFF;                        
  24   1               P6=n;
  25   1           WR=1;
  26   1           A0=0;   
  27   1      }
  28          
  29          //写数据函数
  30          void DataWrite(unsigned char  m)
  31          {   
  32   1         RES=1;
  33   1         A0=0;
  34   1         WR=0;
  35   1         P6MDOUT = 0XFF;
  36   1         P6=m;
  37   1         WR=1;
  38   1         A0=1;   
  39   1      }
  40          
  41          
  42          //清屏函数,清空LCDfrom行至to行
  43          void Clear(int from,int to)
  44          {
  45   1              int i,j;
  46   1              CS=0;
  47   1              CmdWrite(CSRDIR_RIGHT);                 //光标移动方向4cH
  48   1              Locatexy(0,from);
  49   1              CmdWrite(MWRITE);                       //数据写入显示缓冲区42H
  50   1              for(i=from;i<to;i++)
  51   1              { 
  52   2                      for(j=0;j<40;j++)
  53   2                      DataWrite(0x00);
  54   2              }
  55   1              CS=1;   
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 2   

  56   1      }
  57          
  58          //LCD初始化函数
  59          void Init_LCD()
  60          { 
  61   1              mLES_SW=1;           //将LEDWS(P7^0)置1,LED由P5控制  
  62   1              CS=0;                //片选LCD
  63   1              RES=0;               //LCD Reset
  64   1        
  65   1              CmdWrite(SYSTEMSET); //SYSTEM SET 指令代码 40H
  66   1        
  67   1              DataWrite(0x30);        //P1 00110000B B=1;无边界 W/S=0,为单屏结构;M0~M3=0; 8*8点阵
  68   1              DataWrite(0x87);        //P2 10000111B WF=1,FX=7,显示字符宽为8像素
  69   1              DataWrite(0x07);        //P3 00000111B FY=7,显示字符高为8像素
  70   1              DataWrite(0x27);        //P4_CR 一行能显示40(0X27)个字符,即320/8=40byte
  71   1              DataWrite(0x42);        //P5_TC/R=10MHz/(9*240*70Hz)=66(0x42)
  72   1              DataWrite(0xf0);        //P6_L/F 显示屏有 240行(0xEF)
  73   1              DataWrite(0x28);        //P7_APL显示屏一行所占显示缓冲区40字节,   
  74   1              DataWrite(0x00);        //P8_APH
  75   1      
  76   1              CmdWrite(SCROLL);       //SCROLL 指令代码0x44H 显示区设置
  77   1         
  78   1              DataWrite(0x00);        //P1_SAD1L_第一显示区的起始地址从显示RAM0x00开始
  79   1              DataWrite(0x00);        //P2_SAD1H
  80   1              DataWrite(0xf0);        //P3_SL1___第一显示区共有240行
  81   1      
  82   1              DataWrite(0x00);        //P4_SAD2L_第二显示区的首地址从显示RAM 9600地址开始 2580H
  83   1              DataWrite(0x00);        //P5_SAD2H
  84   1              DataWrite(0x00);        //P6_SL2___第二显示区共有240行
  85   1      
  86   1              DataWrite(0x80);        //P7_SAD3L_第3显示区的首地址从显示RAM 0x7080地址开始
  87   1              DataWrite(0x25);        //P8_SAD3H  
  88   1      
  89   1              DataWrite(0x00);        //P9_SAD4L
  90   1              DataWrite(0x00);        //P10_SAD4H
  91   1         
  92   1              CmdWrite(HDOTSCR);   //HDOTEST 指令代码 0x5AH 点位置设置,初始化时清零
  93   1              DataWrite(0x00);
  94   1      
  95   1              CmdWrite(OVLAY);     //设置双层合成显示方式0x5BH 
  96   1              DataWrite(0x0c);     //图形显示方式00001100,DM1=1,DM2=1;  二重合成显示方式,或逻辑, 图形显示方式
  97   1       
  98   1              CmdWrite(DISPON);    //开显示0x59H
  99   1              DataWrite(0x44);     //0100 0100B第1,3显示区工作,光标不显示
 100   1      
 101   1              Clear(0,480);            //1,3区全部清空
 102   1              CS=1;
 103   1      }
 104          
 105          unsigned int LCD_RAM_ORG=LCD_Area1;     //设置工作区为1区
 106          //光标定位,x以字节为单位,y以点为单位,LCD左上角为坐标原点,LCD_RAM_ORG控制LCD工作区
 107          void Locatexy(unsigned char  x,unsigned char y)
 108          {
 109   1          unsigned int temp;
 110   1          temp =(unsigned int) y*40+x+LCD_RAM_ORG;
 111   1          CmdWrite(CSRW);               // 光标Locate,定位
 112   1          DataWrite( (unsigned char)(temp) );  // 写入参数CSRL设置参数光标指针低8位
 113   1          DataWrite( (unsigned char)(temp>>8) );   // 写入参数CSRH设置参数光标指针高8位
 114   1      }
 115          
 116          
 117          /*******************画点函数*************************/
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 3   

 118          void Point(int x,unsigned char y)                       //在x,y坐标处(都是点坐标)画点.x-[0,320),y-[0,240)
 119          {
 120   1              unsigned char temp=0x80;
 121   1              unsigned char value;
 122   1              temp=(temp >> (x%8));
 123   1              CS=0;
 124   1              //先读出该点数据
 125   1              Locatexy(x/8,y);        //定位
 126   1              CmdWrite(MREAD);        //发读命令
 127   1              
 128   1              P6MDOUT=0x00;       //配置P6为数字输入 (数字输入=漏极开路+SFR写1)
 129   1              P6=0xff;        
 130   1              A0=1;
 131   1              RD=0;
 132   1              RD=1;
 133   1              value=P6;
 134   1              A0=0;
 135   1              P6MDOUT=0xFF;
 136   1      
 137   1              Locatexy(x/8,y);                        //重新定位
 138   1              CmdWrite(MWRITE);
 139   1              DataWrite(temp|value);          //写入数据
 140   1              CS=1;
 141   1      }
 142                     
 143          //写汉字和字符函数
 144          void  dprintf(unsigned char  x,unsigned char  y, char *ptr)   
 145          {
 146   1              unsigned char c1,c2;
 147   1              unsigned int i,j,uLen,uRow,uCol;
 148   1              unsigned char temp;
 149   1              unsigned int k;
 150   1              unsigned int offset;
 151   1         
 152   1              CS=0;
 153   1              uRow=x%40;
 154   1              uCol=y%240;
 155   1              uLen=0;
 156   1        
 157   1              CmdWrite(CSRDIR_DOWN);  /*光标移动方向定义,自动下移*/
 158   1              Locatexy(uRow,uCol);
 159   1              
 160   1              while((unsigned char)ptr[uLen]>=0x20){uLen++;};  /*探测字符串长度*/
 161   1              i=0;
 162   1              while(i<uLen)
 163   1              {
 164   2                      c1=ptr[i];
 165   2                      c2=ptr[i+1];
 166   2      
 167   2                      if(c1 <=128)                        // ASCII
 168   2              {
 169   3                  if (c1 >= 0x20) 
 170   3                              {
 171   4                      CmdWrite( MWRITE );         // 写数据(命令)
 172   4                      for(j=0;j<16;j++) DataWrite( ASC_MSK[(c1-0x20)*16 +j ]);
 173   4                  }
 174   3                  uRow++;                     // 列数加1
 175   3              }
 176   2                      else   // 汉字
 177   2              {   
 178   3                              offset=0;
 179   3                              //调整bank页,从第3页中取常数
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 4   

 180   3                              PSBANK=0x31;
 181   3                              while(CBYTE[BASE+offset]!=0xFF || CBYTE[BASE+offset+1]!=0xFF)
 182   3                              {       
 183   4                                      unsigned cc1,cc2;
 184   4                                      cc1=CBYTE[BASE+offset];
 185   4                                      cc2=CBYTE[BASE+offset+1];
 186   4                                      if(CBYTE[BASE+offset]==c1 && CBYTE[BASE+offset+1]==c2)
 187   4                                      break;
 188   4                                      offset+=34;
 189   4                              }
 190   3                              for(k=0;k<2;k++)   //分两列显示该汉字字模,先显示左半部分,再显示右半部分
 191   3                              {
 192   4                                      Locatexy(uRow+k,uCol);
 193   4                              CmdWrite(CSRDIR_DOWN);
 194   4                                      CmdWrite(MWRITE);     //写数据命令
 195   4                                      for(temp=0;temp<16;temp++) 
 196   4                                      { 
 197   5                                              DataWrite( CBYTE[BASE+offset+2+temp*2+k]);
 198   5                                      }
 199   4                              }
 200   3                              PSBANK=0x11;
 201   3                              uRow+=2;
 202   3                              i++;
 203   3      
 204   3                      }
 205   2      
 206   2                      if(uRow >= 40)          // 光标后移
 207   2                      {
 208   3                              uCol += 16;
 209   3                              uRow = 0;
 210   3                              if( uCol >= 240 ) uCol = 0;
 211   3                      }
 212   2              Locatexy(uRow,uCol);
 213   2                      i++;
 214   2              }
 215   1              CS=1;
 216   1      }
 217          //反色显示汉字,字符
 218          void  Udprintf(unsigned char  x,unsigned char  y, char *ptr)   
 219          {
 220   1         unsigned char c1,c2;
 221   1         unsigned int i,j,uLen,uRow,uCol;
 222   1         unsigned char temp;
 223   1         unsigned int k;
 224   1         unsigned int offset;
 225   1         
 226   1         CS=0;
 227   1         uRow=x%40;
 228   1         uCol=y%240;
 229   1         uLen=0;
 230   1               
 231   1         CmdWrite(CSRDIR_DOWN);  /*光标移动方向定义,自动下移*/
 232   1         Locatexy(uRow,uCol);
 233   1              
 234   1         while((unsigned char)ptr[uLen]>=0x20){uLen++;};  /*探测字符串长度*/
 235   1         i=0;
 236   1         while(i<uLen)
 237   1         {
 238   2         c1=ptr[i];
 239   2         c2=ptr[i+1];
 240   2      
 241   2          if(c1 <=128)                        // ASCII
C51 COMPILER V7.01  LCD                                                                    06/30/2007 11:42:50 PAGE 5   

 242   2              {
 243   3                  if (c1 >= 0x20) {
 244   4                      CmdWrite( MWRITE );         // 写数据(命令)
 245   4                      for(j=0;j<16;j++) DataWrite( ~ASC_MSK[(c1-0x20)*16 +j]);
 246   4                  }
 247   3                  uRow++;                     // 列数加1
 248   3              }
 249   2      
 250   2              else   // 汉字
 251   2              {       
 252   3                              offset=0;
 253   3                              //调整bank页,从第3页中取常数   
 254   3                              PSBANK=0x31;
 255   3                              while(CBYTE[BASE+offset]!=0xFF || CBYTE[BASE+offset+1]!=0xFF)
 256   3                              {
 257   4                                      if(CBYTE[BASE+offset]==c1 && CBYTE[BASE+offset+1]==c2)
 258   4                                      break;
 259   4                                      offset+=34;
 260   4                              }
 261   3                              for(k=0;k<2;k++)   //分两列显示该汉字字模,先显示左半部分,再显示右半部分
 262   3                              {
 263   4                                      Locatexy(uRow+k,uCol);
 264   4                              CmdWrite(CSRDIR_DOWN);
 265   4                                      CmdWrite(MWRITE);     //写数据命令

⌨️ 快捷键说明

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