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

📄 lcd_elbe.lst

📁 大家好
💻 LST
字号:
C51 COMPILER V7.50   LCD_ELBE                                                              08/13/2007 14:29:46 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE LCD_ELBE
OBJECT MODULE PLACED IN lcd_Elbe.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE lcd_Elbe.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /***************************************************************\
   2          |*          12864LCD显示程序 proteus6.9 仿真AMPIRE128*64       *|
   3          |*          制作人:熊涛                                       *|
   4          |*          时间:2007年4月12日                                *|
   5          |*          接口定义:P1接数据  DB7~DB0                         *|
   6          |*                    P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 接控制线   *|  
   7          |*                    具体见定义                               *|
   8          \***************************************************************/
   9          
  10          
  11          
  12          /*Keyboard接线
  13          PS/2--------51
  14          1 DATA------P2.0
  15          3 GND
  16          4 VCC
  17          5 CLK-------P3.3 接在51的外部中断,触发方式为低电平
  18          [注:AT89x51使用12M或11.0592M晶振,实测使用11.0592M]*/
  19          
  20          #include <reg52.h>
  21          #include <string.h>
  22          #include <Asc8_16.h> 
  23          #include <start.h>
  24          #include <scancodes.h>
  25          
  26          
  27          typedef unsigned char uchar;
  28          typedef unsigned int  uint;
  29          
  30          
  31          sbit DI  =P3^7;       // 数据\指令 选择
  32          sbit RW  =P3^6;       // 读\写 选择
  33          sbit E   =P3^5;       // 读\写使能
  34          sbit CS2 =P3^4;       // 片选1
  35          sbit CS1 =P3^3;       // 片选2
  36          sbit RST =P3^2;       // 复位
  37          
  38          sbit Key_Data = P2^0;
  39          sbit Key_CLK  = P2^1;
  40          static unsigned char IntNum = 0; //中断次数计数
  41          static unsigned char KeyV; //键值
  42          static unsigned char DisNum = 0; //显示用指针
  43          static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
  44          static unsigned char BF = 0; //标识是否有字符被收到
  45          
  46          
  47          /**********************************************\
  48          |*   写命令子程序                             *|
  49          |*   入口参数:cmd 控制命令数据               *|
  50          |*   出口参数:null                           *|
  51          |*   调用函数: null                           *|
  52          \**********************************************/ 
  53          void write_cmd(uchar cmd)             //写命令子程序 
  54          { uchar t=30;
  55   1        RW=0;
C51 COMPILER V7.50   LCD_ELBE                                                              08/13/2007 14:29:46 PAGE 2   

  56   1        DI=0;    //DI=0 写命令 
  57   1        E=1;
  58   1        P1=cmd;
  59   1        while(t--);//如果不延时 将会出现不可预料的错误 显示的汉字会出现错误的现象 而且随机出现
  60   1        E=0;       //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR 
  61   1                         }
  62          
  63          /**********************************************\
  64          |*   写数据子程序                             *|
  65          |*   入口参数:dat 显示字符的数据             *|
  66          |*             oppo 标志位 1:显示阳文         *|
  67          |*                                     0:显示阴文         *|
  68          |*   出口参数:null                           *|
  69          |*   调用函数: null                           *|
  70          \**********************************************/ 
  71          void write_dat(uchar dat,bit oppo)             //写数据子程序
  72          { uchar t=30;
  73   1        RW=0;
  74   1        DI=1;   //DI=1  写数据
  75   1        E=1;
  76   1        if(oppo==0) P1=~dat;                         //按位取反得阴文
  77   1        if(oppo==1) P1=dat;
  78   1        oppo=1;
  79   1        while(t--);
  80   1        E=0;      //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR 
  81   1                            }
  82          
  83          /**********************************************\
  84          |*   设置显示起始行 X地址和Y地址              *|
  85          |*   入口参数:st_line 显示起始行 0~63        *| 
  86          |*             x_add   页地址  8行为一页 0~7  *|
  87          |*                 y_add   Y地址  0~128           *|
  88          |*   出口参数:null                           *|
  89          |*   调用函数: write_cmd()                    *|
  90          \**********************************************/ 
  91          
  92          void set_dis(uchar st_line,uchar x_add,uchar y_add)  //设置显示起始行 X地址和Y地址
  93          {
  94   1        write_cmd(st_line+0xc0);      //+0xc0是参照设置起始行的格式
  95   1        write_cmd(x_add+0xb8);        //+0xb8是参照设置页地址的格式
  96   1        if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);} //Y_add地址实际上只有0~63 采用CS1和CS2选左右半屏
  97   1            else     { CS1=1;CS2=0;write_cmd(y_add);}
  98   1       }
  99          
 100          
 101          
 102          
 103          /***********************************************\
 104          |*   写数字标点字母子程序1 可以在任意位置写入  *|
 105          |*   入口参数:st_line 显示起始行 0~63         *| 
 106          |*             x_add   页地址  8行为一页 0~7   *|
 107          |*                 y_add   Y地址  0~128            *|
 108          |*             ASC     字符的ACSII码           *|
 109          |*   出口参数:null                            *|
 110          |*   调用函数: write_cmd()  set_dis()          *|
 111          |*             strcmp()     write_dat()        *|
 112          \***********************************************/ 
 113          void write_num_all(uchar st_line,uchar x_add,uchar y_add,uchar ASC)
 114          { uchar j;
 115   1        bit oppo=1;
 116   1        if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);}
 117   1            else     { CS1=1;CS2=0;write_cmd(y_add);}
C51 COMPILER V7.50   LCD_ELBE                                                              08/13/2007 14:29:46 PAGE 3   

 118   1        set_dis(st_line, x_add,y_add);
 119   1        for(j=0;j<8;j++)   write_dat(nAsciiDot[(ASC-32)*16+j],oppo);   //逐字节写入
 120   1        set_dis(st_line, x_add+1,y_add);                 //下一页 写字的下半部分
 121   1        for(j=8;j<16;j++)  write_dat(nAsciiDot[(ASC-32)*16+j],oppo);  //此处用break是为了能跳出for循环  
 122   1                                                                  }
 123           
 124          /***********************************************\
 125          |*   写数字标点字母子程序2  只能在指定位置写入 *|
 126          |*   入口参数:n 指定地址 0~63 全屏32字(16*16) *|
 127          |*              ASC     字符的ACSII码          *|
 128          |*   出口参数:null                            *|
 129          |*   调用函数: write_num_all()                 *|
 130          |*                                             *|
 131          \***********************************************/ 
 132          void write_num(uchar n,uchar ASC) //写入数字或字母或标点
 133          { uchar st_line=0,x_add=n%64/16*2,y_add=n%64%16*8;
 134   1        write_num_all(st_line,x_add,y_add,ASC); 
 135   1        }                                          
 136          
 137          
 138          /***********************************************\
 139          |*   画图子程序     全屏画图                   *|
 140          |*   入口参数:图片数据代码数组 1024的数组     *|
 141          |*                                             *|
 142          |*   出口参数:null                            *|
 143          |*   调用函数: set_dis()                       *|
 144          |*             write_dat( )                    *|
 145          \***********************************************/ 
 146          void draw_picture(uchar picture[1024])
 147          { int i;
 148   1        uchar j=0;
 149   1        for(j=0;j<8;j++)
 150   1         { set_dis(0,j,0);
 151   2           for(i=j*128;i<j*128+64;i++)     write_dat(picture[i],1);
 152   2           set_dis(0,j+1,64);    
 153   2           for(i=j*128+64;i<j*128+128;i++) write_dat(picture[i],1);   }
 154   1                                                                       }
 155           
 156          
 157          /**********************************************\
 158          |*   清屏子程序                               *|
 159          |*   入口参数:null                           *|
 160          |*   出口参数:null                           *|
 161          |*   调用函数: write_num()                    *|
 162          \**********************************************/                                                          
 163          void cls_display(void)
 164          { uchar i;
 165   1        for(i=0;i<64;i++)  write_num(i,' '); 
 166   1        DisNum = 0;}
 167          
 168          
 169          /**********************************************\
 170          |*   初始化子程序                             *|
 171          |*   入口参数:null                           *|
 172          |*   出口参数:null                           *|
 173          |*   调用函数: null                           *|
 174          \**********************************************/ 
 175          void initial(void)                        //初始化子程序
 176          { write_cmd(0x3e);   //关显示
 177   1        } 
 178          
 179          
C51 COMPILER V7.50   LCD_ELBE                                                              08/13/2007 14:29:46 PAGE 4   

 180          
 181          void Keyboard_out(void)
 182          {       if ((IntNum > 0) && (IntNum < 9))
 183   1                {     KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 184   2                      if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 185   2                                                                                                      }
 186   1              IntNum++;
 187   1              while (!Key_CLK); //等待PS/2CLK拉高
 188   1              if (IntNum > 10)
 189   1                {     IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 190   2                      BF = 1; //标识有字符输入完了
 191   2                      EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要
             -声明为再入函数)
 192   2                                                                                              }                                       }
 193          
 194          void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
             -+shift的断码+G的断码
 195          {       unsigned char TempCyc;
 196   1              if (!Key_UP) //当键盘松开时
 197   1           {  switch (ScanCode)
 198   2                       {      case 0xF0 : Key_UP = 1; break;// 当收到0xF0,Key_UP置1表示断码开始
 199   3                              case 0x12 : Shift = 1;break;// 左 SHIFT
 200   3                              case 0x59 : Shift = 1;break;// 右 SHIFT
 201   3                              case 0x37 : cls_display();break; //power键清屏
 202   3                              case 0x76 : draw_picture(nBitmapDot);break; //ESC键显示图片
 203   3                              case 0x66 : write_num(--DisNum,' ');break;  //backspace键删除前一个字
 204   3                              case 0x5a : DisNum=(DisNum&0xf0)+0x10;break; 
 205   3                              default:if (DisNum == 64)       DisNum = 0;       
 206   3                                              if(!Shift) //如果SHIFT没按下
 207   3                              {       for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //

⌨️ 快捷键说明

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