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

📄 main.lst

📁 自己做的单片机Proteus仿真实例
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  05/08/2012 23:39:39 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\IDEsoftware\Keil uVision3\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*****http://hi.baidu.com/echoas********
   2          程序:MCS-51驱动LCD12864液晶
   3          内容:LCD12864显示正弦曲线
   4          编译器:keil uVision3
   5          开发板:Proteus仿真图
   6          作者:大海橡树
   7          整理日期:2011-01-28
   8          修改:无 
   9          
  10          备注:有什么错误的地方,欢迎网友们到空间留言
  11          
  12                                                  O(∩_∩)O~
  13          
  14          ******http://hi.baidu.com/echoas*********/ 
  15          #include <AT89X52.h>
  16          #include <intrins.h>
  17          #include<math.h>
  18          #include"ZB.h"
  19          #define uchar unsigned char
  20          #define uint  unsigned int
  21          
  22          #define LCD_databus P0 //LCD12864的8位数据口
  23          
  24          sbit RS=P2^2;   //RS为0---命令;1----数据 
  25          sbit RW=P2^1;   //RW为1---写;0---读 
  26          sbit EN=P2^0;   //使能端 
  27          sbit CS1=P2^4;  //片选1低电平有效,控制左半屏 
  28          sbit CS2=P2^3;  //片选1低电平有效,控制右半屏 
  29          
  30          
  31          void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy             
  32          {
  33   1              P0=0x00;
  34   1              RS=0;  
  35   1              RW=1; 
  36   1              EN=1;
  37   1              while(P0 & 0x80);
  38   1              EN=0;
  39   1      }
  40          
  41          void write_LCD_command(uchar value)     //写命令函数 
  42          {
  43   1         Read_busy();                                         //对LCD的每次读写都要读忙 
  44   1         RS=0;                                                        //选择命令 
  45   1         RW=0;                                                        //读操作 
  46   1         LCD_databus=value;
  47   1         EN=1;                                                        //EN由1----0锁存有效数据 
  48   1         _nop_();
  49   1         _nop_(); 
  50   1         EN=0;
  51   1      }
  52          
  53          void write_LCD_data(uchar value)//写数据函数    
  54          {
  55   1         Read_busy();
C51 COMPILER V8.02   MAIN                                                                  05/08/2012 23:39:39 PAGE 2   

  56   1         RS=1;                                                //选择数据 
  57   1         RW=0;        
  58   1         LCD_databus=value;
  59   1         EN=1;                                                //EN由1----0锁存有效数据 
  60   1         _nop_();             
  61   1         _nop_();
  62   1         EN=0;
  63   1      }
  64          
  65          uchar Read_LCD(void)                    //读数据函数 
  66          {
  67   1              uchar value;
  68   1              Read_busy();
  69   1              LCD_databus=0xFF;                       //先进行一次空读操作 
  70   1              RS=1;
  71   1              RW=1;
  72   1              EN=1;
  73   1              _nop_();
  74   1              _nop_();
  75   1              EN=0;
  76   1              
  77   1              LCD_databus=0xFF;                       //读取真正的数据 
  78   1              RS=1;
  79   1              RW=1;
  80   1              EN=1;
  81   1              value=LCD_databus;
  82   1              _nop_();
  83   1              _nop_();
  84   1              EN=0;
  85   1              
  86   1              return value; 
  87   1      }
  88          
  89          void Set_page(uchar page)               //设置“页”LCD12864共8页,一页是8行点阵点      
  90          {
  91   1        page=0xb8|page;                               //页的首地址为0xB8
  92   1        write_LCD_command(page);
  93   1      }
  94          
  95          void Set_line(uchar startline)  //设置显示的起始行         
  96          {
  97   1        startline=0xC0|startline;     //起始行地址为0xC0 
  98   1        write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示
  99   1      }
 100          
 101          void Set_column(uchar column)   //设置显示的列  
 102          {
 103   1        column=column &0x3f;                  //列的最大值为64
 104   1        column= 0x40|column;                  //列的首地址为0x40 
 105   1        write_LCD_command(column);    //规定显示的列的位置 
 106   1      }
 107          
 108          void SetOnOff(uchar onoff)              //显示开关函数:0x3E是关显示,0x3F是开显示   
 109          {
 110   1              onoff=0x3e|onoff;                       //onoff:1---开显示;0---关显示
 111   1              write_LCD_command(onoff);
 112   1      }
 113          
 114          void SelectScreen(uchar screen) //选择屏幕 
 115          {                                                
 116   1         switch(screen)
 117   1         { 
C51 COMPILER V8.02   MAIN                                                                  05/08/2012 23:39:39 PAGE 3   

 118   2               case 0: CS1=0;CS2=0;break; //全屏     
 119   2           case 1: CS1=0;CS2=1;break;//左半屏        
 120   2           case 2: CS1=1;CS2=0;break;//右半屏       
 121   2           default:break; 
 122   2         }
 123   1      }
 124          
 125          void ClearScreen(uchar screen)  //清屏函数  
 126          {       
 127   1           uchar i,j;
 128   1           SelectScreen(screen);              //0--全屏;1---左半屏;2---右半屏 
 129   1               for(i=0;i<8;i++)                       //控制页数0-7,共8页
 130   1               {
 131   2              Set_page(i);
 132   2                      Set_column(0);
 133   2              for(j=0;j<64;j++)          //控制列数0-63,共64列
 134   2                      {
 135   3                write_LCD_data(0x00); //写入0,地址指针自加1 
 136   3              }
 137   2           }                                   
 138   1      }
 139          
 140          void InitLCD()                                  //LCD的初始化  
 141          { 
 142   1              SetOnOff(1);                            //开显示
 143   1              SelectScreen(0);
 144   1              ClearScreen(0);                         //清屏
 145   1              Set_line(0);                            //开始行:0
 146   1      }
 147          
 148          void Draw_dots(uchar x,uchar y,uchar color)
 149          {
 150   1              uchar x_byte;
 151   1              uchar x_bit; 
 152   1              uchar Temp_data;                //暂时存放从LCD读出的数据 
 153   1              x_byte=(y>>3);                  //计算出该点属于哪个字节 
 154   1              x_bit=y-(x_byte<<3);    //属于字节的哪一位?
 155   1      
 156   1              
 157   1              if(x>63)                                //x>63则显示在右半屏 
 158   1              {
 159   2                      SelectScreen(2);
 160   2                      x=x-64;
 161   2              }
 162   1              else                                    //显示在左半屏 
 163   1              {
 164   2                      SelectScreen(1); 
 165   2              }
 166   1              Set_page(x_byte);               //设置行地址 
 167   1              Set_column(x);                  //设置列地址
 168   1              Temp_data=Read_LCD();   //先读出没打点前LCD中的数据 
 169   1              switch(color)
 170   1              {
 171   2                      case 0x01 : Temp_data &= ~(1<<x_bit);break;     //擦除
 172   2                      case 0x02 : Temp_data ^= (1<<x_bit); break;     //反白 
 173   2                      case 0x03 : Temp_data |= (1<<x_bit); break;     //画点 
 174   2                      default : break;
 175   2              } 
 176   1              
 177   1              Set_page(x_byte);
 178   1              Set_column(x);
 179   1              write_LCD_data(Temp_data);      //将处理后的数据送到LCD中显示 
C51 COMPILER V8.02   MAIN                                                                  05/08/2012 23:39:39 PAGE 4   

 180   1              
 181   1      }
 182          
 183          void Display_HZ(uchar ss,uchar page,uchar column,uchar *p)
 184          {
 185   1              uchar i;
 186   1              SelectScreen(ss);
 187   1              Set_page(page);                                 //写上半页
 188   1              Set_column(column*16);                  //控制列
 189   1              for(i=0;i<16;i++)                               //控制16列的数据输出
 190   1              {
 191   2                      write_LCD_data(p[i]);           //汉字的上半部分 
 192   2              }
 193   1              Set_page(page+1);                               //写下半页
 194   1              Set_column(column*16);                  //控制列
 195   1          for(i=0;i<16;i++)                           //控制16列的数据输出
 196   1              {
 197   2                      write_LCD_data(p[i+16]);        //汉字的下半部分 
 198   2              }
 199   1      } 
 200          
 201          void Display_picture(uchar a[][64])//显示图形--坐标 
 202          {
 203   1              uchar i,j;
 204   1              
 205   1              for(j=0;j<6;j++)
 206   1              {       
 207   2                      SelectScreen(1);
 208   2                      Set_page(j+2);                          //从第三页开始显示 
 209   2                      Set_column(0);
 210   2                      for(i=0;i<64;i++)
 211   2                      {
 212   3                              write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据
 213   3                      }
 214   2                      SelectScreen(2);
 215   2                      Set_page(j+2);
 216   2                      Set_column(0);
 217   2                      for(i=0;i<64;i++)
 218   2                      {
 219   3                              write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据
 220   3                      }       
 221   2              }       
 222   1      }
 223          void main()
 224          {  
 225   1              uchar x,y;
 226   1              InitLCD();                      //初始12864  
 227   1              ClearScreen(0);         //清屏
 228   1              Set_line(0);            //显示开始行
 229   1      
 230   1              Display_HZ(1,0,0,da);           //大
 231   1              Display_HZ(1,0,1,hai);          //海
 232   1              Display_HZ(1,0,2,xiang);        //橡
 233   1              Display_HZ(1,0,3,shu);          //树
 234   1              Display_HZ(2,0,0,bai);          //百
 235   1              Display_HZ(2,0,1,du);           //度
 236   1              Display_HZ(2,0,2,kong);         //空
 237   1              Display_HZ(2,0,3,jian);         //间
 238   1              Display_picture(BMP);           //坐标图
 239   1              for(x=12;x<128;x++)                     //正弦曲线
 240   1              {
 241   2                      y=35-18*sin((x-12)*3.14/16);
C51 COMPILER V8.02   MAIN                                                                  05/08/2012 23:39:39 PAGE 5   

 242   2                      Draw_dots(x,y,2);
 243   2              }
 244   1                      
 245   1              while(1);
 246   1      }
 247          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    768    ----
   CONSTANT SIZE    =   1024    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   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 + -