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

📄 液晶.lst

📁 环境 keil 利用c51F 中断刷新 LCD (128*64) 内部ram做显示缓存
💻 LST
字号:
C51 COMPILER V7.06   襙__                                                                  08/29/2007 20:58:07 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 襙__
OBJECT MODULE PLACED IN 液晶.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE 液晶.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include "液晶.H"
   2          
   3          
   4          
   5          ///////////////////////////////////////////////////////////////////////////////////////
   6          //////////////////////////////////////函数调试区///////////////////////////////////////
   7          ///////////////////////////////////////////////////////////////////////////////////////
   8          void Tint0(void) interrupt 1
   9          {
  10   1              unsigned char z,bufXY;
  11   1              TL0=0;
  12   1              TH0=220;
  13   1      
  14   1              if(newCount!=0)//液晶需要刷新   改变if else的顺序来改变优先级
  15   1              {
  16   2                      newCount--;
  17   2                      bufXY=nowXY&0x38;
  18   2                      for(z=bufXY;; )
  19   2                      {
  20   3                              if(CHnew[z>>3]!=0) break;
  21   3                              z+=8;
  22   3                              if((z&0x38)==bufXY) break;
  23   3                      }
  24   2                      if(CHnew[z>>3]!=0)//确实有更新
  25   2                      {
  26   3                              bufXY=nowXY&0x3F;
  27   3      
  28   3                              if(nowXY<(z&0x38)) nowXY=(z&0x38);
  29   3                              else nowXY&=0x3F;
  30   3                              for( ; ; )
  31   3                              {
  32   4                                      z=nowXY&0x07;
  33   4                                      if(     (CHnew[nowXY>>3]>>z)&0x01 )//CHbuf[nowXY]是新写入的
  34   4                                      {
  35   5                                              if((nowXY==bufXY)&&(((nowXY&0x0F)!=0)||(RS==0)))//上次才写了,可以直接写
  36   5                                              {
  37   6                                                      ChickOK();
  38   6                                                      RW=0; E=1; RS=1; P74OUT=0x0C; P5=CHbuf[nowXY]; E=0;
  39   6                                                      CHnew[nowXY>>3]&=(~(0x01<<z));//清除标志位
  40   6                                                      nowXY++;
  41   6                                              }
  42   5                                              else//要移动地址
  43   5                                              {
  44   6                                                      newCount++;
  45   6                                                      ChickOK();
  46   6                                                      RS=0; RW=0;  P74OUT=0x0C; z=nowXY>>1;
  47   6                                                      if(z<=7) P5=z+0x80;
  48   6                                                      else if(z<=15) P5=z+0x88;
  49   6                                                      else if(z<=23) P5=z+0x78;
  50   6                                                      else P5=z+0x80;
  51   6                                                      E=1; E=0;
  52   6      
  53   6                                                      if(nowXY&0x01)//临时标志 奇数地址的特殊需要
  54   6                                                      {
  55   7                                                              nowXY--;
C51 COMPILER V7.06   襙__                                                                  08/29/2007 20:58:07 PAGE 2   

  56   7                                                              CHnew[nowXY>>3]|=(0x01<<(nowXY&0x07));
  57   7                                                              newCount++;
  58   7                                                      }
  59   6                                              }
  60   5                                              break;
  61   5                                      }
  62   4                                      nowXY++;
  63   4                                      nowXY&=0x3F;
  64   4                                      if(nowXY==bufXY) break;
  65   4                              }
  66   3                      }
  67   2                      else
  68   2                      {
  69   3                              for(z=0;z<8&&(CHnew[z]==0);z++);
  70   3                              if(z==8) newCount=0;
  71   3                      }
  72   2              }
  73   1              else if(markXY<64)
  74   1              {
  75   2                      nowXY=markXY; markXY&=0x3F; markXY>>=1;
  76   2                      ChickOK();
  77   2                      RS=0; RW=0; P74OUT=0x0C; 
  78   2                      if(markXY<=7) P5=markXY+0x80;
  79   2                      else if(markXY<=15) P5=markXY+0x88;
  80   2                      else if(markXY<=23) P5=markXY+0x78;
  81   2                      else P5=markXY+0x80;
  82   2                      E=1; E=0;
  83   2                      markXY<<=1;
  84   2              }
  85   1              else
  86   1              {
  87   2              }
  88   1      }
  89          
  90          
  91          void P7int(void) interrupt 19
  92          {
  93   1              P3IF&=0x7F;//清中断
  94   1      }
  95          
  96          void SAd(unsigned char adress)//直接写屏地址设置
  97          {
  98   1              P74OUT=0x00;
  99   1              E=1; RS=0; RW=1;
 100   1              do {E=0; E=1; P5=0xFF; } 
 101   1              while(P5&0x80);
 102   1              RS=0; RW=0; E=1; P74OUT=0x0C; P5=adress; E=0;
 103   1      }
 104          
 105          void OutALL()//直接写屏
 106          {
 107   1              unsigned char i;
 108   1      
 109   1              TR0=0;
 110   1              for(i=0;i<8;i++) CHnew[i]=0;
 111   1              nowXY=0; newCount=0;
 112   1      
 113   1              SAd(0x80);
 114   1              for(i=0;i<16;i++)
 115   1              {
 116   2                      ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
 117   2              }
C51 COMPILER V7.06   襙__                                                                  08/29/2007 20:58:07 PAGE 3   

 118   1              SAd(0x90);
 119   1              for(;i<32;i++)
 120   1              {
 121   2                      ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
 122   2              }
 123   1              SAd(0x88);
 124   1              for(;i<48;i++)
 125   1              {
 126   2                      ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
 127   2              }
 128   1              SAd(0x98);
 129   1              for(;i<64;i++)
 130   1              {
 131   2                      ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
 132   2              }
 133   1              if(markXY<64)
 134   1              {
 135   2                      nowXY=markXY; markXY&=0x3F; markXY>>=1;
 136   2                      ChickOK();
 137   2                      RS=0; RW=0; P74OUT=0x0C; 
 138   2                      if(markXY<=7) P5=markXY+0x80;
 139   2                      else if(markXY<=15) P5=markXY+0x88;
 140   2                      else if(markXY<=23) P5=markXY+0x78;
 141   2                      else P5=markXY+0x80;
 142   2                      E=1; E=0;
 143   2                      markXY<<=1;
 144   2              }
 145   1              TR0=1;
 146   1      
 147   1      }
 148          
 149          
 150          
 151          
 152          
 153          void StartFYD(void)
 154          {
 155   1              XBR2=0x40;
 156   1              P3MDOUT|=0x27;
 157   1              REST=0; Delay(10); REST=1; Delay(1000);
 158   1              RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x34; E=0;//8位数据 基本指令 
 159   1              ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x01; E=0;//清除显示
 160   1              ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x02; E=0;//地址归位
 161   1      
 162   1              ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x0C; E=0;//关游标 开显示 开反白
 163   1      
 164   1              RS=1;
 165   1              newCount=0;
 166   1              for(XY=0;XY<64;XY++) CHbuf[XY]=' ';
 167   1              for(XY=0;XY<8;XY++) CHnew[XY]=0;
 168   1              XY=nowXY=markXY=0;
 169   1      
 170   1              //T0设置
 171   1              ET0=0;
 172   1              TMOD=(TMOD&0xFD)|0x01;//16位定时器
 173   1              CKCON|=0x04;//T0 工作在系统时钟
 174   1              ET0=1;
 175   1      
 176   1              TR0=1;
 177   1      }
 178          
 179          void Cover()//封面
C51 COMPILER V7.06   襙__                                                                  08/29/2007 20:58:07 PAGE 4   

 180          {
 181   1              SetAd(0x00);
 182   1              OutS("┌──────┐");
 183   1              OutS("│  欢迎使用  │");
 184   1              OutS("│  ¨……¨  │");
 185   1              OutS("└──────┘");
 186   1      }
 187          
 188          void Clr()
 189          {
 190   1              unsigned char i;
 191   1              newCount=0;
 192   1              for(i=0;i<64;i++) CHbuf[i]=' ';
 193   1              for(i=0;i<8;i++) CHnew[i]=0;
 194   1              XY=nowXY=markXY=0;
 195   1              i=RS; TR0=0; ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x01; E=0; RS=i; TR0=1;//清除显示
 196   1      }
 197          
 198          
 199          void Print(unsigned long Data,unsigned char lena,unsigned char lenb)//显示数据  左边到右截取长度  右边截断
             -长度
 200          {
 201   1              //显示位数设定
 202   1              unsigned char i,k;
 203   1              unsigned long E10,Lbuf;
 204   1              unsigned char buf;
 205   1      
 206   1              E10=1000000000L; Lbuf=Data;
 207   1              k=0; i=0;
 208   1              for( ; ; )
 209   1              {
 210   2                      buf=(char)(Lbuf/E10)+'0';
 211   2                      Lbuf%=E10;
 212   2                      E10=E10/10;
 213   2                      if((i+k)<(10-lena)) {k++; continue; }
 214   2      
 215   2                      if((i==0)&&(buf=='0')&&(k!=9-lenb))
 216   2                      {
 217   3                              k++;
 218   3                              if(k>lenb) OutCH(' ');
 219   3                      }
 220   2                      else
 221   2                      {
 222   3                              i++;
 223   3                              OutCH(buf);
 224   3                      }
 225   2                      if((i+k)>=(10-lenb)) break;
 226   2              }
 227   1              return;
 228   1      }
 229          
 230          
 231          //////////////////////////////////////////////////////////////////////////////////////////////////////////
 232          ////////////////////////////////////游标处理类////////////////////////////////////////////////////////////
 233          //////////////////////////////////////////////////////////////////////////////////////////////////////////
 234          void SetMark(unsigned char adress)//设定游标地址
 235          {
 236   1              markXY=adress;
 237   1      }
 238          
 239          void OpenMark()//打开游标
 240          {
C51 COMPILER V7.06   襙__                                                                  08/29/2007 20:58:07 PAGE 5   

 241   1              unsigned char i;
 242   1              TR0=0; i=RS; ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x0F; E=0; ChickOK(); RS=i; TR0=1;//  游标 开显

⌨️ 快捷键说明

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