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

📄 main.lst

📁 自己做的单片机Proteus仿真实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   MAIN                                                                  05/08/2012 23:40:12 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驱动AMPIRE128*64液晶
   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"source.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          sbit KEY1=P3^0;
  31          sbit KEY2=P3^1;
  32          sbit KEY3=P3^2; //三个按键控制口 
  33          
  34          
  35          void delay(uint i)
  36          {
  37   1              while(--i);
  38   1      }
  39          void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy             
  40          {
  41   1              P0=0x00;
  42   1              RS=0;  
  43   1              RW=1; 
  44   1              EN=1;
  45   1              while(P0 & 0x80);
  46   1              EN=0;
  47   1      }
  48          
  49          void write_LCD_command(uchar value)     //写命令函数 
  50          {
  51   1         Read_busy();                                         //对LCD的每次读写都要读忙 
  52   1         RS=0;                                                        //选择命令 
  53   1         RW=0;                                                        //读操作 
  54   1         LCD_databus=value;
  55   1         EN=1;                                                        //EN由1----0锁存有效数据 
C51 COMPILER V8.02   MAIN                                                                  05/08/2012 23:40:12 PAGE 2   

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

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

 180   2                      case 0x03 : Temp_data |= (1<<x_bit); break;     //画点 
 181   2                      default : break;
 182   2              } 
 183   1              
 184   1              Set_page(x_byte);
 185   1              Set_column(x);
 186   1              write_LCD_data(Temp_data);      //将处理后的数据送到LCD中显示 
 187   1              
 188   1      }
 189          /**********************************
 190          两点间画直线:
 191          x1<x2<127,y1<y2<64
 192          ***********************************/                    
 193          void Draw_line(unsigned char x1,y1,x2,y2)
 194          {

⌨️ 快捷键说明

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