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

📄 5.2.3-1.lst

📁 61202控制的12864液显程序,用在我的实际项目中,附接口原理图
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.10   5_2_3_1                                                               06/06/2004 11:46:18 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE 5_2_3_1
OBJECT MODULE PLACED IN 5.2.3-1.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 5.2.3-1.c ROM(COMPACT) DEBUG OBJECTEXTEND

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

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

 118   2                      Delay(100);                     /*延时,控制滚动速度*/
 119   2               }
 120   1      
 121   1               
 122   1      }
 123          
 124          /***********************画线,任意方向的斜线,不支持垂直的或水平线***********************/
 125          void Linexy(Uchar endx,Uchar endy)
 126          {
 127   1              register Uchar t;
 128   1              int xerr=0,yerr=0,delta_x,delta_y,distance;
 129   1              Uchar incx,incy;
 130   1              delta_x=endx-col;                       /*计算两个方向的距离*/
 131   1              delta_y=endy-row;
 132   1              if(delta_x>0) incx=1;                   /*计算增量方向,增量为0表示既不是垂直线也不是水平线*/
 133   1              else if( delta_x==0 ) incx=0;
 134   1                      else incx=-1;
 135   1              if(delta_y>0) incy=1;
 136   1              else if( delta_y==0 ) incy=0;
 137   1                      else incy=-1;
 138   1              delta_x = cabs( delta_x );              /* 判定哪个距离比较大*/
 139   1              delta_y = cabs( delta_y );
 140   1              if( delta_x > delta_y ) distance=delta_x;
 141   1              else distance=delta_y;
 142   1      /*开始画线*/
 143   1              for( t=0;t <= distance+1; t++ ) {
 144   2                      point();
 145   2                 xerr += delta_x ;
 146   2                      yerr += delta_y ;
 147   2                      if( xerr > distance ) {
 148   3                              xerr-=distance;
 149   3                          col+=incx;
 150   3                      }
 151   2                      if( yerr > distance ) {
 152   3                              yerr-=distance;
 153   3                          row+=incy;
 154   3                      }
 155   2              }
 156   1      }
 157          
 158          /***************************画线,只提供X或Y方向的,不支持斜线*************************/
 159          void Linehv(Uchar length)
 160                  {
 161   1                      Uchar xs,ys;
 162   1                      if (xy){ys = col;
 163   2                              for (xs=0;xs<length;xs++){
 164   3                                              col = ys + xs;
 165   3                                              point();}
 166   2                                      }
 167   1                      else    {xs = row;
 168   2                              for (ys=0;ys<length;ys++)
 169   2      {
 170   3                                              row = xs + ys;
 171   3                                              point();}
 172   2                                       }
 173   1      }
 174          
 175          /*****************************************画点******************************************/
 176          void point(void)
 177                  {
 178   1                      Uchar x1,y1,x,y;
 179   1                      x1=col;
C51 COMPILER V7.10   5_2_3_1                                                               06/06/2004 11:46:18 PAGE 4   

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

⌨️ 快捷键说明

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