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

📄 lcd12864s.lst

📁 12864串行通信驱动
💻 LST
字号:
C51 COMPILER V7.07   LCD12864S                                                             11/02/2010 19:56:41 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE LCD12864S
OBJECT MODULE PLACED IN lcd12864s.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE lcd12864s.c DEBUG OBJECTEXTEND

stmt level    source

   1          /*************************************************
   2          名    称:LCD12864_ST7920串行测试程序
   3          试验功能:测试基于ST7920控制芯片的LCD12864的显示
   4                    串行方式连接;晶振11.0592M
   5          编    写:JiangX.net
   6          *************************************************/
   7          
   8          #include <reg52.h>
   9          #include <ziku.h>
  10          #include <intrins.h>
  11          #define uchar unsigned char
  12          #define uint unsigned int    //宏定义
  13          
  14          
  15          
  16          /*****LCD接口定义*****/
  17          sbit CS  = P2^4;      //片选信号
  18          sbit SID = P2^5;      //串行数据
  19          sbit SCLK = P2^6;      //串行同步时钟
  20          sbit PSB = P2^1;        //串并口选择 1:并口模式; 0:串口模式;
  21          
  22          /*****LCD功能初始化指令*****/
  23          #define CLEAR_SCREEN 0x01   //清屏指令:清屏且AC值为00H
  24          #define AC_INIT   0x02   //将AC设置为00H。且游标移到原点位置,位置归位
  25          #define CURSE_ADD  0x06   //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
  26          #define FUN_MODE  0x30   //工作模式:8位基本指令集
  27          #define DISPLAY_ON  0x0c   //显示开,显示游标,且游标位置反白
  28          #define DISPLAY_OFF  0x08   //显示关
  29          #define CURSE_DIR  0x14   //游标向右移动:AC=AC+1
  30          #define SET_CG_AC  0x40   //设置AC,范围为:00H~3FH
  31          #define SET_DD_AC  0x80
  32          
  33          /*****汉字地址表*****/
  34          uchar code addr_tab[]={
  35          0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
  36          0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
  37          0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
  38          0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
  39          };
  40          
  41          /*****n(ms)延时子程序****     */
  42          void delayms(uint t)     //约延时n(ms)
  43          {
  44   1       uint i;
  45   1       while(t--)
  46   1       {
  47   2        for(i=120;i>0;i--);
  48   2       }        
  49   1      }
  50            
  51          
  52          
  53          
  54          
  55          
C51 COMPILER V7.07   LCD12864S                                                             11/02/2010 19:56:41 PAGE 2   

  56          
  57          
  58          
  59          /*****串行发送一个字节*****/
  60          void SendByte(uchar Dbyte)
  61          {
  62   1           uchar i;
  63   1           for(i=0;i<8;i++)
  64   1           {
  65   2                 SCLK = 0;
  66   2                 Dbyte=Dbyte<<1;        //左移一位
  67   2                 SID = CY;              //移出的位给SID
  68   2                 SCLK = 1;
  69   2                 SCLK = 0;
  70   2           }
  71   1      }
  72          
  73          /*****串行接收一个字节*****/
  74          uchar ReceiveByte(void)
  75          {
  76   1           uchar i,temp1,temp2;
  77   1           temp1 = 0;
  78   1           temp2 = 0;
  79   1           for(i=0;i<8;i++)
  80   1           {
  81   2                 temp1=temp1<<1;
  82   2                 SCLK = 0;
  83   2                 SCLK = 1;            
  84   2                 SCLK = 0;
  85   2                 if(SID) temp1++;
  86   2           }
  87   1           for(i=0;i<8;i++)
  88   1           {
  89   2                 temp2=temp2<<1;
  90   2                 SCLK = 0;
  91   2                 SCLK = 1;
  92   2                 SCLK = 0;
  93   2                 if(SID) temp2++;
  94   2                      
  95   2           }
  96   1                   
  97   1           return ((0xf0&temp1)+(0x0f&temp2));
  98   1      }
  99          
 100          /*****检测LCD忙状态*****/
 101          void CheckBusy( void )
 102          {
 103   1            do SendByte(0xfc);         //11111,RW(1),RS(0),0
 104   1           while(0x80&ReceiveByte());       //BF(.7)=1 Busy
 105   1      }
 106          
 107          /*****写指令*****/
 108          void Lcd_WriteCmd(uchar Cbyte )
 109          {
 110   1           CS = 1;
 111   1           CheckBusy();
 112   1           SendByte(0xf8);              //11111,RW(0),RS(0),0
 113   1           SendByte(0xf0&Cbyte);        //高四位
 114   1           SendByte(0xf0&Cbyte<<4);   //低四位(先执行<<)
 115   1           CS = 0;
 116   1      }
 117          
C51 COMPILER V7.07   LCD12864S                                                             11/02/2010 19:56:41 PAGE 3   

 118          /*****写数据*****/
 119          void Lcd_WriteData(uchar Dbyte )
 120          {
 121   1           CS = 1;
 122   1           CheckBusy();
 123   1           SendByte(0xfa);              //11111,RW(0),RS(1),0
 124   1           SendByte(0xf0&Dbyte);        //高四位
 125   1           SendByte(0xf0&Dbyte<<4);   //低四位(先执行<<)
 126   1           CS = 0;
 127   1      }
 128          
 129          /*****初始化LCD*****/              //里面有清除显示的命令
 130          void Lcd_Init(void)
 131          { 
 132   1          PSB = 0;
 133   1       delayms(50);
 134   1          Lcd_WriteCmd(0x30);        //选择基本指令集
 135   1       delayms(1);
 136   1          Lcd_WriteCmd(0x30);          //选择8bit数据流
 137   1       delayms(1);
 138   1          Lcd_WriteCmd(0x0c);          //开显示(无游标、不反白)
 139   1       delayms(1);
 140   1          Lcd_WriteCmd(0x01);          //清除显示,并且设定地址指针为00H
 141   1       delayms(20);
 142   1      }
 143          
 144          /*****显示汉字*****/
 145          void hanzi_Disp(uchar x,uchar y,uchar code *s)//只能在同一行中显示,不能实现自动换行
 146          { 
 147   1       Lcd_WriteCmd(addr_tab[8*x+y]);  //写地址
 148   1       while(*s>0)
 149   1          { 
 150   2        Lcd_WriteData(*s);    //写数据
 151   2        s++;     
 152   2          }
 153   1      }
 154          
 155          /*****显示图片(显示Gdram内容)*****/
 156          
 157          /*绘图显示的步骤
 158          1 关闭绘图显示功能
 159          2 先将垂直的坐标(Y)写入绘图RAM地址
 160          3 再将水平的位元组坐标(X)写入绘图RAM地址
 161          4 将D15-D8写入RAM中
 162          5 将D7-D0写入到RAM中
 163          6 打开绘图显示功能*/
 164          
 165          //图片取模方式:横向取模,字节正序
 166          void pic_Disp(uchar *pic)    //显示Gdram内容(显示图片)
 167          {
 168   1       uchar x,y,i;
 169   1       for(i=0;i<9;i=i+8)
 170   1       for(y=0;y<32;y++)
 171   1       {
 172   2        for(x=0;x<8;x++)
 173   2        {
 174   3         Lcd_WriteCmd(0x36);      //扩充指令,开绘图显示
 175   3         Lcd_WriteCmd(0x80+y);    //行地址
 176   3         Lcd_WriteCmd(0x80+x+i);  //列地址
 177   3         Lcd_WriteData(*pic++);   //写数据 D15-D8
 178   3         Lcd_WriteData(*pic++);   //写数据 D7-D0
 179   3         Lcd_WriteCmd(0x30);      //扩充指令,关绘图显示
C51 COMPILER V7.07   LCD12864S                                                             11/02/2010 19:56:41 PAGE 4   

 180   3        }
 181   2       }
 182   1      }
 183          
 184          /*****整屏显示竖条*****/
 185          //当i=0时显示上面128×32,当i=8时显示下面128×32
 186          //当i=0时显示上面128×32,当i=8时显示下面128×32
 187          void LcdFill_Vertical()
 188          {  
 189   1       uchar x,y,i;
 190   1          for(i=0;i<9;i=i+8)   
 191   1       for(y=0;y<0x20;y++)
 192   1       {     
 193   2        for(x=0;x<8;x++)
 194   2             { 
 195   3                Lcd_WriteCmd(0x36);   //扩充指令 绘图显示
 196   3                Lcd_WriteCmd(y+0x80);       //行地址
 197   3                Lcd_WriteCmd(x+0x80+i);     //列地址     
 198   3                Lcd_WriteData(0x55);   //写数据 D15-D8 
 199   3                Lcd_WriteData(0x55);   //写数据 D7-D0  
 200   3                Lcd_WriteCmd(0x30);
 201   3             }
 202   2       } 
 203   1      }
 204          
 205          /*****整屏显示横条*****/
 206          void LcdFill_Level()
 207          { 
 208   1        uchar x,y,i;
 209   1          uchar k;   
 210   1          for(i=0;i<9;i+=8)    
 211   1             for(y=0;y<0x20;y++)
 212   1             {     
 213   2         if((y%2)==1) k=0xff;
 214   2                  else k=0;
 215   2                  for(x=0;x<8;x++)
 216   2                  {  
 217   3          Lcd_WriteCmd(0x36);   //扩充指令 绘图显示
 218   3                      Lcd_WriteCmd(y+0x80); //行地址
 219   3                      Lcd_WriteCmd(x+0x80+i); //列地址            
 220   3                      Lcd_WriteData(k);
 221   3                      Lcd_WriteData(k);
 222   3               Lcd_WriteCmd(0x30);
 223   3                  }
 224   2             }     
 225   1      }
 226          
 227          /*****整屏充满亮点或暗点*****/
 228          //当i=0时显示上面128×32,当i=8时显示下面128×32
 229          //当i=0时显示上面128×32,当i=8时显示下面128×32
 230          void Lcd_Fill(uchar test)
 231          {  
 232   1       uchar x,y,i;
 233   1          for(i=0;i<9;i=i+8)   
 234   1       for(y=0;y<0x20;y++)
 235   1       {     
 236   2        for(x=0;x<8;x++)
 237   2             { 
 238   3                Lcd_WriteCmd(0x36);   //扩充指令 绘图显示
 239   3                Lcd_WriteCmd(y+0x80);       //行地址
 240   3                Lcd_WriteCmd(x+0x80+i);     //列地址     
 241   3                Lcd_WriteData(test);   //写数据 D15-D8 
C51 COMPILER V7.07   LCD12864S                                                             11/02/2010 19:56:41 PAGE 5   

 242   3                Lcd_WriteData(test);   //写数据 D7-D0  
 243   3                Lcd_WriteCmd(0x30);
 244   3             }
 245   2       } 
 246   1      }
 247          
 248          /*****主函数*****/
 249          void main(void)
 250          {
 251   1       Lcd_Init();
 252   1       while(1)
 253   1       {
 254   2       Lcd_Init();
 255   2        hanzi_Disp(0,0,"光伏项目组:");
 256   2        hanzi_Disp(1,1,"LCD测试程序");
 257   2        hanzi_Disp(2,0,"越做越好");
 258   2        hanzi_Disp(3,3,"");
 259   2        delayms(2000);
 260   2      
 261   2        Lcd_Init();
 262   2        //Lcd_Fill(0xff);
 263   2        hanzi_Disp(1,2,"坏点检测");
 264   2        delayms(500);
 265   2      
 266   2        Lcd_Init();
 267   2        Lcd_Fill(0xff);
 268   2        delayms(1500);
 269   2        
 270   2        Lcd_Init();
 271   2        LcdFill_Vertical();
 272   2        delayms(750);
 273   2      
 274   2        Lcd_Init();
 275   2        LcdFill_Level();
 276   2        delayms(750);
 277   2      
 278   2        Lcd_Init();
 279   2        hanzi_Disp(1,2,"唐诗演示");
 280   2        delayms(500); 
 281   2      
 282   2         Lcd_Init();
 283   2        hanzi_Disp(0,0,tangshi);
 284   2        delayms(1500);
 285   2      
 286   2        Lcd_Init();
 287   2        hanzi_Disp(1,2,"显示图片");
 288   2        delayms(500);
 289   2      
 290   2                                      
 291   2      
 292   2      
 293   2       /* Lcd_Init();
 294   2        pic_Disp(LCDsheji);
 295   2        delayms(1000);   
 296   2        
 297   2        Lcd_Init();
 298   2        pic_Disp(rmb);
 299   2        delayms(1000);
 300   2      
 301   2        Lcd_Init();
 302   2        pic_Disp(qiche);
 303   2        delayms(1000);
C51 COMPILER V7.07   LCD12864S                                                             11/02/2010 19:56:41 PAGE 6   

 304   2      
 305   2        Lcd_Init();
 306   2        pic_Disp(gongji);
 307   2        delayms(1000);
 308   2      
 309   2        Lcd_Fill(0x00);      //清显示RAM
 310   2        delayms(500);   */
 311   2        
 312   2        
 313   2                        
 314   2        }
 315   1      }
 316          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    703    ----
   CONSTANT SIZE    =   4255    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       8
   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 + -