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

📄 lcd.lst

📁 C51单片机端
💻 LST
字号:
C51 COMPILER V8.01   LCD                                                                   12/04/2006 10:50:22 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN lcd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd.c LARGE OPTIMIZE(7,SPEED) BROWSE ORDER MODDP2 DEBUG OBJECTEXTEND

line level    source

   1          
   2          #include <stdarg.h>
   3          #include <stdio.h>
   4          
   5          #include "system.h"
   6          #include "compiler.h"
   7          #include "lcd.h"
   8          #include "dot.h"
   9          
  10          char etxt[40];  
  11          
  12          void lprintf(Uchar Ox,Uchar Oy,unsigned char att,char * fmt, ...) 
  13          {
  14   1        va_list arg_ptr;
  15   1        va_start (arg_ptr, fmt); //规格化字符串
  16   1        vsprintf (etxt, fmt, arg_ptr);
  17   1        dprintf (Ox, Oy, etxt,att)  //汉字字母混合显示
  18   1        va_end (arg_ptr);
  19   1      }
  20          
  21          // 写指令代码子程序
  22          void vComToLcd( Uchar ComByte ) 
  23          {
  24   1        vLcdCmdPort(ComByte);
  25   1      }
  26          
  27          // 写参数及显示数据子程序
  28          void vDataToLcd( Uchar dataW )
  29          {
  30   1        vLcdDataPort(dataW);
  31   1      }
  32          
  33          /*=====================================
  34           初始化子程序
  35          ======================================*/
  36          void vInitLcd( void ) {
  37   1      
  38   1              Uchar i;
  39   1                      
  40   1              vComToLcd( SystemSet );                 // 系统参数设置
  41   1              for (i=0;i<8;i++) {                             
  42   2                      vDataToLcd( ParaSysTable8[i] ); //
  43   2              }
  44   1      
  45   1              vComToLcd( Scroll );                    //设定显示区域起始地址
  46   1              for (i=0;i<10;i++) {
  47   2                      vDataToLcd( ParaScrTableA[i] );
  48   2              }
  49   1      
  50   1              vComToLcd( HdotScr );           // 写入点位移指令代码
  51   1              vDataToLcd( 0 );                        // 写入P1参数
  52   1              vComToLcd( Ovlay );                     // 显示合成方式设置
  53   1              vDataToLcd( 0x0c );             // 0000 0100 显示一区三区图形,二重"或"合成
  54   1              vComToLcd( DispOn );            // 写入指令代码
  55   1              vDataToLcd( 0x54 );                     // 显示 1~4 区开显示,光标关显示
C51 COMPILER V8.01   LCD                                                                   12/04/2006 10:50:22 PAGE 2   

  56   1      }
  57          
  58          /*==============================================================================
  59          ; 汉字写入子程序(图形方式)。每次调用输出一个汉字
  60          ; 支持图形方式使用,完成汉字点阵码的输出。
  61          ; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
  62                                  Ptr......汉字码,库内的排列编码,大型程序时请改用Uint类型
  63          ; 无返回数据。
  64           ==============================================================================*/
  65          void vDrawLogo(Uchar mOx, Uchar mOy, Uint mLogoWidth, Uchar mLogoHigh, Uchar mPosion) 
  66          {
  67   1              unsigned int  DotPtr,Optr;
  68   1              unsigned char ColCount,RowCount,mByte;
  69   1              
  70   1              DotPtr = 0;     
  71   1              Optr = (Uint)mOy*paraP9 + mOx;     //显示单元起始位置
  72   1              if(mPosion)Optr += ((Uint)BasePart2)<<8; //指向第二区加上第二区首地址
  73   1              mByte = (Uchar)(mLogoWidth/8);                     //一行显示字节
  74   1      
  75   1              for(RowCount=0;RowCount<mLogoHigh;RowCount++)   
  76   1              {
  77   2                      //光标起点定位
  78   2                      vComToLcd(CsrW);                           //光标定位指令
  79   2                      vDataToLcd((Uchar)(Optr&0xff));    //设置光标地址CSR
  80   2                      vDataToLcd((Uchar)(Optr/256 ));    
  81   2              
  82   2                      vComToLcd(CsrDirR);                            //光标自动右移。
  83   2              
  84   2                      //显示一行
  85   2                      vComToLcd(mWrite);                                 //数据写指令
  86   2                      for (ColCount=0;ColCount<mByte;ColCount++) 
  87   2                      {
  88   3                              vDataToLcd(CdotLogolib[DotPtr]);         //写入数据
  89   3                              DotPtr++;
  90   3                      }
  91   2                  Optr += 0x28;
  92   2              }
  93   1              
  94   1      }
  95          
  96          void vClearLcd( void ) 
  97          {
  98   1          Uint lcd_ram = 0x2580;
  99   1              vComToLcd( CsrDirR );           // 光标移动方向定义:自动右移
 100   1              vComToLcd( CsrW );                      // 光标Locate,定位
 101   1              vDataToLcd(0);                          // 写入参数CSRL设置参数光标指针低8位
 102   1              vDataToLcd(0);                          // 写入参数CSRH设置参数光标指针高8位
 103   1              vComToLcd( mWrite );            // 数据写入指令,代码0x42
 104   1              while(lcd_ram--)        
 105   1              {
 106   2                      vDataToLcd( 0x0 );          // 写入数据0
 107   2              }
 108   1      
 109   1              lcd_ram = 0x2580;
 110   1              vComToLcd( CsrDirR );           // 光标移动方向定义:自动右移
 111   1              vComToLcd( CsrW );                      // 光标Locate,定位
 112   1              vDataToLcd(0x00);                       // 写入参数CSRL设置参数光标指针低8位
 113   1              vDataToLcd(0x40);                       // 写入参数CSRH设置参数光标指针高8位
 114   1              vComToLcd( mWrite );            // 数据写入指令,代码0x42
 115   1              while(lcd_ram--)        
 116   1              {
 117   2                      vDataToLcd( 0x0 );          // 写入数据0
C51 COMPILER V8.01   LCD                                                                   12/04/2006 10:50:22 PAGE 3   

 118   2              }
 119   1      }
 120          
 121          /*============================================================================
 122           光标位定位,用于在1区图形方式下。
 123           输入参数约定: x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
 124                                          y...垂直方向以行线定位的坐标,可以定位到点单位。
 125                                          左上角约定坐标为( 0, 0 )
 126          
 127           ============================================================================*/
 128          void Locatexy(Uchar x,Uchar y, Uchar attribs) 
 129          {
 130   1          Uint temp;
 131   1              temp = (Uint)y*paraP9+x;
 132   1              if(attribs)temp += ((Uint)BasePart2)<<8;  // 如果需要就指向第二区,加上第二区首地址
 133   1              vComToLcd(CsrW);                                          // 光标Locate,定位
 134   1              vDataToLcd((Uchar)(temp & 0xff));             // 写入参数CSRL设置参数光标指针低8位
 135   1              vDataToLcd((Uchar)(temp /256 ));              // 写入参数CSRH设置参数光标指针高8位
 136   1      }
 137          
 138          /*=============================================================================
 139            ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数 
 140            输入参数约定:
 141                  x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
 142                                                                  
 143                  *ptr...字符串指针,本函数所指的是flash字串
 144                  att....显示区标志,0...第一区;1...第二区
 145            返回参数:输出字串长度,留意汉字一个算两个
 146            其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
 147          ==============================================================================*/
 148          Uchar dprintf(Uchar x,Uchar y, char *ptr, Uchar att)
 149          {
 150   1          Uchar  c1,c2;
 151   1              Uchar i,j,uLen,uRow,uCol,temp;
 152   1              Uint  k;
 153   1              uRow = x;
 154   1              uCol = y;
 155   1              uLen=0;
 156   1      
 157   1              vComToLcd( CsrDirD );                                           // 光标移动方向定义:自动下移
 158   1              Locatexy(uRow,uCol,att);                                                //起点定位
 159   1              while ( (Uchar)*(ptr+uLen) >= 0x10 ){uLen++;};  //探测字串长度
 160   1              i=0;
 161   1              while(i<uLen)
 162   1              {
 163   2                      c1 = ptr[i];
 164   2                      c2 = ptr[i+1];
 165   2      
 166   2      //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
 167   2                      if(c1 <=128)                                                            // ASCII
 168   2                      {
 169   3                              if (c1 >= 0x10) {
 170   4                                      vComToLcd( mWrite );                            // 写数据(命令)
 171   4                                      for(j=0;j<16;j++) vDataToLcd( ASC_MSK[(c1-0x20)*16 +j ]);
 172   4                              }
 173   3                              uRow++;                                                                 // 列数加1
 174   3                      }
 175   2                      else                                                                            // 中文
 176   2                      {
 177   3                              for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib[0]);j++)       // 查找定位
 178   3                              {
 179   4                                      if((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
C51 COMPILER V8.01   LCD                                                                   12/04/2006 10:50:22 PAGE 4   

 180   4                                              break;
 181   4                              }
 182   3                              for(k=0;k<2;k++)                                                // 分16行输出
 183   3                              {
 184   4                                      Locatexy(uRow+k,uCol,att);
 185   4                                      vComToLcd( mWrite );                            // 写数据(命令)
 186   4                                      for(temp=0;temp<16;temp++) vDataToLcd( Cdotlib[j].Msk[temp*2 + k]);
 187   4                              }
 188   3                              uRow +=2;                                                               // 光标右移一大格
 189   3                              i++;
 190   3                      }
 191   2                      if(uRow >= 40)                                                          // 光标后移
 192   2                      {
 193   3                              uCol += 16;                                                             // Y坐标
 194   3                              uRow = 0;                                                       // X坐标
 195   3                              if( uCol >= 240 ) uCol = 0;
 196   3                      }
 197   2      
 198   2                      Locatexy(uRow,uCol,att);
 199   2                      i++;
 200   2              }
 201   1              return uLen;                                                    //返回字串长度,汉字按2字节计算
 202   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    969    ----
   CONSTANT SIZE    =   5388    ----
   XDATA SIZE       =     40      70
   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 + -