lcmdrv.lst

来自「51单片机在lcd上实现zlg gui,希望好的请多加点分数」· LST 代码 · 共 489 行 · 第 1/2 页

LST
489
字号
 230   1        for(x=0; x<8; x++)
 231   1        { LCM_WrCommand(LCM_ADDRSTRX+x);      // 设置页地址,即X
 232   2              LCM_WrCommand(LCM_ADDRSTRY);    // 设置列地址,即Y
 233   2          for(y=0; y<64; y++)
 234   2          { LCM_WrData(filldata);
 235   3              }       
 236   2        }
 237   1      }
 238          
 239              
 240          /***********************************************************************
C51 COMPILER V7.50   LCMDRV                                                                09/11/2007 21:56:41 PAGE 5   

 241          * 名称:LCM_DispIni()
 242          * 功能:LCM显示初始化
 243          * 入口参数:无
 244          * 出口参数:无
 245          * 注:初化显示后,清屏并设置显示起始行为0
 246          *     会复位LCM_DISPCX,LCM_DISPCY.(并会只选中CS1)
 247          ***********************************************************************/
 248          void LCM_DispIni(void)
 249          { uint32  i;
 250   1      
 251   1          // 设置引脚连接模块
 252   1      
 253   1        // 复位LCM
 254   1        CRST();                               
 255   1        for(i=0; i<5000; i++);
 256   1        SRST();   
 257   1        for(i=0; i<5000; i++); 
 258   1      
 259   1        SCS1();                                       // 选中两个控制芯片     
 260   1        SCS2();  
 261   1      
 262   1        LCM_WrCommand(LCM_DISPOFF);   // 打开显示     
 263   1        LCM_WrCommand(LCM_STARTROW);  // 设置显示起始行为0
 264   1              
 265   1        LCM_WrCommand(LCM_ADDRSTRX);  // 设置页地址,即X      
 266   1        LCM_WrCommand(LCM_ADDRSTRY);  // 设置列地址,即Y
 267   1        LCM_WrCommand(LCM_DISPON);    // 打开显示             
 268   1      }
 269          
 270          
 271          
 272          /////////////////////////////////////////////////////////////////////////////
 273          
 274          
 275          /****************************************************************************
 276          * 名称:GUI_FillSCR()
 277          * 功能:全屏填充。直接使用数据填充显示缓冲区。
 278          * 入口参数:dat         填充的数据
 279          * 出口参数:无
 280          * 说明:用户根据LCM的实际情况编写此函数。
 281          ****************************************************************************/
 282          void  GUI_FillSCR(TCOLOR dat)
 283          {  uint32 i,j;
 284   1        
 285   1         // 填充缓冲区
 286   1         for(i=0; i<(GUI_LCM_YMAX/8); i++)
 287   1         {  for(j=0; j<GUI_LCM_XMAX; j++)
 288   2            {  gui_disp_buf[i][j] = dat;
 289   3            }
 290   2         }
 291   1         
 292   1         // 填充LCM
 293   1         LCM_DispFill(dat);
 294   1      }
 295          
 296          
 297          /****************************************************************************
 298          * 名称:GUI_Initialize()
 299          * 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
 300          * 入口参数:无
 301          * 出口参数:无
 302          * 说明:用户根据LCM的实际情况编写此函数。
C51 COMPILER V7.50   LCMDRV                                                                09/11/2007 21:56:41 PAGE 6   

 303          ****************************************************************************/
 304          void  GUI_Initialize(void)
 305          {  LCM_DispIni();                                       // 初始化LCM模块工作模式,纯图形模式
 306   1         GUI_FillSCR(0x00);                           // 初始化缓冲区为0x00,并输出屏幕(清屏)
 307   1      }
 308          
 309          
 310          uint8 const  DEC_HEX_TAB[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
 311          /****************************************************************************
 312          * 名称:GUI_Point()
 313          * 功能:在指定位置上画点。
 314          * 入口参数:x           指定点所在列的位置
 315          *           y           指定点所在行的位置
 316          *           color       显示颜色(对于黑白色LCM,为0时灭,为1时显示)
 317          * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
 318          * 说明:操作失败原因是指定地址超出缓冲区范围。
 319          ****************************************************************************/
 320          uint8  GUI_Point(uint8 x, uint8 y, TCOLOR color)
 321          {  uint8   bak;
 322   1         
 323   1         // 参数过滤 
 324   1         if(x>=GUI_LCM_XMAX) return(0);
 325   1         if(y>=GUI_LCM_YMAX) return(0);
 326   1         
 327   1         // 设置相应的点为1或0 
 328   1         bak = LCM_ReadByte(x,y);
 329   1         if(0==color)
 330   1         {  bak &= (~DEC_HEX_TAB[y&0x07]);
 331   2         }
 332   1         else
 333   1         {  bak |= DEC_HEX_TAB[y&0x07];
 334   2         }
 335   1        
 336   1         // 刷新显示 
 337   1         LCM_WriteByte(x, y, bak);
 338   1         return(1);
 339   1      }
 340          
 341          
 342          /****************************************************************************
 343          * 名称:GUI_ReadPoint()
 344          * 功能:读取指定点的颜色。
 345          * 入口参数:x           指定点所在列的位置
 346          *           y           指定点所在行的位置
 347          *           ret     保存颜色值的指针
 348          * 出口参数:返回0表示指定地址超出缓冲区范围
 349          * 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
 350          *      RGB结构则R、G、B变量有效。
 351          ****************************************************************************/
 352          /*uint8  GUI_ReadPoint(uint8 x, uint8 y, TCOLOR *ret)
 353          {  uint8  bak;
 354          
 355             // 参数过滤
 356             if(x>=GUI_LCM_XMAX) return(0);
 357             if(y>=GUI_LCM_YMAX) return(0);
 358            
 359             bak = LCM_ReadByte(x,y);
 360             if( (bak & (DEC_HEX_TAB[y&0x07])) == 0 ) *ret = 0x00;
 361               else  *ret = 0x01;
 362             
 363             return(1);
 364          }
C51 COMPILER V7.50   LCMDRV                                                                09/11/2007 21:56:41 PAGE 7   

 365          
 366          
 367          /****************************************************************************
 368          * 名称:GUI_HLine()
 369          * 功能:画水平线。
 370          * 入口参数:x0          水平线起点所在列的位置
 371          *           y0          水平线起点所在行的位置
 372          *           x1      水平线终点所在列的位置
 373          *           color       显示颜色(对于黑白色LCM,为0时灭,为1时显示)
 374          * 出口参数:无
 375          * 说明:操作失败原因是指定地址超出缓冲区范围。
 376          ****************************************************************************/
 377          void  GUI_HLine(uint8 x0, uint8 y0, uint8 x1, TCOLOR color) 
 378          {  uint8  bak;
 379   1      
 380   1         if(x0>x1)                                            // 对x0、x1大小进行排列,以便画图
 381   1         {  bak = x1;
 382   2            x1 = x0;
 383   2            x0 = bak;
 384   2         }
 385   1         
 386   1         do
 387   1         {  GUI_Point(x0, y0, color);         // 逐点显示,描出垂直线
 388   2            x0++;
 389   2         }while(x1>=x0);
 390   1      }
 391          
 392          
 393          /***********************************************************************
 394          * 名称:GUI_RLine()
 395          * 功能:画竖直线。根据硬件特点,实现加速。
 396          * 入口参数:x0          垂直线起点所在列的位置
 397          *           y0          垂直线起点所在行的位置
 398          *           y1      垂直线终点所在行的位置
 399          *           color       显示颜色(对于黑白色LCM,为0时灭,为1时显示)
 400          * 出口参数:    无
 401          * 说明:操作失败原因是指定地址超出缓冲区范围。
 402          ***********************************************************************/
 403          void  GUI_RLine(uint8 x0, uint8 y0, uint8 y1, TCOLOR color) 
 404          {  uint8  bak;
 405   1         uint8  wr_dat;
 406   1        
 407   1         if(y0>y1)            // 对y0、y1大小进行排列,以便画图
 408   1         {  bak = y1;
 409   2            y1 = y0;
 410   2            y0 = bak;
 411   2         }
 412   1         
 413   1         do
 414   1         {  // 先读取当前点的字节数据
 415   2            bak = LCM_ReadByte(x0,y0);        
 416   2            
 417   2            // 进行'与'/'或'操作后,将正确的数据写回LCM
 418   2            // 若y0和y1不是同一字节,则y0--当前字节结束,即(y0+8)&0x38,全写1,或者0。
 419   2            // 若y0和y1是同一字节,则y0--y1,要全写1,或者0。
 420   2            // 方法:dat=0xff,然后按y0清零dat低位,按y1清零高位。
 421   2            if((y0>>3) != (y1>>3))            // 竖直线是否跨越两个字节(或以上)
 422   2            {  wr_dat = 0xFF << (y0&0x07);// 清0低位
 423   3            
 424   3               if(color)                                      
 425   3               {  wr_dat = bak | wr_dat;      // 若color不为0,则显示
 426   4               }
C51 COMPILER V7.50   LCMDRV                                                                09/11/2007 21:56:41 PAGE 8   

 427   3               else
 428   3               {  wr_dat = ~wr_dat;           // 若color为0,则清除显示
 429   4                  wr_dat = bak & wr_dat;
 430   4               }
 431   3               LCM_WriteByte(x0,y0, wr_dat);
 432   3               y0 = (y0+8)&0x38;
 433   3            }
 434   2            else
 435   2            {  wr_dat = 0xFF << (y0&0x07);
 436   3               wr_dat = wr_dat &  ( 0xFF >> (7-(y1&0x07)) );
 437   3                    
 438   3               if(color)                                      
 439   3               {  wr_dat = bak | wr_dat;      // 若color不为0,则显示
 440   4               }
 441   3               else
 442   3               {  wr_dat = ~wr_dat;           // 若color为0,则清除显示
 443   4                  wr_dat = bak & wr_dat;
 444   4               }
 445   3               LCM_WriteByte(x0,y0, wr_dat);
 446   3               return;
 447   3            } // end of if((y0>>3) != (y1>>3))... else...
 448   2         }while(y1>=y0);
 449   1      
 450   1      }        


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    736    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   1032      13
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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