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

📄 lcd.lst

📁 此文档是网上一款开发板的完整系统,内附有电路图纸!系统有完整的接口程式,包含了字符型LCD驱动,pc串口通讯程式,flash读写驱动程式,中文字库,ad芯片驱动程式,keyscan4*4扫描程式
💻 LST
字号:
C51 COMPILER V7.10   LCD                                                                   07/01/2005 09:26:59 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN lcd.OBJ
COMPILER INVOKED BY: D:\PROGRAM FILES\KEIL\C51\BIN\C51.EXE lcd.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //**********************************************************************************
   2          //本函数模块来自"51单片机世界",作者版主丁丁(聂小猛)。
   3          //主页地址http://www.mcu51.com
   4          //本程序为本站推出的"MCU51-63K仿真器"及"DX-51多功能试验板"而设计的,详情请到本站查看.
   5          //"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途
   6          //**********************************************************************************
   7          //点阵液晶模块上的汉字显示程序
   8          //可以显示全部一二级中文简体汉字
   9          //可以混显全角和半角,并自动转行
  10          #define uchar unsigned char
  11          #define uint  unsigned int
  12          #define ulong unsigned long
  13          #include <reg52.h>
  14          #include <absacc.h>
  15          #include "study.h"
  16          
  17          #define LCMD    XBYTE[0xAf00]           // 液晶数据口
  18          #define LCMC    XBYTE[0xAb00]           // 液晶命令口
  19          
  20          //#define LCMD          XBYTE[0x7fff]           // 数据口
  21          //#define LCMC          XBYTE[0x7bff]           // 命令口
  22          
  23          #define  LCD_DOT_X 98 // lcd 的宽点数
  24          #define  LCD_DOT_Y 54 //lcd 的高点数
  25          //定义光标范围,每个光标占用8*8点阵
  26          #define LCD_MAX_X 11 //每行字符, ( LCD_MAX_X +1 ) * 8 点
  27          #define LCD_MAX_Y 5 //共多少行,( LCD_MAX_Y +1 ) * 8  点
  28          //光标位置定义
  29          struct cursortype
  30          {
  31             uchar x;
  32             uchar y;
  33          };
  34          struct cursortype cursor;
  35          
  36          void wridata(uchar ch)
  37          {
  38   1      
  39   1              LCMD=ch;
  40   1      }
  41          void wricmd(uchar ch)
  42          {
  43   1      
  44   1              LCMC=ch;
  45   1      }
  46          
  47          //*******************************
  48          //改变LCD亮度
  49          //输入范围0-63
  50          void light(uchar n)
  51          {
  52   1              LCMC=0x81;
  53   1              LCMC=n;
  54   1      }
  55          //****************************
C51 COMPILER V7.10   LCD                                                                   07/01/2005 09:26:59 PAGE 2   

  56          //清屏
  57          //入口:ch=9会连带ICON一起清除,ch=8不清除ICON
  58          
  59          void cls(uchar ch)
  60          {
  61   1              uchar i,j;
  62   1      
  63   1              for(j=0x0;j<ch;j++)
  64   1              {
  65   2                      
  66   2                      wricmd(0xb0+j);//set page
  67   2                      wricmd(0x10);//set column msb
  68   2                      wricmd(0x0);//set column lsb
  69   2                      wricmd(0xe0);//set modify-read mode
  70   2                      for(i=0;i<132;i++)
  71   2                      {
  72   3                              
  73   3                              wridata(0x00);  //填满0即清屏
  74   3              }
  75   2                      wricmd(0xee);//reset modify-read mode
  76   2              }
  77   1      }
  78          
  79          
  80          
  81          
  82          show_asc(uchar ch);
  83          //***********************
  84          //初始化液晶
  85          uchar lcdlight=6; //motorola的液晶默认亮度为32,早期学习板132*64液晶的默认亮度为6
  86          void initlcd(void)
  87          {
  88   1              
  89   1      //初始化液晶0x2f,0x22,0x81,32,0x40,0xa0,0xc8,0xa2
  90   1      //      P2=0x00;     //P2作为总线时,其寄存器的值对总线没有影响。
  91   1                       //初始化为0,是为了更好的配合液晶的6800总线。motorola的液晶内部固定了6800总线方式。
  92   1                       //如果去掉这一句,motorola的液晶的最左边一列点将无法控制。
  93   1                                       //如果液晶是8080总线,则无需这样做。   
  94   1              wricmd(0x2f);//SET POWER CONTROL
  95   1              wricmd(0x20);//REGULATOR RESISTOR SELECT
  96   1              wricmd(0x81);
  97   1              wricmd(lcdlight);
  98   1              wricmd(0x40);//INITIAL DISPLAY LINE
  99   1              wricmd(0xa0);//ADC=0(SEG1~SEG132) 
 100   1              wricmd(0xc8);//SHL=0(COM1~COM64) 
 101   1              wricmd(0xa2);//SET 1/9 LCD BIAS
 102   1              LCMC=0xa6;//NORMAL DISPIAY SET
 103   1              cls(9);
 104   1              wricmd(0xaf);//DISPIAY ON
 105   1              setcursor(0,0);//设置光标到左上角
 106   1      }
 107          
 108          //**********************************************************
 109          //在当前光标位置显示一个12*6 点阵的ASC码字符
 110          //入口:asc字符的值ch
 111          show_asc(uchar ch)
 112          {
 113   1              uint addr;
 114   1              uchar hzdata[16];
 115   1              uchar xdot,i;
 116   1              addr=16*ch;  //寻址点阵在flash中的物理位置
 117   1      
C51 COMPILER V7.10   LCD                                                                   07/01/2005 09:26:59 PAGE 3   

 118   1              readeprom(addr,hzdata,16); //读出16个字节的点阵数据
 119   1              xdot=cursor.x*8;                        //计算出横向点位置
 120   1              wricmd(0xb0+cursor.y);    //将y位置送入液晶
 121   1              wricmd(xdot & 0x0f);            //将x位置送入液晶
 122   1              wricmd( 0x10 | (xdot >> 4 ));   
 123   1              wricmd(0xe0);
 124   1              for(i=0;i<8;i++)
 125   1              {
 126   2                      wridata(hzdata[i]);                     //写上半个字符
 127   2              }
 128   1              wricmd(0xee);
 129   1              wricmd(0xb0+cursor.y+1); 
 130   1              wricmd(xdot & 0x0f);
 131   1              wricmd(0x10 | (xdot >> 4 ));   
 132   1              wricmd(0xe0);
 133   1              for(;i<16;i++)                          //写下半个字符
 134   1              {
 135   2                      wridata(hzdata[i]);
 136   2              }
 137   1              wricmd(0xee);
 138   1      }
 139          //*************************************
 140          //在当前光标位置显示一个16*16 汉字或者全角字符
 141          //入口:该汉字的区码ch1,和位码ch2
 142          show_hz(uchar ch1, uchar ch2)
 143          {
 144   1              ulong addr;
 145   1              uchar hzdata[32];
 146   1              uchar xdot,i;
 147   1              if (ch1>=0xb0)                  //寻址汉字在flash中的物理位置
 148   1              {
 149   2                      addr=(ch1-0xb0)*94+ ch2-0xa1;
 150   2                      addr=addr*32+0x5a40;
 151   2              }
 152   1              else
 153   1              {
 154   2                      addr=(ch1-0xa1)*94+ ch2-0xa1;
 155   2                      addr=addr*32+0x800;
 156   2              }
 157   1      
 158   1              readeprom(addr,hzdata,32); //读出32个汉字点阵数据
 159   1      
 160   1              xdot=cursor.x*8;                        //计算X位置
 161   1              wricmd(0xb0+cursor.y); 
 162   1              wricmd(xdot & 0x0f);
 163   1              wricmd( 0x10 | (xdot >> 4 ));   
 164   1              wricmd(0xe0);
 165   1              for(i=0;i<16;i++)                       //显示上半个汉字
 166   1              {
 167   2                      wridata(hzdata[i]);
 168   2              }
 169   1              wricmd(0xee);
 170   1              wricmd( 0xb0+cursor.y+1); 
 171   1              wricmd(xdot & 0x0f);
 172   1              wricmd( 0x10 | (xdot >> 4 ));   
 173   1              wricmd(0xe0);
 174   1              for(;i<32;i++)                          //显示下半个汉字
 175   1              {
 176   2                      wridata(hzdata[i]);
 177   2              }
 178   1              wricmd(0xee);
 179   1      }
C51 COMPILER V7.10   LCD                                                                   07/01/2005 09:26:59 PAGE 4   

 180          //*******************************************
 181          //设置光标位置
 182          //以6×6点阵为一个光标单位,
 183          //入口:x方向和y方向光标位置
 184          void setcursor(uchar x, uchar y)
 185          {
 186   1              if ( x<= LCD_MAX_X )
 187   1                      cursor.x= x;
 188   1              else
 189   1                      cursor.x= LCD_MAX_X;
 190   1      
 191   1              if ( y<= LCD_MAX_Y )
 192   1                      cursor.y= y;
 193   1              else
 194   1                      cursor.y= LCD_MAX_Y-1;
 195   1      }
 196          
 197          // **********************************
 198          //在光标位置显示字符串
 199          //入口:要显示的字符串
 200          void lcdstring( uchar *pst)
 201          {
 202   1              while ( *pst != 0 )
 203   1              {
 204   2                      if ( *pst < 0x80 ) //小于0x80是字符
 205   2              {
 206   3                   if (*pst==0x0a)  setcursor(0, cursor.y+2); //处理回车换行
 207   3                   else if (*pst== 0x0d) setcursor(0, cursor.y );
 208   3                   else
 209   3                   {
 210   4                                      show_asc(*pst);  //显示ASC字符
 211   4                                      cursor.x++;
 212   4                                      if (( cursor.x > LCD_MAX_X )&& (*(pst+1)!=0x0a)){cursor.x=0;cursor.y=cursor.y+2;}
 213   4                              }
 214   3                              pst++;  //下一个要显示的字符
 215   3                      }
 216   2                      else            //大于0x80是汉字
 217   2                      {
 218   3                              if ( cursor.x>= LCD_MAX_X )
 219   3                              {
 220   4                                      show_asc(0x20);   //一行的尾部只有半个汉字位置的处理,加一个空格,在下一行开始显示
 221   4                                      cursor.x=0;cursor.y=cursor.y+2;
 222   4                                      if (cursor.y> LCD_MAX_Y) cursor.y=0; //
 223   4                              }
 224   3                              show_hz(*pst, *(pst+1)); //显示一个汉字
 225   3                              cursor.x+=2;
 226   3                              pst+=2;
 227   3                              if ((cursor.x> LCD_MAX_X)&& (*(pst+1)!=0x0a)){cursor.x=0;cursor.y=cursor.y+2;}
 228   3                      }
 229   2                      if ( cursor.y> LCD_MAX_Y ){     cursor.x=0;cursor.y=0;return;}  
 230   2              }
 231   1      }
 232          //**********************************************
 233          //在当前光标以十进制方式在液晶上显示一个字节的值
 234          //入口:要显示的值
 235          lcddigit(uchar ch)
 236          {
 237   1              uchar i[4];
 238   1              i[0]=(0x30+ch/100);
 239   1              i[1]=(0x30+(ch%100)/10);
 240   1              i[2]=(0x30+ch%10);
 241   1              i[3]=0;   //添加结束符号
C51 COMPILER V7.10   LCD                                                                   07/01/2005 09:26:59 PAGE 5   

 242   1              lcdstring(i);
 243   1      }
 244          //***********************************
 245          //在当前光标显示一个ASC字符
 246          //入口:要显示的字符
 247          lcdchar(uchar ch)
 248          {
 249   1              uchar i[2];
 250   1              i[0]=ch;
 251   1              i[1]=0; //添加结束符号
 252   1              lcdstring(i);
 253   1      }
 254          
 255          


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