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

📄 disp.lst

📁 在89C51上操作小型LCD,显示汉字,字符和图案,字库放在EEPROM
💻 LST
字号:
C51 COMPILER V7.07   DISP                                                                  11/03/2004 16:48:46 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE DISP
OBJECT MODULE PLACED IN Disp.obj
COMPILER INVOKED BY: F:\Keil\C51\BIN\C51.EXE src\Disp.c LARGE DEBUG OBJECTEXTEND PRINT(.\Disp.lst) OBJECT(Disp.obj)

stmt level    source

   1          #include "Disph.h" 
   2          #include "..\.\typedef.h"
   3          #include "..\..\i2ch.h"
   4          const unsigned char LineTable[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
   5          const unsigned char ClrTable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
   6          
   7          void Cls(void)
   8          {
   9   1              for(uc0=0;uc0<MAXROW;uc0++){
  10   2                      for(uc1=0;uc1<SCREEN_WITH;uc1++){
  11   3                              DispBuf[uc0][uc1]=0;
  12   3                      }
  13   2              }
  14   1              DispChange();
  15   1      }
  16          
  17          void DispHz(unsigned char x,unsigned char y)
  18          {//在(x,y)处开始显示一个汉字.汉字的内码放在hz[].
  19   1              unsigned char font;
  20   1              unsigned char uc0,uc1,uc2;
  21   1              font=HZSTART; 
  22   1              uc0=0;
  23   1              while(1){
  24   2                      uc1= I2CRead(font);//*(unsigned char *)font;
  25   2                      font++;
  26   2                      uc2= I2CRead(font);//*(unsigned char *)font;
  27   2                      font++;
  28   2                      if(uc1==hz[0]&&uc2==hz[1]) break;
  29   2                      uc0++;
  30   2              }
  31   1              font=(HZZMSTART +uc0*24);
  32   1              for(uc2=0;uc2<2;uc2++){
  33   2                      LCDWrite(0,x);
  34   2                      LCDWrite(0,DispPage[y/8+uc2]);
  35   2                      for(uc0=0;uc0<HZWITH;uc0++){
  36   3                              uc1=I2CRead(font++);
  37   3                              LCDWrite(1,uc1);
  38   3                      }
  39   2              }
  40   1      }
  41          void DispCh(unsigned char x,unsigned char y,unsigned char ch)
  42          {//在(x,y)处开始显示一个字符ch.
  43   1              unsigned char uc0,uc1;
  44   1              unsigned char font;
  45   1              LCDWrite(0,x);
  46   1              LCDWrite(0,DispPage[y/8]);
  47   1              font=CHSTART;// (unsigned char *)&CharTable[0];
  48   1              uc0=0;
  49   1              while(1){
  50   2                      uc1= I2CRead(font);//*(unsigned char *)font;
  51   2                      font++;
  52   2                      if(uc1==ch) break;
  53   2                      uc0++;
  54   2              }
  55   1              font=(CHZMSTART+uc0*6);
C51 COMPILER V7.07   DISP                                                                  11/03/2004 16:48:46 PAGE 2   

  56   1              for(uc0=0;uc0<CHARWITH;uc0++){
  57   2                      uc1=I2CRead(font++);
  58   2                      LCDWrite(1,uc1);
  59   2              }
  60   1      }
  61          void DispString(unsigned char x,unsigned char y)//,unsigned char *string)
  62          {//在(x,y)处开始显示一个字符串*string.
  63   1              unsigned char i=0;
  64   1              if(x<0||x>SCREEN_WITH)//2002.7.3
  65   1              return;
  66   1              if(y<0||y>SCREEN_HIGH)
  67   1              return;
  68   1              hz[2]=0;
  69   1              while(string[i]){
  70   2                      if(((char)string[i]&0x80)==0x80){
  71   3                              //display hz
  72   3                              hz[0]=(char)string[i++];
  73   3                              hz[1]=(char)string[i++];
  74   3                              hz[2]=0;
  75   3                              if(x+HZWITH>SCREEN_WITH){
  76   4                                      x=2;
  77   4                                      y+=HZ_HIGH;
  78   4                                      if(y>SCREEN_HIGH)y=0;
  79   4                              }
  80   3                              DispHz(x,y);
  81   3                              x+=HZWITH;
  82   3      
  83   3                      }else{
  84   3                              //display char
  85   3                              hz[0]=string[i++];
  86   3                              if(x+CHARWITH>SCREEN_WITH){
  87   4                                      x=2;
  88   4                                      y+=HZ_HIGH;
  89   4                                      if(y+HZ_HIGH>SCREEN_HIGH)y=0;
  90   4                              }
  91   3                              if(hz[0]!=0x0a){
  92   4                                      DispCh(x,y,hz[0]);
  93   4                                      x+=CHARWITH;
  94   4                              }
  95   3                      }
  96   2                      if(x>=SCREEN_WITH){
  97   3                              x=2;
  98   3                              y+=HZ_HIGH;
  99   3                              if(y+HZ_HIGH>=SCREEN_HIGH) y=0;
 100   3                      }
 101   2              }
 102   1      }       
 103          
 104          void NorArea(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)
 105          {//把左上角(x0,y0)和右下角(x1,y1)反相显示.
 106   1              unsigned char x,y,m,m0,m1,temp,temp0;
 107   1              char *ptr;
 108   1              temp=0;
 109   1              for(y=y0;y<=y1;y++){
 110   2                      m=y%8;
 111   2                      temp |=LineTable[m];
 112   2                      if(m==7){
 113   3                              temp0=~temp;
 114   3                              ptr=(char *)&DispBuf[y/8][x0-2];
 115   3                              for(x=x0;x<=x1;x++,ptr++){
 116   4                                      m=*ptr;
 117   4                                      m0 =m&temp0;
C51 COMPILER V7.07   DISP                                                                  11/03/2004 16:48:46 PAGE 3   

 118   4                                      m1 =~m;
 119   4                                      m1 &=temp;
 120   4                                      *ptr=m0|m1;
 121   4                              }
 122   3                              temp=0;
 123   3                      }
 124   2              }
 125   1              if(temp){
 126   2                      temp0=~temp;
 127   2                      ptr=(char *)&DispBuf[(y-1)/8][x0-2];
 128   2                      for(x=x0;x<=x1;x++,ptr++){
 129   3                              m=*ptr;
 130   3                              m0 =m&temp0;
 131   3                              m1 =~m;
 132   3                              m1 &=temp;
 133   3                              *ptr=m0|m1;
 134   3                      }
 135   2              }
 136   1              DispChange();
 137   1      }
 138          void ClrArea(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)
 139          {
 140   1              unsigned char k,m,from,x,y;
 141   1              char *ptr;
 142   1              k=y0/8,m=0xff;
 143   1              for(y=y0;y<=y1;y++){
 144   2                      if(y/8!=k){//不共一页.
 145   3                              ptr=(char *)&DispBuf[k++][x0-2];
 146   3                              for(x=x0;x<=x1;x++,ptr++){
 147   4                                      from= *ptr;
 148   4                                      from &=m;
 149   4                                      *ptr=from;
 150   4                              }
 151   3                              m=0xff,y--;
 152   3                      }else{
 153   3                              m &=ClrTable[y%8];
 154   3                      }
 155   2              }
 156   1              if(m==0xff)return;
 157   1              ptr=(char *)&DispBuf[k][x0-2];
 158   1              for(x=x0;x<=x1;x++,ptr++){
 159   2                      from= *ptr;
 160   2                      from &=m;
 161   2                      *ptr=from;
 162   2              }
 163   1      }
 164          
 165          void DisplayBmp(const unsigned char bmpAddr,unsigned char x,unsigned char y,unsigned char Xsize,unsigned c
             -har Ysize)
 166          {   //(x,y) 显示的起始座标.
 167   1          //Xsize,Ysize分别是bmp的x,y方向的(点阵)大小.
 168   1              unsigned char i,j;
 169   1              unsigned char *pto1,*pto2;
 170   1              unsigned char m1,m2,m3,m4,m5,m6,m7;
 171   1              unsigned char addr;
 172   1              m7=y%8;
 173   1              addr=bmpAddr;
 174   1              if(m7==0){
 175   2                      m1=Ysize/8; 
 176   2                      m2=y/8;
 177   2                      for(i=0;i<m1;i++){//
 178   3                              pto1=(unsigned char *)&DispBuf[m2+i][x-2];
C51 COMPILER V7.07   DISP                                                                  11/03/2004 16:48:46 PAGE 4   

 179   3                              for(j=0;j<Xsize;j++,pto1++){
 180   4                                      m4=*pto1;
 181   4                                      m4 |= I2CRead(addr++);//*pfrom;
 182   4                                      *pto1=m4;
 183   4                              }
 184   3                      }
 185   2              }else{
 186   2                      m1=0;
 187   2                      for(i=m7;i<8;i++) m1 |=LineTable[i];
 188   2                      m2=~m1;
 189   2                      for(i=0;i<Ysize/8;i++){
 190   3                              pto1=(unsigned char *)&DispBuf[y/8+i][x-2];
 191   3                              pto2=(unsigned char *)&DispBuf[y/8+i+1][x-2];
 192   3                              for(j=0;j<Xsize;j++){
 193   4                                      m3=*(volatile unsigned char *)pto1;
 194   4                                      m4=*(volatile unsigned char *)pto2;
 195   4                                      m5=I2CRead(addr++);//*(volatile unsigned char *)pfrom++;
 196   4                                      m6=m5&m2;
 197   4                                      m6 =m6<<m7;
 198   4                                      m6 |=m3;
 199   4                                      *pto1++=m6;
 200   4                                      m6=m5&m1;
 201   4                                      m6=m6>>(8-m7);
 202   4                                      m6 |=m4;
 203   4                                      *pto2++=m6;
 204   4                              }
 205   3                              if(i>6) break;//overflow page range.
 206   3                      }
 207   2              }
 208   1              
 209   1      }
 210          void DispChange(void)
 211          {
 212   1              unsigned char uc0,uc1,uc2;
 213   1              unsigned char *ptr;
 214   1              for(uc0=0;uc0<4;uc0++){
 215   2                      LCDWrite(0,0);
 216   2                      LCDWrite(0,DispPage[uc0]);
 217   2                      ptr=(unsigned char *)&DispBuf[uc0][0];
 218   2                      for(uc1=0;uc1<SCREEN_WITH;uc1++){
 219   3                              uc2=*ptr++;
 220   3                              LCDWrite(1,uc2);
 221   3                      }
 222   2              }       
 223   1      }
 224          void LCDInit(void)
 225          {
 226   1              LCDWrite(0,0xe2);  //Reset.
 227   1              LCDWrite(0,0xaf);  //Display ON.
 228   1              LCDWrite(0,0xc0);  //start line.
 229   1              LCDWrite(0,0xb8);  //page.
 230   1              LCDWrite(0,0);          //column.
 231   1              LCDWrite(0,0xa0);       //ADC.
 232   1              LCDWrite(0,0xa9);       //duty.
 233   1              LCDWrite(0,0xa4);
 234   1      
 235   1      }
 236          void LCDBusyTest(void)
 237          {
 238   1              while(1){
 239   2                      SetBit(EPort0,E1);
 240   2                      ClrBit(EPort0,E2);
C51 COMPILER V7.07   DISP                                                                  11/03/2004 16:48:46 PAGE 5   

 241   2                      SetBit(EPort1,RW);
 242   2                      ClrBit(EPort1,A0);
 243   2                      if((P1&0x80)==0) break;
 244   2              }
 245   1      }
 246          void LCDWrite(unsigned char Cmd,unsigned char ch)
 247          {
 248   1      //      LCDBusyTest();
 249   1              SetBit(EPort0,E1);
 250   1              ClrBit(EPort0,E2);
 251   1              ClrBit(EPort1,RW);
 252   1              if(Cmd) SetBit(EPort1,A0);
 253   1              else    ClrBit(EPort1,A0);
 254   1              P1 =ch;
 255   1              ClrBit(EPort0,E1);
 256   1              SetBit(EPort1,RW);
 257   1      }
 258          /*
 259          void LCDClr(void)
 260          {
 261                  unsigned char uc0,uc1;
 262                  for(uc1=0;uc1<4;uc1++){
 263                          LCDWrite(0,0);
 264                          LCDWrite(0,DispPage[uc1]);
 265                          for(uc0=0;uc0<70;uc0++){
 266                                  LCDWrite(1,0);
 267                          }
 268                  }
 269          }
 270          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2190    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    303      65
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =      6    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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