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

📄 lcd.lst

📁 基于at89c52的乒乓球游戏系统
💻 LST
字号:
C51 COMPILER V7.06   LCD                                                                   10/03/2008 17:28:24 PAGE 1   


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

stmt level    source

   1          /*************************************
   2           * 控制器:KS0108 
   3           * MCU:AT89C52 ,晶体频率:6MHz 
   4           * 取模方式:纵向字节倒序 
   5           * CS1和CS2为低电平有效  
   6           * copyright:tiany
   7           * time:2008-9-20
   8          **************************************/
   9          #include <reg52.h>
  10          #include "LCD.h"
  11          
  12          //全局变量=====
  13          uchar status;
  14          uchar cbyte;
  15          
  16          void Delay_us(uint DelayTime)        //*******us延时*****//
  17          {
  18   1         while(DelayTime) DelayTime--;
  19   1      }
  20          
  21          
  22          
  23          /*--------------------------
  24          *忙信号检测 
  25          ----------------------------*/ 
  26          void LCD_Check_Busy(void)
  27          {
  28   1        /* while(1)
  29   1              {
  30   1                LCD_EN = 0;
  31   1                LCD_RS = 0;
  32   1                LCD_RW = 1;
  33   1                LCD_BUS = 0xFF;
  34   1            Delay_us(5);
  35   1                LCD_EN = 1;
  36   1                if(!LCD_Busy) break;   /***在proteus中仿真查忙会引起死循环,程序的BUG!***/
  37   1          // }
  38   1         LCD_EN = 0;
  39   1      }
  40            
  41          /*---------------------------------------------------------------------------- 
  42          写入控制指令代码。 
  43          函数入口参数:Command ------ 写入的控制指令代码 。 
  44                        CS_Num  ------ 左右半屏的选数值 
  45          ----------------------------------------------------------------------------*/ 
  46          void LCD_WriteCommand(uchar Command, uchar CS_Num) 
  47          { 
  48   1        LCD_Check_Busy();
  49   1        if(CS_Num==L)                 /*选左半屏*/
  50   1         {
  51   2           LCD_CS1 = 0;
  52   2                 LCD_CS2 = 1;
  53   2              }
  54   1        else if(CS_Num==R)    /*选右半屏*/
  55   1         {
C51 COMPILER V7.06   LCD                                                                   10/03/2008 17:28:24 PAGE 2   

  56   2           LCD_CS1 = 1;
  57   2                 LCD_CS2 = 0;
  58   2              }
  59   1        LCD_EN = 0;           
  60   1        LCD_RS = 0;           
  61   1        LCD_RW = 0;          
  62   1        LCD_BUS = Command;   
  63   1        LCD_EN = 1;          
  64   1        Delay_us(1);         
  65   1        LCD_EN = 0;          
  66   1        LCD_CS1 = 1;         
  67   1        LCD_CS2 = 1;          
  68   1      } 
  69          /*---------------------------------------------------------------------------- 
  70          写入定位信息 
  71          函数入口参数:hang ------ 写入的行位置 
  72                        lie  ------ 写入的列位置 
  73          ----------------------------------------------------------------------------*/ 
  74          void Locatexy(uchar hang,uchar lie)
  75          {
  76   1         uchar  x, y, right;
  77   1         switch(lie&0xc0)
  78   1          {
  79   2          case 0:   { right = L;break;} //置左半屏标志
  80   2          case 0x40:{ right = R;break;}//置右半屏标志
  81   2           }
  82   1         x=lie&0x3f|SETX; //把列数据变成列命令 40
  83   1         y=hang&0x07|SETY;//把行数据变成行命令 b8
  84   1         LCD_WriteCommand(y, right);/***送行命令***/
  85   1         LCD_WriteCommand(x, right);/***送列命令***/
  86   1         
  87   1         if(right==R)
  88   1          status = R;
  89   1         else
  90   1          status = L;//置左又半区标志
  91   1      }
  92          /*---------------------------------------------------------------------------- 
  93          写入显示数据。 
  94          函数入口参数: data    --------写入的显示数据 。 
  95                         hang,lie--------写入定位位置
  96          ----------------------------------------------------------------------------*/ 
  97          void LCD_WriteData(uchar Data,uchar hang,uchar lie) 
  98          { 
  99   1        Locatexy(hang,lie);//定位显示位置
 100   1        if(status==L)          /*选择左半屏*/
 101   1         {
 102   2           LCD_CS1 = 0;
 103   2               LCD_CS2 = 1;
 104   2              }
 105   1        else if(status==R)  /*选择右半屏*/
 106   1         {
 107   2           LCD_CS1 = 1;
 108   2               LCD_CS2 = 0;
 109   2              }
 110   1        LCD_Check_Busy();
 111   1        LCD_EN = 0;
 112   1        LCD_RS = 1;       
 113   1        LCD_RW = 0;       
 114   1        LCD_BUS = Data;  
 115   1        LCD_EN = 1;       
 116   1        Delay_us(1);     
 117   1        LCD_EN = 0;    
C51 COMPILER V7.06   LCD                                                                   10/03/2008 17:28:24 PAGE 3   

 118   1        LCD_CS1= 1;    
 119   1        LCD_CS2= 1;       
 120   1      } 
 121          //=========数据读取====================
 122          /*uchar LCD_ReadData(uchar  hang,uchar lie)
 123          {   
 124             uchar rdata;
 125             Locatexy(hang,lie);//定位显示位置
 126             if(status==L)
 127             {  
 128              LCD_Check_Busy();
 129              LCD_CS1= 0;    
 130              LCD_CS2= 1; 
 131             }
 132             else
 133             {
 134              LCD_Check_Busy();
 135              LCD_CS1= 1;    
 136              LCD_CS2= 0; 
 137             }
 138            P0 =0xFF;   //数据送到P0口
 139            LCD_EN = 0;  
 140            LCD_RS = 1;       
 141            LCD_RW = 1;
 142            LCD_EN = 1; 
 143            Delay_us(1);
 144            rdata=P0;
 145            
 146            LCD_RS = 1;       
 147            LCD_RW = 1; 
 148            //P0 =0xFF;   //数据送到P0口 要读两次,第二次的才正确
 149            Delay_us(1);
 150            rdata=P0;
 151            
 152            LCD_EN = 0;    
 153            LCD_CS1= 1;    
 154            LCD_CS2= 1; 
 155            return rdata;
 156          }*/
 157          /*---------------------------------------------------------------------------
 158          液晶模块的清屏
 159          ---------------------------------------------------------------------------*/
 160          void LCD_CLR(uchar Side_Num)
 161          {
 162   1         uchar i,k;
 163   1         for(i=0;i<8;i++)                               
 164   1         {    
 165   2           if(Side_Num==L)
 166   2                   for(k=0;k<64;k++)
 167   2                    {
 168   3                          LCD_WriteData(0x00,i,k);
 169   3                        }
 170   2               else if(Side_Num==R)
 171   2                   for(k=64;k<128;k++)
 172   2                    {
 173   3                          LCD_WriteData(0x00,i,k);
 174   3                        }
 175   2          }
 176   1      }
 177          
 178          /*---------------------------------------------------------------------------
 179          初始化
C51 COMPILER V7.06   LCD                                                                   10/03/2008 17:28:24 PAGE 4   

 180          ---------------------------------------------------------------------------*/
 181          void LCD_Initial(void) 
 182          {   
 183   1         LCD_WriteCommand(DISPOFF,L);   /*显示关*/
 184   1         LCD_WriteCommand(DISPOFF,R);
 185   1         Delay_us(1);
 186   1         LCD_WriteCommand(DISPON,L);    /*显示开*/
 187   1         LCD_WriteCommand(DISPON,R);  
 188   1         LCD_WriteCommand(DISPFIRST,L);  /*起始行*/
 189   1         LCD_WriteCommand(DISPFIRST,R);                           
 190   1         LCD_CLR(L);
 191   1         LCD_CLR(R);
 192   1      } 
 193          /*---------------------------------------------------------------------------
 194          输出全屏图片: 128*64
 195          ---------------------------------------------------------------------------*/
 196          /*
 197          void put_picture(uchar* pictureName)//128*64
 198          {
 199            uchar i,j;
 200            uint  x;
 201              for(j=0;j<8;j++)
 202                  {
 203               x=j*128; 
 204               for(i=0;i<128;i++)
 205                {
 206                    cbyte=*(pictureName+x);
 207                    LCD_WriteData(cbyte,j,i);
 208                    x++;
 209                }     
 210              }   
 211          }
 212          */
 213          /*---------------------------------------------------------------------------
 214          输出半屏图片: 64*64
 215          ---------------------------------------------------------------------------*/
 216          
 217          void put_picture_half(uchar* pictureName,uchar Side_Num)//64*64
 218          {
 219   1        uchar i,j;
 220   1        uint  x;
 221   1          for(j=0;j<8;j++)
 222   1          {
 223   2            x=j*64; 
 224   2            if(Side_Num==L)
 225   2            {
 226   3             for(i=0;i<64;i++)
 227   3              {
 228   4                cbyte=*(pictureName+x);
 229   4                LCD_WriteData(cbyte,j,i);
 230   4                x++;
 231   4              } 
 232   3            }  
 233   2            else if(Side_Num==R)
 234   2            {
 235   3             for(i=64;i<128;i++)
 236   3              {
 237   4                cbyte=*(pictureName+x);
 238   4                LCD_WriteData(cbyte,j,i);
 239   4                x++;
 240   4              } 
 241   3            }   
C51 COMPILER V7.06   LCD                                                                   10/03/2008 17:28:24 PAGE 5   

 242   2          }
 243   1      }
 244          /*---------------------------------------------------------------------------
 245          输出英文和数字:8*8
 246          ---------------------------------------------------------------------------*/
 247          /*
 248          void put_char(uchar* Data, uchar hang, uchar lie,uchar reverse)//8*8
 249          {
 250             uchar i;
 251             uint x;
 252             x=0;
 253             for(i=0;i<8;i++)
 254              {
 255                if(reverse) cbyte=~(*(Data+x));
 256                 else cbyte=*(Data+x);
 257                 
 258                LCD_WriteData(cbyte,hang,lie);
 259                x++;
 260                lie++;
 261              }
 262          
 263          }*/
 264          /*---------------------------------------------------------------------------
 265          输出汉字: 16*16
 266          ---------------------------------------------------------------------------*/
 267          void put_chinese(uchar* Data, uchar hang, uchar lie,uchar reverse)//16*16
 268          {   
 269   1        uchar i,j,lie0;
 270   1        uint x;
 271   1        x=0;
 272   1        lie0=lie;
 273   1        for(j=0;j<2;j++)
 274   1         {
 275   2           for(i=0;i<16;i++)
 276   2            {
 277   3             if(reverse) cbyte=~(*(Data+x));
 278   3             else cbyte=*(Data+x);  
 279   3              LCD_WriteData(cbyte,hang,lie);
 280   3              x++;
 281   3              lie++;
 282   3            }   
 283   2           lie=lie0;
 284   2           hang++;   
 285   2         } 
 286   1      }
 287          
 288          /*---------------------------------------------------------------------------
 289          输出数字和字母: 16*8
 290          ---------------------------------------------------------------------------*/
 291          void put_num(uchar* Data, uchar hang, uchar lie,uchar reverse)//16*16
 292          {   
 293   1        uchar i,j,lie0;
 294   1        uint x;
 295   1        x=0;
 296   1        lie0=lie;
 297   1        for(j=0;j<2;j++)
 298   1         {
 299   2           for(i=0;i<8;i++)
 300   2            {
 301   3             if(reverse) cbyte=~(*(Data+x));
 302   3             else cbyte=*(Data+x);  
 303   3              LCD_WriteData(cbyte,hang,lie);
C51 COMPILER V7.06   LCD                                                                   10/03/2008 17:28:24 PAGE 6   

 304   3              x++;
 305   3              lie++;
 306   3            }   
 307   2           lie=lie0;
 308   2           hang++;   
 309   2         } 
 310   1      }
 311          //===================================================
 312          //  屏幕向上移动   有问题  ????
 313          //===================================================
 314          /*void MoveUp()
 315          { 
 316             uint hang;
 317             uchar lie;
 318             //uchar hang2;
 319                 for(hang=0;hang<8;hang++)
 320                 {
 321                      for(lie=0;lie<128;lie++)
 322                      { 
 323                         uchar buf; 
 324                         //uchar lie2=lie+1;
 325                         buf =LCD_ReadData(hang,lie);
 326                         //if(hang==0)
 327                          //continue ;
 328                         //else
 329                         // hang2=hang-1; 
 330                         LCD_WriteData(buf,hang,lie);       
 331                      }
 332                     Delay_us(1000);  
 333                 }
 334          }*/
 335          
 336          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    575    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2      32
   IDATA SIZE       =   ----    ----
   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 + -