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

📄 5.2.3-1.lst

📁 汽车通讯控制程序 电子屏字符显示器
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   5_2_3_1                                                               06/13/2005 17:14:18 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 5_2_3_1
OBJECT MODULE PLACED IN 5.2.3-1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 5.2.3-1.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include<reg51.h>
   2          #include<math.h>
   3          #include<INTRINS.H>
   4          #define Uchar unsigned char
   5          /*注:8031的晶振频率为12MHz*/
   6          /***********液晶显示器接口引脚定义***************/
   7          sbit    Elcm=P2^7;      
   8          sbit    CSALCM= P2^2;
   9          sbit    CSBLCM= P2^3;
  10          sbit    Dilcm=P2^0;
  11          sbit    Rwlcm=P2^1;
  12          sfr     Datalcm=0x80;                           /*数据口*/
  13          /***********常用操作命令和参数定义***************/
  14          #define  DISPON         0x3f            /*显示on*/
  15          #define  DISPOFF                0x3e            /*显示off       */
  16          #define  DISPFIRST      0xc0            /*显示起始行定义*/
  17          #define  SETX           0x40            /*X定位设定指令(页)*/
  18          #define  SETY           0xb8            /*Y定位设定指令(列)*/
  19          #define  Lcdbusy                0x80            /*LCM忙判断位*/
  20          
  21          /**************显示分区边界位置*****************/
  22          #define  MODL           0x00            /*左区*/
  23          #define  MODM           0x40            /*左区和中区分界*/
  24          #define  MODR           0x80            /*中区和右区分界*/
  25          #define LCMLIMIT        0xC0            /*显示区的右边界*/
  26          
  27          /****************全局变量定义*******************/
  28          Uchar col,row,cbyte;                            /*列x,行(页)y,输出数据*/
  29          bit xy;                                         /*画线方向标志:1水平*/
  30          
  31          /*****************函数列表**********************/
  32          void Lcminit(void);                             /*液晶模块初始化*/
  33          void Delay(Uchar);                              /*延时,入口数为Ms      */
  34          void lcdbusyL(void);                            /*busy判断、等待(左区)*/
  35          void lcdbusyM(void);                            /*busy判断、等待(中区)*/
  36          void lcdbusyR(void);                            /*busy判断、等待(右区)*/
  37          void Putedot(Uchar);                            /*半角字符输出*/
  38          void Putcdot(Uchar);                            /*全角(汉字)输出*/
  39          void Wrdata(Uchar);                             /*数据输出给LCM*/
  40          void Lcmcls( void );                            /*LCM全屏幕清零(填充0)  */
  41          void wtcom(void);                               /*公用busy等待*/
  42          void Locatexy(void);                            /*光标定位*/
  43          void WrcmdL(Uchar);                             /*左区命令输出  */
  44          void WrcmdM(Uchar);                             /*中区命令输出  */
  45          void WrcmdR(Uchar);                             /*右区命令输出  */
  46          void Putstr(Uchar *puts,Uchar i);               /*中英文字符串输出*/
  47          void Rollscreen(Uchar x);                       /*屏幕向上滚动*/
  48          void Rddata(void);                              /*从液晶片上读数据*/
  49          void Linehv(Uchar length);                      /*横(竖)方向画线*/
  50          void point(void);                                       /*打点*/
  51          void Linexy(Uchar endx,Uchar endy);
  52          
  53          /******************数组列表*********************/
  54          Uchar code Ezk[];                               /*ASCII常规字符点阵码表 */
  55          Uchar code Hzk[];                               /*自用汉字点阵码表*/
C51 COMPILER V7.06   5_2_3_1                                                               06/13/2005 17:14:18 PAGE 2   

  56          Uchar code STR1[];                              /*自定义字符串*/
  57          Uchar code STR2[];
  58          Uchar code STR3[];
  59          Uchar code STR4[];
  60          
  61          /****************************************主程序*****************************************/
  62          void main(void)
  63          {
  64   1              Uchar x;
  65   1              col=0;
  66   1              row=0;
  67   1              Delay(40);                                      /*延时大约40Ms,等待外设准备好*/
  68   1              Lcminit();                                      /*液晶模块初始化,包括全屏幕清屏*/
  69   1              Putstr(STR1,12);                                /*第一行字符输出,12字节*/
  70   1              col=0;
  71   1              row=2;
  72   1              Putstr(STR2,14);                                /*第二行字符输出,14字节*/
  73   1              col=0;
  74   1              row=4;
  75   1              Putstr(STR3,11);                                /*第三行字符输出,11字节*/
  76   1              col=0;
  77   1              row=6;
  78   1              Putstr(STR4,12);                                /*第四行字符输出,12字节*/
  79   1              x=0;
  80   1              col=0;
  81   1              row=0;
  82   1              xy = 1;                                 /*方向标志。定为水平方向*/
  83   1              Linehv(192);                            /*画一条横线(0,0)-(191,0)*/
  84   1              col=0;
  85   1              row=15;
  86   1              xy = 1;
  87   1              Linehv(192);                            /*画一条横线(0,15)-(191,15)*/
  88   1              col=0;
  89   1              row=32;
  90   1              xy = 1;
  91   1              Linehv(192);                            /*画一条横线(0,32)-(191,32)*/
  92   1              col=0;
  93   1              row=1;
  94   1              xy = 0;                                 /*方向标志。定为垂直方向*/
  95   1              Linehv(31);                             /*画一条竖线(0,1)-(0,31)*/
  96   1              col=191;
  97   1              row=1;
  98   1              xy = 0;
  99   1              Linehv(31);                             /*画一条竖线(191,1)-(191,31)*/
 100   1              col=0;                                  /*设定斜线的起点坐标*/
 101   1              row=63;
 102   1              Linexy(44,31);                          /*画一段斜线(0,63)-(44,31)      */
 103   1              col=44;
 104   1              row=31;
 105   1              Linexy(190,62);                         /*继续画斜线(44,31)-(191,63)*/
 106   1              while(1){
 107   2                      Rollscreen(x);                  /*定位新的显示起始行*/
 108   2                      x++;
 109   2                      Delay(100);                     /*延时,控制滚动速度*/
 110   2                      };
 111   1      }
 112          
 113          /***********************画线,任意方向的斜线,不支持垂直的或水平线***********************/
 114          void Linexy(Uchar endx,Uchar endy)
 115          {
 116   1              register Uchar t;
 117   1              int xerr=0,yerr=0,delta_x,delta_y,distance;
C51 COMPILER V7.06   5_2_3_1                                                               06/13/2005 17:14:18 PAGE 3   

 118   1              Uchar incx,incy;
 119   1              delta_x=endx-col;                       /*计算两个方向的距离*/
 120   1              delta_y=endy-row;
 121   1              if(delta_x>0) incx=1;                   /*计算增量方向,增量为0表示既不是垂直线也不是水平线*/
 122   1              else if( delta_x==0 ) incx=0;
 123   1                      else incx=-1;
 124   1              if(delta_y>0) incy=1;
 125   1              else if( delta_y==0 ) incy=0;
 126   1                      else incy=-1;
 127   1              delta_x = cabs( delta_x );              /* 判定哪个距离比较大*/
 128   1              delta_y = cabs( delta_y );
 129   1              if( delta_x > delta_y ) distance=delta_x;
 130   1              else distance=delta_y;
 131   1      /*开始画线*/
 132   1              for( t=0;t <= distance+1; t++ ) {
 133   2                      point();
 134   2                 xerr += delta_x ;
 135   2                      yerr += delta_y ;
 136   2                      if( xerr > distance ) {
 137   3                              xerr-=distance;
 138   3                          col+=incx;
 139   3                      }
 140   2                      if( yerr > distance ) {
 141   3                              yerr-=distance;
 142   3                          row+=incy;
 143   3                      }
 144   2              }
 145   1      }
 146          
 147          /***************************画线,只提供X或Y方向的,不支持斜线*************************/
 148          void Linehv(Uchar length)
 149                  {
 150   1                      Uchar xs,ys;
 151   1                      if (xy){ys = col;
 152   2                              for (xs=0;xs<length;xs++){
 153   3                                              col = ys + xs;
 154   3                                              point();}
 155   2                                      }
 156   1                      else    {xs = row;
 157   2                              for (ys=0;ys<length;ys++)
 158   2      {
 159   3                                              row = xs + ys;
 160   3                                              point();}
 161   2                                       }
 162   1      }
 163          
 164          /*****************************************画点******************************************/
 165          void point(void)
 166                  {
 167   1                      Uchar x1,y1,x,y;
 168   1                      x1=col;
 169   1                      y1=row;
 170   1                      row=y1>>3;                      /*取Y方向分页地址*/
 171   1                      Rddata();
 172   1                      y=y1&0x07;                      /*字节内位置计算*/
 173   1                      x=0x01;
 174   1                      x=x<<y;                         /*移入所画点*/
 175   1                      Wrdata(cbyte|x);                        /*画上屏幕*/
 176   1                      col=x1;                         /*恢复xy坐标*/
 177   1                      row=y1;
 178   1              }
 179          
C51 COMPILER V7.06   5_2_3_1                                                               06/13/2005 17:14:18 PAGE 4   

 180          /**************************************屏幕滚动定位*************************************/
 181          void Rollscreen(Uchar x)
 182                  {
 183   1                      cbyte = DISPFIRST|x;            /*定义显示起始行为x?*/
 184   1                      WrcmdL(cbyte);
 185   1                      WrcmdM(cbyte);
 186   1                      WrcmdR(cbyte);
 187   1              }
 188          
 189          /**************************************一个字串的输出***********************************/
 190          void Putstr(Uchar *puts,Uchar i)
 191                  {
 192   1                      Uchar j,X;
 193   1                      for (j=0;j<i;j++)
 194   1                      {
 195   2                      X = puts[j];
 196   2                              if (X&0x80)
 197   2                                      {
 198   3                                              Putcdot(X&0x7f);/*只保留低7位*/
 199   3                                      }
 200   2                              else Putedot(X-0x20);           /*ascii码表从0x20开始*/
 201   2                      }
 202   1              }
 203          
 204          /*********************************半角字符点阵码数据输出********************************/
 205          void Putedot(Uchar Order)
 206                  {
 207   1              Uchar i,bakerx,bakery;                  /*共定义4个局部变量*/
 208   1              int x;                                          /*偏移量,字符量少的可以定义为UCHAR     */
 209   1              bakerx = col;                           /*暂存x,y坐标,已备下半个字符使用*/
 210   1              bakery = row;
 211   1              x=Order * 0x10;                         /*半角字符,每个字符16字节*/
 212   1      /*上半个字符输出,8列*/
 213   1              for(i=0;i<8;i++)
 214   1                      {
 215   2                      cbyte = Ezk[x];                 /*取点阵码,rom数组*/

⌨️ 快捷键说明

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