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

📄 main.lst

📁 自己做的单片机Proteus仿真实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   MAIN                                                                  05/09/2012 00:01:34 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          程序:LCD12864显示图形 
   3          内容:在12864上显示正弦曲线——按键可调频率和幅度 
   4          学习板:HOT-51
   5          软件:keil uVision3
   6          液晶:QY12864HZ1 
   7          作者:大海橡树
   8          整理日期:2010-12-08
   9          修改:无 
  10          
  11          
  12          备注:有什么错误的地方,欢迎网友们到空间留言
  13          
  14                                                  O(∩_∩)O~
  15          
  16          
  17          ********http://hi.baidu.com/echoas********/
  18          #include<AT89X52.h>
  19          #include<math.h>
  20          #include"ZB.h"
  21          #define uchar unsigned char
  22          #define uint  unsigned int
  23          
  24          #define LCD_databus P0 //LCD数据总线连接P0口 
  25          
  26          sbit RS=P2^5;
  27          sbit RW=P2^6;
  28          sbit EN=P2^7;//LCD12864三个控制位 
  29          
  30          sbit DQ=P2^3;//DS18B20数据线 
  31          sbit KEY1=P3^2;
  32          sbit KEY2=P3^3;
  33          sbit KEY3=P3^4;
  34          uchar key_value;
  35          
  36          uchar HZ1[]="周期";
  37          uchar HZ2[]="幅度";
  38          void delay(uint i)      //延时函数 
  39          {
  40   1              while(--i);
  41   1      }
  42          void Read_busy()        //LCD12864忙检测 
  43          {
  44   1              RS=0;
  45   1              RW=1;
  46   1              EN=1;
  47   1              LCD_databus=0xFF;
  48   1              while(LCD_databus & 0x80);      //判断最高位,1---busy,0---Nobusy 
  49   1              EN=0;
  50   1      }
  51          
  52          void write_LCD_command(uchar value)//写指令 
  53          {
  54   1              RS=0;
  55   1              RW=0;
C51 COMPILER V8.02   MAIN                                                                  05/09/2012 00:01:34 PAGE 2   

  56   1              EN=1;
  57   1              LCD_databus=value;
  58   1              delay(7);
  59   1              EN=0;
  60   1      }
  61          
  62          void write_LCD_data(uchar value)//写数据 
  63          {
  64   1              RS=1;
  65   1              RW=0;
  66   1              EN=1;
  67   1              LCD_databus=value;
  68   1              delay(7);
  69   1              EN=0;
  70   1      }
  71          
  72          void init_LCD()         //初始化LCD 
  73          {
  74   1              write_LCD_command(0x30);        //8位数,基本指令 
  75   1              delay(100);
  76   1              write_LCD_command(0x30);
  77   1              delay(37);
  78   1              write_LCD_command(0x0C);        //开显示,不显示光标,光标不闪烁 
  79   1              delay(100);
  80   1              write_LCD_command(0x01);        //清屏指令 
  81   1              delay(100);
  82   1              write_LCD_command(0x06);        //没写入数据,地址指针加1 
  83   1      }
  84          
  85          void Clear_GDRAM()              //清楚GDRAM 
  86          {
  87   1              uchar x,y;
  88   1              for(y=0;y<64;y++)
  89   1              {
  90   2                      for(x=0;x<16;x++)
  91   2                      {
  92   3                              write_LCD_command(0x34);
  93   3                              write_LCD_command(y+0x80);      //先送垂直地址 
  94   3                              write_LCD_command(x+0x80);      //后送水平地址 
  95   3                              write_LCD_command(0x30);        //基本指令 
  96   3                              write_LCD_data(0x00);           //写入数据0 
  97   3                              write_LCD_data(0x00);
  98   3                      }
  99   2              }
 100   1      }
 101          
 102          uchar ReadByte()        //读LCD 
 103          {
 104   1              uchar Read_value;
 105   1              Read_busy();
 106   1              RS=1;
 107   1              RW=1;
 108   1              EN=0;
 109   1              EN=1;
 110   1              Read_value=LCD_databus; 
 111   1              EN=0;
 112   1              
 113   1              return Read_value;
 114   1      }
 115          
 116          void display_BMP(uchar *address)//显示图片 
 117          {
C51 COMPILER V8.02   MAIN                                                                  05/09/2012 00:01:34 PAGE 3   

 118   1              uchar i,j;
 119   1              for(i=16;i<32;i++)
 120   1              {
 121   2                      write_LCD_command(0x80+i);      //先送垂直地址 
 122   2                      write_LCD_command(0x80);        //再送水平地址 
 123   2                      for(j=0;j<16;j++)
 124   2                      {
 125   3                              write_LCD_data(*address);//写入数据 
 126   3                              address++;
 127   3                      }
 128   2              }
 129   1              
 130   1              for(i=0;i<32;i++)
 131   1              {
 132   2                      write_LCD_command(0x80+i);//先送垂直地址 
 133   2                      write_LCD_command(0x88);        //再送水平地址
 134   2                      for(j=0;j<16;j++)
 135   2                      {
 136   3                              write_LCD_data(*address);
 137   3                              address++;
 138   3                      }
 139   2              }
 140   1              
 141   1      }
 142          
 143          void Draw_dots(uchar x,uchar y,uchar color)
 144          {
 145   1              uchar ROW,xlabel,xlabel_bit;
 146   1              uchar Read_H,Read_L;            //读LCD中的数据
 147   1              write_LCD_command(0x34);        //扩充指令
 148   1              write_LCD_command(0x36);        //打开绘图指令
 149   1              xlabel=x>>4;                            //取16*16首地址
 150   1              xlabel_bit=x & 0x0F;            //计算该点在16位数据的第几位    
 151   1              if(y<32)                                        //如果是上半屏,上下半屏y都是0--31
 152   1              {
 153   2                      ROW=y;
 154   2              }
 155   1              else                                            //显示的是下半屏
 156   1              {
 157   2                      ROW=y-32;
 158   2                      xlabel+=8;                         //规定显示在下半屏
 159   2              }
 160   1              write_LCD_command(ROW+0x80); //送入垂直地址
 161   1              write_LCD_command(xlabel+0x80);//再送入水平地址
 162   1              ReadByte();     //读取当前GDRAM数据前腰进行一次空读,接下来就可以读出数据了 
 163   1              Read_H=ReadByte(); //读高8位
 164   1              Read_L=ReadByte(); //读低8位

⌨️ 快捷键说明

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