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

📄 8.3.lst

📁 LCD液晶显示器
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.09   8_3                                                                   08/23/2005 22:56:19 PAGE 1   


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

line level    source

   1          /*写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式。
   2          /*   TGLCMLIMIT64A接口程序(模拟方式) 
   3          ;***************************************************************************
   4          ;连线图:
   5          ;*LCM---89C52*  *LCM---89C52*   *LCM-------89C52*     *LCM----------89C52* *
   6          ;*DB0---P0.0*   *DB4---P0.4*    *D/I-------P2.6*      *CS1----------P2.4*  *
   7          ;*DB1---P0.1*   *DB5---P0.5*    *R/W-------P2.7*      *CS2----------P2.5*  *
   8          ;*DB2---P0.2*   *DB6---P0.6*    *RST--------VCC*      *CS3----------P3.2*  * 
   9          ;*DB3---P0.3*   *DB7---P0.7*    *E---------P2.3*                           *
  10          ;注:89C52的晶振频率为12MHz                                                 *
  11          ;***************************************************************************/
  12          //画线部分请参照avr的c程序。
  13          /*#pragma src   /*生成ASM文件开关,必要时打开 */
  14          #include<reg52.h>
  15          #include<math.h>
  16          #include<INTRINS.H>
  17          
  18          #define Uchar unsigned char
  19          
  20          /***********液晶显示器接口引脚定义***************/
  21          
  22          sbit Elcm= P2^3;  //
  23          sbit CS1LCM= P2^4;  //
  24          sbit CS2LCM= P2^5;  //
  25          sbit CS3LCM= P3^2;  /*这个连接只是做实验的临时接法。*/
  26          sbit Dilcm= P2^6;  //
  27          sbit Rwlcm= P2^7;  //
  28          sfr Datalcm= 0x80;  //数据口
  29          
  30          /***********常用操作命令和参数定义***************/
  31          #define  DISPON  0x3f /*显示on  */
  32          #define  DISPOFF 0x3e /*显示off  */
  33          #define  DISPFIRST 0xc0 /*显示起始行定义 */
  34          #define  SETX  0x40 /*X定位设定指令(页) */
  35          #define  SETY  0xb8 /*Y定位设定指令(列) */
  36          #define  Lcdbusy 0x80 /*LCM忙判断位  */
  37          
  38          /**************显示分区边界位置*****************/
  39          #define  MODL  0x00 /*左区   */
  40          #define  MODM  0x40 /*左区和中区分界 */
  41          #define  MODR  0x80 /*中区和右区分界 */
  42          #define LCMLIMIT 0xC0 /*显示区的右边界 */
  43          
  44          /****************全局变量定义*******************/
  45          Uchar col,row,cbyte;  /*列x,行(页)y,输出数据 */
  46          bit xy;    /*画线方向标志:1水平 */
  47          
  48          /*****************函数列表**********************/
  49          void Lcminit(void);  /*液晶模块初始化 */
  50          void Delay(Uchar);  /*延时,入口数为Ms */
  51          void lcdbusyL(void);  /*busy判断、等待(左区) */
  52          void lcdbusyM(void);  /*busy判断、等待(中区) */
  53          void lcdbusyR(void);  /*busy判断、等待(右区) */
  54          void Putedot(Uchar);  /*半角字符输出  */
  55          void Putcdot(Uchar);  /*全角(汉字)输出 */
C51 COMPILER V7.09   8_3                                                                   08/23/2005 22:56:19 PAGE 2   

  56          void Wrdata(Uchar);  /*数据输出给LCM  */
  57          void Lcmcls( void );  /*LCM全屏幕清零(填充0) */
  58          void wtcom(void);  /*公用busy等待  */
  59          void Locatexy(void);  /*光标定位  */
  60          void WrcmdL(Uchar);  /*左区命令输出  */
  61          void WrcmdM(Uchar);  /*中区命令输出  */
  62          void WrcmdR(Uchar);  /*右区命令输出  */
  63          void Putstr(Uchar *puts,Uchar i); /*中英文字符串输出 */
  64          void Rollscreen(Uchar x); /*屏幕向上滚动演示 */
  65          void Rddata(void);  /*  从液晶片上读数据 */
  66          void Linehv(Uchar length); /*横(竖)方向画线 */
  67          void point(void);  /*打点   */
  68          void Linexy(Uchar endx,Uchar endy);
  69          
  70          /******************数组列表*********************/
  71          Uchar code Ezk[];  /*ASCII常规字符点阵码表 */
  72          Uchar code Hzk[];  /*自用汉字点阵码表 */
  73          Uchar code STR1[];  /*自定义字符串  */
  74          Uchar code STR2[];  //
  75          Uchar code STR3[];  //
  76          Uchar code STR4[];  //
  77          
  78          
  79          /********************************/
  80          /* 演示主程序   */
  81          /********************************/
  82          void main(void)
  83          
  84          {
  85   1        Uchar x;
  86   1       col=0;
  87   1       row=0;
  88   1       Delay(40);  /*延时大约40Ms,等待外设准备好 */
  89   1       Lcminit();  /*液晶模块初始化,包括全屏幕清屏*/
  90   1       Putstr(STR2,24); /*第一行字符输出,24字节 */
  91   1       col=0;
  92   1       row=2;
  93   1       Putstr(STR1,12); /*第二行字符输出,12字节 */
  94   1       col=0;
  95   1       row=4;
  96   1       Putstr(STR3,24); /*第三行字符输出,24字节 */
  97   1       col=0;
  98   1       row=6;
  99   1       Putstr(STR4,24); /*第四行字符输出,12字节 */
 100   1       x=0;
 101   1       col=0;
 102   1       row=0;
 103   1       xy = 1;   /*方向标志。定为水平方向 */
 104   1       Linehv(192);  /*画一条横线(0,0)-(191,0) */
 105   1       col=0;
 106   1       row=15;
 107   1       xy = 1;
 108   1       Linehv(192);  /*画一条横线(0,15)-(191,15) */
 109   1       col=0;
 110   1       row=32;
 111   1       xy = 1;
 112   1       Linehv(192);  /*画一条横线(0,32)-(191,32) */
 113   1       col=0;
 114   1       row=1;
 115   1       xy = 0;   /*方向标志。定为垂直方向 */
 116   1       Linehv(31);  /*画一条竖线(0,1)-(0,31) */
 117   1       col=191;
C51 COMPILER V7.09   8_3                                                                   08/23/2005 22:56:19 PAGE 3   

 118   1       row=1;
 119   1       xy = 0;
 120   1       Linehv(31);  /*画一条竖线(191,1)-(191,31) */
 121   1       col=0;   /*设定斜线的起点坐标  */
 122   1       row=63;
 123   1       Linexy(44,31);  /*画一段斜线(0,63)-(44,31) */
 124   1       col=44;
 125   1       row=31;
 126   1       Linexy(190,62);  /*继续画斜线(44,31)-(191,63) */
 127   1       while(1){
 128   2        Rollscreen(x); /*定位新的显示起始行 */
 129   2        x++;
 130   2        Delay(100); /*延时,控制滚动速度 */
 131   2        };
 132   1      }
 133          
 134          
 135          /************************************************/
 136          /*画线。任意方向的斜线,不支持垂直的或水平线 */
 137          /************************************************/
 138          
 139          void Linexy(Uchar endx,Uchar endy)
 140          {
 141   1       register Uchar t;
 142   1       int xerr=0,yerr=0,delta_x,delta_y,distance;
 143   1       Uchar incx,incy;
 144   1      
 145   1      /*  compute the distance in both directions */
 146   1       delta_x=endx-col;
 147   1       delta_y=endy-row;
 148   1      
 149   1      /* compute  the direction of the increment ,
 150   1       an increment of "0" means either a vertical or horizontal lines */
 151   1      
 152   1       if(delta_x>0) incx=1;
 153   1       else if( delta_x==0 ) incx=0;
 154   1        else incx=-1;
 155   1      
 156   1      
 157   1       if(delta_y>0) incy=1;
 158   1       else if( delta_y==0 ) incy=0;
 159   1        else incy=-1;
 160   1      
 161   1      /*  determine which distance is greater */
 162   1       delta_x = cabs( delta_x );
 163   1       delta_y = cabs( delta_y );
 164   1      
 165   1       if( delta_x > delta_y ) distance=delta_x;
 166   1       else distance=delta_y;
 167   1      
 168   1      /* draw the line */
 169   1       for( t=0;t <= distance+1; t++ ) {
 170   2        point();
 171   2           xerr += delta_x ;
 172   2        yerr += delta_y ;
 173   2        if( xerr > distance ) {
 174   3         xerr-=distance;
 175   3             col+=incx;
 176   3        }
 177   2        if( yerr > distance ) {
 178   3         yerr-=distance;
 179   3             row+=incy;
C51 COMPILER V7.09   8_3                                                                   08/23/2005 22:56:19 PAGE 4   

 180   3        }
 181   2      
 182   2       }
 183   1      }
 184          
 185          /****************************************/
 186          /*画线。只提供X或Y方向的,不支持斜线 */
 187          /****************************************/
 188          void Linehv(Uchar length)
 189           {
 190   1        Uchar xs,ys;
 191   1        if (xy){ys = col;
 192   2         for (xs=0;xs<length;xs++){
 193   3           col = ys + xs;
 194   3           point();}
 195   2          }
 196   1        else {xs = row;
 197   2         for (ys=0;ys<length;ys++){
 198   3           row = xs + ys;
 199   3           point();}
 200   2          }
 201   1      }
 202          
 203          /****************************************/
 204          /* 画点    */
 205          /****************************************/
 206          
 207          void point(void)
 208           {
 209   1        Uchar x1,y1,x,y;
 210   1        x1=col;
 211   1        y1=row;
 212   1        row=y1>>3;  /*取Y方向分页地址 */
 213   1        Rddata();
 214   1        y=y1&0x07;  /*字节内位置计算 */
 215   1        x=0x01;
 216   1        x=x<<y;   /*移入所画点  */
 217   1        Wrdata(cbyte|x); /*画上屏幕  */
 218   1        col=x1;   /*恢复xy坐标  */
 219   1        row=y1;
 220   1       }
 221          
 222          /****************************************/
 223          /* 屏幕滚动定位   */
 224          /****************************************/
 225          void Rollscreen(Uchar x)
 226           {
 227   1        cbyte = DISPFIRST|x; /*定义显示起始行为x?*/
 228   1        WrcmdL(cbyte);
 229   1        WrcmdM(cbyte);
 230   1        WrcmdR(cbyte);
 231   1       }
 232          
 233          /****************************************/
 234          /* 一个字串的输出   */
 235          /****************************************/
 236          void Putstr(Uchar *puts,Uchar i)
 237           {
 238   1        Uchar j,X;
 239   1        for (j=0;j<i;j++)
 240   1        {
 241   2        X = puts[j];
C51 COMPILER V7.09   8_3                                                                   08/23/2005 22:56:19 PAGE 5   

 242   2         if (X&0x80)
 243   2          {
 244   3           Putcdot(X&0x7f); /*只保留低7位*/
 245   3          }
 246   2         else Putedot(X-0x20);  /*ascii码表从0x20开始*/
 247   2        }
 248   1       }
 249          
 250          /****************************************/
 251          /*   半角字符点阵码数据输出  */
 252          /****************************************/
 253          void Putedot(Uchar Order)
 254           {
 255   1       Uchar i,bakerx,bakery; /*共定义4个局部变量   */
 256   1       int x;   /*偏移量,字符量少的可以定义为UCHAR */
 257   1       bakerx = col;  /*暂存x,y坐标,已备下半个字符使用 */
 258   1       bakery = row;
 259   1       x=Order * 0x10;  /*半角字符,每个字符16字节 */
 260   1      /*上半个字符输出,8列 */
 261   1       for(i=0;i<8;i++)
 262   1        {
 263   2        cbyte = Ezk[x];    /*取点阵码,rom数组 */
 264   2        Wrdata(cbyte);    /*写输出一字节  */
 265   2        x++;
 266   2        col++;
 267   2        if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界换行*/
 268   2         if (row>7) row=0;  /*如果行越界,返回首行 */
 269   2        }     /*上半个字符输出结束 */
 270   1      
 271   1       col = bakerx;     /*列对齐  */
 272   1       row = bakery+1;     /*指向下半个字符行 */
 273   1      /*下半个字符输出,8列 */
 274   1       for(i=0;i<8;i++)
 275   1        {
 276   2        cbyte = Ezk[x];    /*取点阵码  */
 277   2        Wrdata(cbyte);    /*写输出一字节  */
 278   2        x++;
 279   2        col++;
 280   2        if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
 281   2         if (row>7) row=1;  /*如果行越界,返回首行 */
 282   2        }     /*下半个字符输出结束 */
 283   1       row=bakery;
 284   1       }      /*整个字符输出结束 */
 285          
 286          
 287          /****************************************/
 288          /*  全角字符点阵码数据输出  */
 289          /****************************************/
 290          void Putcdot(Uchar Order)
 291           {
 292   1       Uchar i,bakerx,bakery;  /*共定义3个局部变量  */
 293   1       int x;    /*偏移量,字符量少的可以定义为UCHAR */
 294   1       bakerx = col;   /*暂存x,y坐标,已备下半个字符使用 */
 295   1       bakery = row;
 296   1       x=Order * 0x20;   /*每个字符32字节 */
 297   1       
 298   1      /*上半个字符输出,16列 */
 299   1       for(i=0;i<16;i++)
 300   1        {
 301   2        Wrdata(Hzk[x]);    /*写输出一字节  */

⌨️ 快捷键说明

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