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

📄 lcd3.lst

📁 带T6963C控制器的LCD的驱动程序和简单的显示测试程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.07   LCD3                                                                  09/07/2006 09:21:47 PAGE 1   


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

stmt level    source

   1          #include <absacc.h>
   2          #include <reg51.h>
   3          #include <string.h>
   4          #include <stdarg.h>
   5          #include <stdio.h>
   6          #include <zifu.c>
   7          #include <hz.c>
   8          #define ulong unsigned long
   9          #define uint unsigned int
  10          #define uchar unsigned char
  11          #define LC_CUR_POS 0x21 // 光标位置设置
  12          #define LC_CGR_POS 0x22 // CGRAM偏置地址设置
  13          #define LC_ADD_POS 0x24 // 地址指针位置
  14          #define LC_TXT_STP 0x40 // 文本区首址
  15          #define LC_TXT_WID 0x41 // 文本区宽度
  16          #define LC_GRH_STP 0x42 // 图形区首址
  17          #define LC_GRH_WID 0x43 // 图形区宽度
  18          #define LC_MOD_OR 0x80  // 显示方式:逻辑“或”
  19          #define LC_MOD_XOR 0x81 // 显示方式:逻辑“异或”
  20          #define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
  21          #define LC_MOD_TCH 0x83 // 显示方式:文本特征
  22          #define LC_DIS_SW 0x9B  // 显示开关:D0=1/0:光标闪烁启用/禁用;
  23                                            // D1=1/0:光标显示启用/禁用;
  24                                            // D2=1/0:文本显示启用/禁用;
  25                                            // D3=1/0:图形显示启用/禁用;
  26          #define LC_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
  27          #define LC_AUT_WR 0xB0  // 自动写设置
  28          #define LC_AUT_RD 0xB1  // 自动读设置
  29          #define LC_AUT_OVR 0xB2 // 自动读/写结束
  30          #define LC_INC_WR 0xC0  // 数据一次写,地址加1
  31          #define LC_INC_RD 0xC1  // 数据一次读,地址加1
  32          #define LC_DEC_WR 0xC2  // 数据一次写,地址减1
  33          #define LC_DEC_RD 0xC3  // 数据一次读,地址减1
  34          #define LC_NOC_WR 0xC4  // 数据一次写,地址不变
  35          #define LC_NOC_RD 0xC5  // 数据一次读,地址不变
  36          #define LC_SCN_RD 0xE0  // 屏读
  37          #define LC_SCN_CP 0xE8  // 屏拷贝
  38          #define LC_BIT_OP 0xF0  // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除
  39          
  40          
  41          #define LCMDW XBYTE[0x7AFF] // 数据口
  42          #define LCMCW XBYTE[0x7BFF] // 命令口
  43          void key(void);
  44          uchar xdata rbuf[500];
  45          uchar xdata tbuf[88];
  46          
  47          uint  r_in;
  48          uchar  c,q;
  49          uchar  a,b;
  50          uchar  key_flag;
  51          uchar x,y;
  52          uchar t=0;
  53          uchar gCurRow,gCurCol; 
  54          uint d,g,n,h;
  55          uchar uRow,uCol;
C51 COMPILER V7.07   LCD3                                                                  09/07/2006 09:21:47 PAGE 2   

  56          uint i,e,f;
  57          
  58          uchar fnGetRow(void)
  59          {
  60   1      return gCurRow;
  61   1      }
  62          uchar fnGetCol(void)
  63          {
  64   1      return gCurCol;
  65   1      }
  66          void fnST01(void)      // 状态位STA1,STA0 判断(读写指令和读写数据)
  67          {uchar sta; 
  68   1      do{ sta=LCMCW & 0x03; }
  69   1      while(sta!=0x03); 
  70   1      
  71   1      }
  72          
  73          /*void fnST2(void)     // 状态位ST2 判断(数据自动读状态)
  74          {
  75          uchar sta; 
  76          do{ sta=LCMCW & 0x04; }
  77          while(sta!=0x04);
  78          }*/
  79                            
  80          void fnST3(void)           // 状态位ST3 判断(数据自动写状态)
  81          {
  82   1      uchar sta; 
  83   1      do{ sta=LCMCW & 0x08; }
  84   1      while(sta!=0x08);
  85   1      }
  86          /*uchar fnST6(void)           // 状态位ST6 判断(屏读/屏拷贝状态)
  87          {
  88          uchar i;
  89          for(i=10;i>0;i--)
  90          {
  91          if((LCMCW & 0x40) == 0x40)
  92          break;
  93          }
  94          return i; // 若返回零,说明错误
  95          }*/
  96          
  97          
  98          void fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令
  99          {
 100   1      fnST01(); 
 101   1      LCMDW = uPar1;
 102   1      fnST01(); 
 103   1      LCMDW = uPar2;
 104   1      fnST01(); 
 105   1      LCMCW = uCmd;
 106   1      
 107   1      }
 108          void fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令
 109          
 110          {
 111   1      fnST01(); 
 112   1      LCMDW = uPar1;
 113   1      fnST01(); 
 114   1      LCMCW = uCmd;
 115   1      }
 116          void  fnPR12(uchar uCmd)       // 写无参数的指令
 117          {fnST01(); 
C51 COMPILER V7.07   LCD3                                                                  09/07/2006 09:21:47 PAGE 3   

 118   1      LCMCW = uCmd;
 119   1      }
 120          void  fnPR13(uchar uData)     // 写数据
 121          {fnST01(); 
 122   1      LCMDW = uData;
 123   1      }
 124          /*uchar fnPR2(void)            // 读数据
 125          {fnST01(); 
 126          return LCMDW;
 127          }*/
 128          // 设置当前地址
 129          void fnSetPos(uchar urow, uchar ucol)
 130          {
 131   1      uint iPos;
 132   1      iPos = urow * 30 + ucol;                                       
 133   1      fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
 134   1      gCurRow = urow;
 135   1      gCurCol = ucol;
 136   1      }
 137          // 设置当前显示行、列
 138          void cursor(uchar uRow, uchar uCol)       
 139          {
 140   1      fnSetPos(uRow * 16, uCol);
 141   1      }
 142          //指针设置
 143          void Text_Curser(uchar x3,uchar y3)
 144          {fnPR1(0x21,x3,y3);
 145   1      
 146   1      a=x3;
 147   1      b=y3;}
 148          
 149          
 150          // 清屏
 151          void cls(void)
 152          {
 153   1      uint i;
 154   1      fnPR1(LC_ADD_POS,0x00,0x00);  // 置地址指针
 155   1      fnPR12(LC_AUT_WR);            // 自动写
 156   1      for(i=0;i<240*128;i++)
 157   1      {
 158   2      fnST3();
 159   2      fnPR13(0x00);                 // 写数据
 160   2      }
 161   1      fnPR12(LC_AUT_OVR);           // 自动写结束
 162   1      fnPR1(LC_ADD_POS,0x00,0x00);  // 重置地址指针
 163   1      gCurRow = 0;                  // 置地址指针存储变量
 164   1      gCurCol = 0;
 165   1      }
 166          
 167          
 168          // LCM 初始化
 169          void fnLCMInit(void)
 170          {
 171   1      
 172   1      fnPR1(LC_TXT_STP,0xDF,0x01) ;   // 文本显示区首地址
 173   1      fnPR1(0x41,0x1E,0x00);          // 文本显示区宽度
 174   1      fnPR1(LC_GRH_STP,0x00,0x00);    // 图形显示区首地址
 175   1      fnPR1(LC_GRH_WID,0x1E,0x00);    // 图形显示区宽度
 176   1      fnPR12(0xA0);                   // 光标形状
 177   1      fnPR12(0x80);                   // 显示方式设置
 178   1      fnPR12(0x9F);                   // 显示开关设置
 179   1      cls();
C51 COMPILER V7.07   LCD3                                                                  09/07/2006 09:21:47 PAGE 4   

 180   1      
 181   1      }
 182          //延时
 183          void shortdelay(uint tt)
 184          { uchar i;
 185   1        while(tt)
 186   1        {i=100;
 187   2         while(i) 
 188   2         i--;
 189   2         tt--;};
 190   1         }
 191          //显示一个字符
 192          
 193          void dchar(uchar x,uchar y,uchar a)
 194          {uchar j,uRow,uCol;
 195   1      for(j=0;j<16;j++)
 196   1      {
 197   2      uRow=y;
 198   2      uCol=x;
 199   2      fnSetPos(uRow*16+j,uCol);
 200   2      uRow = fnGetRow();
 201   2      uCol = fnGetCol();
 202   2      fnPR12(LC_AUT_WR);
 203   2      fnPR13(ASC_MSK[(a-0x20)*16+j]);
 204   2      fnPR12(LC_AUT_OVR);
 205   2      }
 206   1      }
 207          //显示字符串
 208          void dstring(uchar x,uchar y,uchar *ptr)
 209          {
 210   1      char c1;
 211   1      uchar i,j,uLen,uRow,uCol;
 212   1      uLen=strlen(ptr);
 213   1      for(i=0;i<uLen;i++)
 214   1      {c1 =ptr[i];
 215   2      for(j=0;j<16;j++)
 216   2      {uRow=y;
 217   3      uCol=x;
 218   3      fnSetPos(uRow*16+j,uCol);
 219   3      uRow = fnGetRow();
 220   3      uCol = fnGetCol(); 
 221   3      fnPR12(LC_AUT_WR);
 222   3      fnPR13(ASC_MSK[(c1-0x20)*16+j]);
 223   3      fnPR12(LC_AUT_OVR);}
 224   2      if(x<29)
 225   2      {x++;}
 226   2      else 
 227   2      {y++;x=0;}}
 228   1      
 229   1      }
 230          //显示汉字
 231          void dhz(uchar x,uchar y,uchar *shz)
 232          {uint  length=0,no,k;
 233   1       uchar uRow,uCol;
 234   1        while (*(shz+length)!='\0')
 235   1        {length++;}
 236   1       for(no=0;no<length/2;no++)
 237   1        {uint j,find=0;
 238   2         for(j=0;j<sizeof(hzinx)/2;j++)
 239   2          {if(hzinx[j*2]==*(shz+no*2)&&hzinx[j*2+1]==*(shz+no*2+1))
 240   3              {find=1;break;}}
 241   2      
C51 COMPILER V7.07   LCD3                                                                  09/07/2006 09:21:47 PAGE 5   

 242   2      for(k=0;k<16;k++)
 243   2      {uRow=y;
 244   3      uCol=x+no*2;
 245   3      fnSetPos(uRow*16+k,uCol);
 246   3      uRow = fnGetRow();
 247   3      uCol = fnGetCol(); 
 248   3      fnPR12(LC_AUT_WR);
 249   3      fnPR13(zimo[j*32+2*k]);
 250   3      fnPR12(LC_AUT_OVR);
 251   3      x++;
 252   3      fnPR12(LC_AUT_WR);
 253   3      fnPR13(zimo[j*32+2*k+1]);
 254   3      fnPR12(LC_AUT_OVR);
 255   3      x--;}
 256   2      }}
 257          
 258          //串口数据接收
 259          
 260           serial()interrupt 4 using 1
 261           {
 262   1         
 263   1         if(RI)
 264   1         { 
 265   2           c=SBUF;                                                                                              
             -          
 266   2               RI=0;
 267   2           rbuf[r_in++]=c;
 268   2               if((rbuf[r_in-3]=='*')&&(rbuf[r_in-2]=='*')&&(rbuf[r_in-1]=='*'))
 269   2               { if(r_in<250)
 270   3                   r_in=250;
 271   3                 else if(r_in>250) 
 272   3                   r_in=0;
 273   3                }
 274   2               
 275   2          }
 276   1       }
 277            
 278            //串口初始化
 279            void nintser(void)
 280            {r_in=0;
 281   1        TMOD=0x20;
 282   1        TL1=0xF3;TH1=0xF3;  //在12MHz下,设串口波特率为4800,方式3
 283   1        SCON=0xd8;PCON=0x80;
 284   1        TR1=1;
 285   1        IE=0x90;             //串口开中断
 286   1        IP=0x10;
 287   1        }
 288          
 289          //接收缓冲区分块
 290          void part(void)
 291          { 
 292   1       
 293   1       if(r_in<250)
 294   1       {e=250;             //当前显示缓冲区首地址   
 295   2        f=500;}
 296   1       else if(r_in>250)   //当前显示缓冲区末地址   
 297   1       {e=0;f=250;}
 298   1       for(i=e;i<f;i++)
 299   1       {if(rbuf[i]=='c'&&rbuf[i+1]=='o'&&rbuf[i+2]=='m')
 300   2       {h=i;break;
 301   3      }}
 302   1       
C51 COMPILER V7.07   LCD3                                                                  09/07/2006 09:21:47 PAGE 6   

 303   1       for(i=e;i<f;i++)
 304   1       {if(rbuf[i]=='D'&&rbuf[i+1]=='V'&&rbuf[i+2]=='L')
 305   2       {d=i;break;
 306   3       }}
 307   1       for(i=e;i<f;i++)
 308   1       {if(rbuf[i]=='G'&&rbuf[i+1]=='P'&&rbuf[i+2]=='S')
 309   2       {g=i;break;
 310   3       }}
 311   1       for(i=e;i<f;i++)
 312   1       {if(rbuf[i]=='I'&&rbuf[i+1]=='N'&&rbuf[i+2]=='S')
 313   2       {n=i;break;
 314   3       }}}
 315           
 316          
 317          //接收信息显示
 318          void sebuf(void)
 319          {uchar k,j;
 320   1       for(k=0;k<10;k++)
 321   1       {
 322   2        for(j=0;j<16;j++)
 323   2         {uRow=y;
 324   3          uCol=x;
 325   3          fnSetPos(uRow*16+j,uCol);
 326   3          uRow = fnGetRow();
 327   3          uCol = fnGetCol(); 
 328   3          fnPR12(LC_AUT_WR);
 329   3          fnPR13(ASC_MSK[(rbuf[2+k+q]-0x20)*16+j]);
 330   3          fnPR12(LC_AUT_OVR);
 331   3              }          
 332   2          x++;
 333   2        }
 334   1      }
 335          
 336          
 337          //组合信息显示
 338          void serh1(void)
 339          {
 340   1      uint i;
 341   1      uchar find=0;
 342   1      for(i=h;i<d;i++)
 343   1       {if(rbuf[i]=='j'&&rbuf[i+1]=='d')
 344   2        {find=1;
 345   3         q=i;
 346   3         break;}
 347   2      
 348   2       }
 349   1       if(find==1)
 350   1        {
 351   2         y=5;x=6;
 352   2         sebuf();
 353   2         }
 354   1      }
 355          
 356          void serh2(void)
 357          {
 358   1      uint i;
 359   1      uchar find=0;
 360   1      for(i=h;i<d;i++)
 361   1       {if(rbuf[i]=='w'&&rbuf[i+1]=='d')
 362   2        {
 363   3         find=1;q=i;
 364   3      
C51 COMPILER V7.07   LCD3                                                                  09/07/2006 09:21:47 PAGE 7   

 365   3          break;}
 366   2      
 367   2        }
 368   1       if(find==1)
 369   1       {
 370   2         y=6;x=6;
 371   2         sebuf();}
 372   1      }
 373          
 374          void serh3(void)
 375          {
 376   1      uint i;
 377   1      uchar find=0;
 378   1      
 379   1      for(i=h;i<d;i++)

⌨️ 快捷键说明

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