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

📄 lcd.lst

📁 128×64液晶屏显示汉字
💻 LST
字号:
C51 COMPILER V7.06   LCD                                                                   10/25/2006 10:30:16 PAGE 1   


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

stmt level    source

   1          /*******************************************************************************
   2          程序名称:LCD驱动程序
   3          显示功能:显示ASCII码
   4          硬件接法:D/I---------A0
   5                    R/W---------A1
   6                    E-----------读写0xA000~0xA003时,选中
   7                    CSA---------(前半屏选通,低电平有效)
   8                    CSB---------(后半屏选通,低电平有效)
   9                    DB0~DB7----D0~D7
  10          *******************************************************************************/
  11          
  12          
  13          #include "Lcd.h"
  14          #include "ASCII.h"
  15          #include "HanZi.h"
  16          #include "uniondef.h"
  17          
  18          
  19          //定义I/O接口
  20          unsigned char bdata XIO = 0;
  21          #define LCD_SET_CSA()   {XIO|=0x10;XBYTE[0x8000]=XIO;}
  22          #define LCD_CLR_CSA()   {XIO&=0xEF;XBYTE[0x8000]=XIO;}
  23          #define LCD_SET_CSB()   {XIO|=0x20;XBYTE[0x8000]=XIO;}
  24          #define LCD_CLR_CSB()   {XIO&=0xDF;XBYTE[0x8000]=XIO;}
  25          
  26          
  27          /*******************************************************************************
  28          函数:LcdWaitBusy()
  29          功能:读取LCD的Busy标志,如果LCD忙则等待,如果空闲则返回
  30          说明:每次操作之前都应当确认LCD处于空闲状态
  31          *******************************************************************************/
  32          void LcdWaitBusy()
  33          {
  34   1              while ( (XBYTE[0xA002] & 0x80) != 0 );
  35   1      }
  36          
  37          
  38          /*******************************************************************************
  39          函数:LcdOn()
  40          功能:打开LCD显示
  41          *******************************************************************************/
  42          void LcdOn()
  43          {
  44   1              LcdWaitBusy();
  45   1              XBYTE[0xA000] = 0x3F;
  46   1      }
  47          
  48          
  49          /*******************************************************************************
  50          函数:LcdOff()
  51          功能:关闭LCD显示
  52          *******************************************************************************/
  53          void LcdOff()
  54          {
  55   1              LcdWaitBusy();
C51 COMPILER V7.06   LCD                                                                   10/25/2006 10:30:16 PAGE 2   

  56   1              XBYTE[0xA000] = 0x3E;
  57   1      }
  58          
  59          
  60          /*******************************************************************************
  61          函数:LcdStartLine()
  62          功能:设置显示起始行
  63          参数:line是行号,取值0~63
  64          *******************************************************************************/
  65          void LcdStartLine(unsigned char line)
  66          {
  67   1              LcdWaitBusy();
  68   1              XBYTE[0xA000] = line | 0xC0;
  69   1      }
  70          
  71          
  72          /*******************************************************************************
  73          函数:LcdSetP()
  74          功能:设置页地址
  75          参数:page取值0~7
  76          *******************************************************************************/
  77          void LcdSetP(unsigned char page)
  78          {
  79   1              LcdWaitBusy();
  80   1              XBYTE[0xA000] = (page & 0x07) | 0xB8;
  81   1      }
  82          
  83          
  84          /*******************************************************************************
  85          函数:LcdSetY()
  86          功能:设置Y地址
  87          参数:y取值0~63
  88          *******************************************************************************/
  89          void LcdSetY(unsigned char y)
  90          {
  91   1              LcdWaitBusy();
  92   1              XBYTE[0xA000] = (y & 0x3F) | 0x40;
  93   1      }
  94          
  95          
  96          /*******************************************************************************
  97          函数:LcdWriteDat()
  98          功能:写显示数据
  99          参数:dat为显示数据
 100          说明:写完后,Y地址自动加1
 101          *******************************************************************************/
 102          void LcdWriteDat(unsigned char dat)
 103          {
 104   1              LcdWaitBusy();
 105   1              XBYTE[0xA001] = dat;
 106   1      }
 107          
 108          
 109          /*******************************************************************************
 110          函数:LcdReadDat()
 111          功能:读显示数据
 112          返回:读到的数据
 113          *******************************************************************************/
 114          /*
 115          unsigned char LcdReadDat()
 116          {
 117                  LcdWaitBusy();
C51 COMPILER V7.06   LCD                                                                   10/25/2006 10:30:16 PAGE 3   

 118                  return XBYTE[0xA003];
 119          }
 120          */
 121          
 122          
 123          void _LcdClear_()
 124          {
 125   1              unsigned char p,y;
 126   1              for ( p=0; p<8; p++ )
 127   1              {
 128   2                      LcdSetP(p);
 129   2                      LcdSetY(0);
 130   2                      for ( y=0; y<64; y++ )
 131   2                      {
 132   3                              LcdWriteDat(0x00);
 133   3                      }
 134   2              }
 135   1      }
 136          
 137          
 138          //定义光标的横纵坐标
 139          unsigned char LcdCursorX;
 140          unsigned char LcdCursorY;
 141          
 142          
 143          /*******************************************************************************
 144          函数:LcdGotoXY()
 145          功能:把光标移到(x,y)处
 146          参数:(x,y)为屏幕坐标,x=0~15,y=0~4
 147          *******************************************************************************/
 148          void LcdGotoXY(unsigned char x, unsigned char y)
 149          {
 150   1              LcdCursorX = x & 0x0F;
 151   1              LcdCursorY = y & 0x03;
 152   1      }
 153          
 154          
 155          /*******************************************************************************
 156          函数:LcdClear()
 157          功能:LCD清屏
 158          *******************************************************************************/
 159          void LcdClear()
 160          {
 161   1              LCD_CLR_CSA();
 162   1              _LcdClear_();
 163   1              LCD_SET_CSA();
 164   1              LCD_CLR_CSB();
 165   1              _LcdClear_();
 166   1              LCD_SET_CSB();
 167   1              LcdCursorX = 0;
 168   1              LcdCursorY = 0;
 169   1      }
 170          
 171          
 172          /*******************************************************************************
 173          函数:LcdInit()
 174          功能:LCD初始化
 175          *******************************************************************************/
 176          void LcdInit()
 177          {
 178   1              LCD_SET_CSA();
 179   1              LCD_SET_CSB();
C51 COMPILER V7.06   LCD                                                                   10/25/2006 10:30:16 PAGE 4   

 180   1              LcdStartLine(0);
 181   1              LcdClear();
 182   1              LcdOn();
 183   1      }
 184          
 185          
 186          /*******************************************************************************
 187          函数:LcdPutchar()
 188          功能:在LCD上显示ASCII码
 189          *******************************************************************************/
 190          void LcdPutchar(unsigned char c)
 191          {
 192   1              unsigned char i;
 193   1              unsigned char n;
 194   1              unsigned char code *p;
 195   1      //检查是否为可显示字符
 196   1              if ( c < ' ' )  //如果是控制字符
 197   1              {
 198   2                      if ( c == '\r' )        //如果是回车符
 199   2                      {
 200   3                              LcdCursorX = 0;
 201   3                      }
 202   2                      else if ( c == '\n' )   //如果是换行符
 203   2                      {
 204   3                              LcdCursorY++;
 205   3                              if ( LcdCursorY >= 4 )
 206   3                              {
 207   4                                      LcdCursorY = 0;
 208   4                              }
 209   3                      }
 210   2                      return;
 211   2              }
 212   1      //计算字符点阵位置
 213   1              p = ASCII_TAB + (c - ' ') * 16;
 214   1      //确定显示位置在左半屏还是右半屏
 215   1              if ( LcdCursorX < 8 )
 216   1              {
 217   2                      LCD_CLR_CSB();
 218   2      //              x = 0;
 219   2              }
 220   1              else
 221   1              {
 222   2                      LCD_CLR_CSA();
 223   2      //              x = 64;
 224   2              }
 225   1      //显示ASCII码
 226   1              for ( i=0; i<2; i++ )
 227   1              {
 228   2                      LcdSetP(LcdCursorY*2+i);        //设置页地址
 229   2                      LcdSetY(LcdCursorX*8);          //设置Y地址
 230   2                      n = 8;
 231   2                      do
 232   2                      {
 233   3                              LcdWriteDat(*p++);              //写入显示数据
 234   3                      } while ( --n != 0 );
 235   2              }
 236   1      //取消选中
 237   1              if ( LcdCursorX < 8 )
 238   1              {
 239   2                      LCD_SET_CSB();
 240   2              }
 241   1              else
C51 COMPILER V7.06   LCD                                                                   10/25/2006 10:30:16 PAGE 5   

 242   1              {
 243   2                      LCD_SET_CSA();
 244   2              }
 245   1      //光标移到下个位置
 246   1              LcdCursorX++;
 247   1              if ( LcdCursorX >= 16 )
 248   1              {
 249   2                      LcdCursorX = 0;
 250   2                      LcdCursorY++;
 251   2                      if ( LcdCursorY >= 4 )
 252   2                      {
 253   3                              LcdCursorY = 0;
 254   3                      }
 255   2              }
 256   1      }
 257          
 258          
 259          //显示汉字(小汉字库汉字编码:0x8000~0x80FF)
 260          void LcdPutHZ(unsigned char ch, unsigned char cl)
 261          {
 262   1              unsigned char i;
 263   1              unsigned char n;
 264   1              unsigned char code *p;
 265   1              UnionInt hz;
 266   1              hz.CharPart.H = ch;
 267   1              hz.CharPart.L = cl;
 268   1              hz.i -= 0x8000;
 269   1      //计算字符点阵位置
 270   1              p = HanZi_TAB + hz.i * 32;
 271   1      //确定显示位置在左半屏还是右半屏
 272   1              if ( LcdCursorX < 8 )
 273   1              {
 274   2                      LCD_CLR_CSB();
 275   2              }
 276   1              else
 277   1              {
 278   2                      LCD_CLR_CSA();
 279   2              }
 280   1      //显示汉字
 281   1              for ( i=0; i<2; i++ )
 282   1              {
 283   2                      LcdSetP(LcdCursorY*2+i);        //设置页地址
 284   2                      LcdSetY(LcdCursorX*8);          //设置Y地址
 285   2                      n = 16;
 286   2                      do
 287   2                      {
 288   3                              LcdWriteDat(*p++);              //写入显示数据
 289   3                      } while ( --n != 0 );
 290   2              }
 291   1      //取消选中
 292   1              if ( LcdCursorX < 8 )
 293   1              {
 294   2                      LCD_SET_CSB();
 295   2              }
 296   1              else
 297   1              {
 298   2                      LCD_SET_CSA();
 299   2              }
 300   1      //光标移到下个位置
 301   1              LcdCursorX += 2;
 302   1              if ( LcdCursorX >= 16 )
 303   1              {
C51 COMPILER V7.06   LCD                                                                   10/25/2006 10:30:16 PAGE 6   

 304   2                      LcdCursorX = 0;
 305   2                      LcdCursorY++;
 306   2                      if ( LcdCursorY >= 4 )
 307   2                      {
 308   3                              LcdCursorY = 0;
 309   3                      }
 310   2              }
 311   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    469    ----
   CONSTANT SIZE    =   2208    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       2
   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 + -