LCD_M128128.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:18k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                礐/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2000, SEGGER Microcontroller Systeme GmbH          
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed 
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. * File        : LCDWin.C
  15. * Purpose     : Driver for Simulator under Windows
  16. *
  17. * Version-Date---Author-Explanation
  18. * 2.00    010402 RS     a) LCD_GetDevCaps removed from driver
  19. *                          (now LCD.c)
  20. * 1.30c   000529 JE     a) Interface changed
  21. * 1.30b   000428 RS     a) DIB class eliminated
  22. *                       b) Internal cleanups, support for high color
  23. * 1.30a   000417 RS     a) Major cleanup in DIB class
  24. * 1.30    000309 RS     a) Interface change for emWIn V1.30
  25. *                          (LCD_L0_SetLUTEntry, LCD_GetDevCap)
  26. * 1.10a   000121 RS     a) RECTHEIGHT, RECTWIDTH modified in order to
  27. *                          fix bug which would at some time prevent
  28. *   displaying the first line of the display.
  29. * 1.10.00 000110 RS     a) Modifications in order to make it easy to
  30. *                          implement driver in any windows program
  31. * 1.04.02 991118 RS     a) additional assertion added
  32. *                          LCD_MAX_LOG_COLORS
  33. * 1.04.01 991018 RS     a) Support for LCD_FIXEDPALETTE added
  34. *                          with Anitaliasing enabled
  35. * 1.04.00 991013 JE/RS  a) Support for LCD_FIXEDPALETTE added
  36. *                       b) Driver now accepts the same LCDConf.h as
  37. *     the embedded system
  38. *  c) Bugfix for ..
  39. * 1.02.02 990831 RS     a) Small optimization added for 16-color bitmaps
  40. * 1.02.01 990726 RS     a) Transparency support for 16-color bitmpas
  41. *                          added
  42. * 1.02.00 990212 RS     a) New interface version 1.02 supported
  43. * 1.00    990118 RS     First release
  44. * Known problems or limitations with current version
  45. *
  46. *********************************************************************************************************
  47. */
  48. #include <string.h>             /* for memset */
  49. #include <stddef.h>           /* needed for definition of NULL */
  50. #include "LCD_Private.h"      /* private modul definitions & config */
  51. #include "GUI_Private.h"
  52. #include "GUIDebug.h"
  53. #include "M128128.h"
  54. #include "LCD_0.h"            /* Defines for first display */
  55. U8 lcd_buffer [ LCD_YSIZE>>3 ] [ LCD_XSIZE ];
  56. INT8U const DEC_HEX_TAB[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  57. /*********************************************************************
  58.  * LOCAL FUNCTIONS
  59.  */
  60. INT8U   lcdWriteData( INT8U page, INT8U dat);
  61. void  LCD_WriteCommand(unsigned char page,unsigned char command);
  62. void  LCD_WriteData(unsigned char mode,unsigned char page,unsigned char data_in);
  63. void  set128128Addr(unsigned char mode,unsigned char x,unsigned char y);
  64. void  writeLcd128128Data(unsigned char mode,unsigned char x,unsigned char y,unsigned char data_in);
  65. void   GUI_FillSCR(INT8U data);
  66. /***********************************************************************
  67.  * 名称:LCD_WriteData()
  68.  * 功能:写1字节数据子程序。会先判断状态字。
  69.  * 入口参数:dat   要写入LCM的数据
  70.  * 出口参数:操作出错返回0,否则返回1
  71.  ***********************************************************************/
  72. INT8U  lcdWriteData( INT8U page, INT8U dat)
  73. INT8U i = 0;
  74.     return(1);
  75. }
  76. /***********************************************************************
  77.  * 原型:void wr_12864_order(unsigned char i,unsigned char order)
  78.  * 功能:给12864写一个指令
  79.  * 入口参数:i:选择 1左半屏,2右半屏,3同时左右屏
  80.  *           order:指令
  81.  * 出口参数:无
  82.  ***********************************************************************/
  83. void LCD_WriteCommand(unsigned char page,unsigned char command)
  84. {
  85. INT8U i = 0;
  86. }
  87. /***********************************************************************
  88.  * 原型:void wr_12864_data(unsigned char mode,unsigned char i,unsigned char data_in)
  89.  * 功能:给12864写一个数据
  90.  * 入口参数:mode:写入方式:1直接写入,0取反后写入
  91.  *           i:选择:1左半屏,2右半屏
  92.  *          data_in:要写入的数据
  93.  * 出口参数:无
  94.  ***********************************************************************/
  95. void LCD_WriteData(unsigned char mode,unsigned char page,unsigned char data_in)
  96. {
  97. if(mode)
  98. lcdWriteData( page, data_in );
  99. else
  100. lcdWriteData( page, ~data_in);
  101. }
  102. /***********************************************************************
  103.  * 名称:Full_FillScreem()
  104.  * 功能:清除屏幕。
  105.  * 入口参数:无
  106.  * 出口参数:无
  107.  ***********************************************************************/
  108. void Full_FillLcd( INT8U page, INT8U dat )
  109. {
  110. INT8U x,y;
  111. LCD_WriteCommand( page, LCD_DISP_ON );
  112. Delay(10);
  113.   for(y=0;y<8;y++)
  114. {
  115. LCD_WriteCommand( page, LCD_SET_Y( y ) );
  116. LCD_WriteCommand( page, LCD_SET_X( 0 ) );
  117.    for(x=0;x<64;x++)
  118. {
  119. LCD_WriteData( NORMAL_DISP, page, dat );
  120. }
  121.   }
  122. }
  123. /***********************************************************************
  124.  * 名称:Full_FillScreem()
  125.  * 功能:清除屏幕。
  126.  * 入口参数:无
  127.  * 出口参数:无
  128.  ***********************************************************************/
  129. LcdDispArea_s DispArea;
  130. LcdDispCursor_s  LcdCursor;
  131. int  LCD_L0_Init(void)
  132. {  
  133. DispArea.mode = NORMAL_DISP;
  134. return 0;
  135. }
  136. /***********************************************************************
  137.  * 名称:Full_FillScreem()
  138.  * 功能:清除屏幕。
  139.  * 入口参数:无
  140.  * 出口参数:无
  141.  ***********************************************************************/
  142. void  LCD_L0_ReInit(void) 
  143. {
  144.   LCD_INIT_CONTROLLER();                     /* macro defined in config */
  145. }
  146. /***********************************************************************
  147.  * 原型:void set_12864_addr(unsigned char mode,unsigned char x,unsigned char y)
  148.  * 功能:设置lcd12864显示座标
  149.  * 入口参数:mode:地址写入方式:1只设置x地址,2只设置y地址,3同时设置x和y地址
  150.  *           x:液晶x轴座标(0到127)
  151.  *           y:液晶y轴座标(0到15)
  152.  * 出口参数:无
  153.  ***********************************************************************/
  154. void set128128Addr(unsigned char addr_mode,unsigned char x,unsigned char y)
  155. {
  156. INT8U page;
  157.     switch(addr_mode)
  158. {
  159.     case SET_X: // 只写X坐标
  160. if ( x > 63 )
  161. {
  162. if( y > 7 )
  163. page = PAGE_4;
  164. else
  165. page = PAGE_2;
  166. LCD_WriteCommand( page, LCD_SET_X( x-64 ) );
  167. break;
  168. }
  169. else
  170. {
  171. if( y > 7 )
  172. page = PAGE_3;
  173. else
  174. page = PAGE_1;
  175. LCD_WriteCommand( page, LCD_SET_X( x ) );
  176. }
  177. break;
  178. case SET_Y: // 只写Y坐标
  179. if( y > 7 )
  180. {
  181. LCD_WriteCommand( PAGE_3, LCD_SET_Y( y-8 ) );
  182. LCD_WriteCommand( PAGE_4, LCD_SET_Y( y-8 ) );
  183. break;
  184. }
  185. else
  186. {
  187. LCD_WriteCommand( PAGE_1, LCD_SET_Y( y ) );
  188. LCD_WriteCommand( PAGE_2, LCD_SET_Y( y ) );
  189. }
  190. break;
  191. case SET_X_Y: // 同时写X和Y坐标
  192. if( y > 7 )
  193. {
  194. LCD_WriteCommand( PAGE_3, LCD_SET_Y( y-8 ) );
  195. LCD_WriteCommand( PAGE_4, LCD_SET_Y( y-8 ) );
  196. }
  197. else
  198. {
  199. LCD_WriteCommand( PAGE_1, LCD_SET_Y( y ) );
  200. LCD_WriteCommand( PAGE_2, LCD_SET_Y( y ) );
  201. }
  202. if ( x > 63 )
  203. {
  204. if( y > 7 )
  205. page = PAGE_4;
  206. else
  207. page = PAGE_2;
  208. LCD_WriteCommand( page, LCD_SET_X( x-64 ) );
  209. break;
  210. }
  211. else
  212. {
  213. if( y > 7 )
  214. page = PAGE_3;
  215. else
  216. page = PAGE_1;
  217. LCD_WriteCommand( page, LCD_SET_X( x ) );
  218. }
  219. break;
  220. default: break;
  221. }
  222. }
  223. /***********************************************************************
  224.  * 原型:void write_lcd12864_data( unsigned char mode,unsigned char x,
  225.  *    unsigned char y,unsigned char data_in)
  226.  * 功能:给12864指定座标写数据
  227.  * 入口参数:mode 写入方式:1直接写入,0取反后写入
  228.  *           x    屏幕x轴座标(0到127)
  229.  *           y    屏幕y轴座标(0到7)
  230.  *           data_in 要写入的数据
  231.  * 出口参数:无
  232.  ***********************************************************************/
  233. void writeLcd128128Data(unsigned char mode,unsigned char x,unsigned char y,unsigned char data_in)
  234. {
  235. INT8U page;
  236.     if( y > 7 )
  237.     {
  238.      if( x > 63 )
  239.      {
  240.      page = PAGE_4;
  241.      x -= 64;
  242.      }
  243.      else 
  244.      {
  245.      page = PAGE_3;
  246.      }
  247.      y -= 8;
  248.     }
  249. else
  250. {
  251. if( x > 63 )
  252. {
  253. page = PAGE_2;
  254. x -= 64;
  255. }
  256. else
  257. {
  258. page = PAGE_1;
  259. }
  260. }
  261. LCD_WriteCommand( page, LCD_SET_Y( y ) );
  262. LCD_WriteCommand( page, LCD_SET_X( x ) );
  263. LCD_WriteData( mode, page, data_in );
  264. }
  265. /**********************************************************************
  266. * 函数名称:LCM12864_ReadByte()
  267. * 功    能:从显示缓冲区读取指定点上的数据。
  268. * 入口参数:x  x坐标值(0-127)
  269. *           y       y坐标值(0-63)
  270. * 出口参数:返回该点上的字节数据。
  271. ***********************************************************************/
  272. int  LCM128128_ReadByte(int x, int y)//修改:把INT8U改成int
  273. if(x>LCD_XSIZE) return 0;
  274. if(y>LCD_YSIZE) return 0;
  275.    y = y>>3;
  276.    return lcd_buffer[y][x];                   // 返回显示缓冲区指定点上的数据
  277. }
  278. /***********************************************************************
  279.  * 函数名称:GUI_FillSCR()
  280.  * 功    能:全屏填充。填充显示缓冲区及LCM12864。
  281.  * 入口参数:data      填充的数据
  282.  * 出口参数:无
  283.  ***********************************************************************/
  284. void  GUI_FillSCR(INT8U data)
  285. {
  286.    int x;
  287.    int y;
  288.    
  289.    /* 填充显示缓冲区 */
  290.    for( y = 0; y<(LCD_YSIZE>>3); y++)
  291.     {  
  292.        for(x=0; x<LCD_XSIZE; x++)
  293.            lcd_buffer[y][x] = data;
  294.     }
  295. }
  296. /***********************************************************************
  297.  * 函数名称:LCD_L0_SetPixelIndex()
  298.  * 功    能:在指定位置上画点。
  299.  * 入口参数:x        指定点所在列的位置
  300.  *           y        指定点所在行的位置 
  301.  *           color    对于黑白色或蓝白色LCM12864,为0时灭,为1时显示
  302.  * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
  303.  ***********************************************************************/
  304. void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
  305. {
  306.    int   bak; 
  307.   
  308.     bak = LCM128128_ReadByte( x, y ); 
  309.    if( 0 == PixelIndex )
  310.     {  
  311.       bak &= (~DEC_HEX_TAB[y&0x07]);
  312.     }
  313.    else
  314.     {  
  315.       bak |= DEC_HEX_TAB[y&0x07];
  316.     }
  317.    y=y>>3;   
  318.                                     
  319.    lcd_buffer[y][x] = bak;
  320. }
  321. /***********************************************************************
  322.  * 函数名称:LCD_L0_GetPixelIndex()
  323.  * 功    能:读取指定点的颜色。
  324.  * 入口参数:x        指定点所在列的位置
  325.  *           y        指定点所在行的位置
  326.  *           ret      保存颜色值的指针
  327.  * 出口参数:返回0表示指定地址超出缓冲区范围。
  328.  * 说    明:对于单色,设置ret的d0位为1或0
  329.  ***********************************************************************/
  330. unsigned int LCD_L0_GetPixelIndex( int x, int y )
  331. {
  332.    int  bak; 
  333.   
  334.    bak = LCM128128_ReadByte(x,y);
  335.    if( (bak & ( DEC_HEX_TAB[ y & 0x07 ] ) ) == 0 )
  336.       return 0;
  337.    else  
  338.       return 1;
  339. }
  340. /***********************************************************************
  341.  * 函数名称:RefreshFrameBuffer()
  342.  * 功    能:刷新屏幕。
  343.  * 入口参数:无
  344.  * 出口参数:无
  345.  ***********************************************************************/
  346. void RefreshFrameBuffer(INT8U disp_mode )
  347. {
  348.     int x = 0;
  349.     int y = 0;
  350.     INT8U page;
  351.     for( y = 0; y <= 15; y++ )
  352. {
  353.         set128128Addr( SET_X_Y, 0, y );
  354.         for( x = 0; x <= 127; x++ )
  355. {
  356.     if( x == 0 )
  357.              set128128Addr( SET_X_Y, 0, y );
  358.     if(x<64)
  359.     {
  360.      if( y > 7 )
  361.      page = PAGE_3;
  362.      else 
  363.      page = PAGE_1;
  364. LCD_WriteData( disp_mode, page, lcd_buffer[y][x] );
  365. }
  366. if(x==64)
  367.              set128128Addr(SET_X_Y,x,y);
  368. if(x>63)
  369. {
  370. if( y > 7 )
  371.      page = PAGE_4;
  372.      else 
  373.      page = PAGE_2;
  374.      LCD_WriteData( disp_mode, page, lcd_buffer[y][x] );
  375.     } 
  376. }
  377. }      
  378. }
  379. /***********************************************************************
  380.  * 名称:LCD_L0_DrawPixel()
  381.  * 功能:清除屏幕。
  382.  * 入口参数:无
  383.  * 出口参数:无
  384.  ***********************************************************************/
  385. void LCD_L0_DrawPixel(int x, int y) 
  386. {
  387.    if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR)
  388.    {
  389.      LCD_L0_XorPixel(x, y);
  390.    } 
  391.    else 
  392.    {
  393.      LCD_L0_SetPixelIndex(x, y, LCD_COLORINDEX);
  394.    }
  395. }
  396. /***********************************************************************
  397.  * 名称:LCD_L0_DrawHLine()
  398.  * 功能:清除屏幕。
  399.  * 入口参数:无
  400.  * 出口参数:无
  401.  ***********************************************************************/
  402. void LCD_L0_DrawHLine  (int x0, int y,  int x1) 
  403. {
  404. if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) 
  405. {
  406.      for (; x0 <= x1; x0++) 
  407.      {
  408.        LCD_L0_XorPixel(x0, y);
  409.      }
  410.    } 
  411.    else 
  412.    {
  413.      for (; x0 <= x1; x0++) 
  414.      {
  415.        LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX);
  416.      }
  417.    }
  418. }
  419. /***********************************************************************
  420.  * 名称:LCD_L0_DrawVLine()
  421.  * 功能:清除屏幕。
  422.  * 入口参数:无
  423.  * 出口参数:无
  424.  ***********************************************************************/
  425. void LCD_L0_DrawVLine  (int x, int y0,  int y1) 
  426. {
  427.    if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) 
  428.    {
  429.      for (; y0 <= y1; y0++) 
  430.      {
  431.        LCD_L0_XorPixel(x, y0);
  432.      }
  433.    } 
  434.    else 
  435.    {
  436.      for (; y0 <= y1; y0++) 
  437.      {
  438.        LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX);
  439.      }
  440.    }
  441. }
  442. /***********************************************************************
  443.  * 名称:LCD_L0_FillRect()
  444.  * 功能:清除屏幕。
  445.  * 入口参数:无
  446.  * 出口参数:无
  447.  ***********************************************************************/
  448. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) 
  449. {
  450.    for (; y0 <= y1; y0++) 
  451.    {
  452.      LCD_L0_DrawHLine(x0, y0, x1);
  453.    }
  454. }
  455. /***********************************************************************
  456.  * 名称:DrawBitLine1BPP()
  457.  * 功能:清除屏幕。
  458.  * 入口参数:无
  459.  * 出口参数:无
  460.  ***********************************************************************/
  461. static void  DrawBitLine1BPP( int x, 
  462. int y, 
  463. U8 const*p, 
  464. int Diff, 
  465. int xsize, 
  466. const LCD_PIXELINDEX*pTrans) 
  467. {
  468.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  469.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  470.   x+=Diff;
  471.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  472.   case 0:    /* Write mode */
  473.     do {
  474.       LCD_L0_SetPixelIndex(x++,y, (*p & (0x80>>Diff)) ? Index1 : Index0);
  475. if (++Diff==8) {
  476.         Diff=0;
  477. p++;
  478. }
  479. } while (--xsize);
  480.     break;
  481.   case LCD_DRAWMODE_TRANS:
  482.     do {
  483.    if (*p & (0x80>>Diff))
  484.         LCD_L0_SetPixelIndex(x,y, Index1);
  485.       x++;
  486. if (++Diff==8) {
  487.         Diff=0;
  488. p++;
  489. }
  490. } while (--xsize);
  491.     break;
  492.   case LCD_DRAWMODE_XOR:;
  493.     do {
  494.    if (*p & (0x80>>Diff)) {
  495.         int Pixel = LCD_L0_GetPixelIndex(x,y);
  496.         LCD_L0_SetPixelIndex(x,y, LCD_NUM_COLORS-1-Pixel);
  497.       }
  498.       x++;
  499. if (++Diff==8) {
  500.         Diff=0;
  501. p++;
  502. }
  503. } while (--xsize);
  504.     break;
  505. }
  506. }
  507. /***********************************************************************
  508.  * 名称:LCD_L0_DrawBitmap()
  509.  * 功能:清除屏幕。
  510.  * 入口参数:无
  511.  * 出口参数:无
  512.  ***********************************************************************/
  513.  void LCD_L0_DrawBitmap(int x0, int y0,
  514.                        int xsize, int ysize,
  515.                        int BitsPerPixel, 
  516.                        int BytesPerLine,
  517.                        const U8* pData, int Diff,
  518.                        const LCD_PIXELINDEX* pTrans)
  519. {
  520.   int i;
  521.   /*
  522.      Use DrawBitLineXBPP
  523.   */
  524.   for (i=0; i<ysize; i++) {
  525.     switch (BitsPerPixel) {
  526.     case 1:
  527.       DrawBitLine1BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  528.       break;
  529.     #if (LCD_MAX_LOG_COLORS > 2)
  530.       case 2:
  531.         DrawBitLine2BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  532.         break;
  533.     #endif
  534.     #if (LCD_MAX_LOG_COLORS > 4)
  535.       case 4:
  536.         DrawBitLine4BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  537.         break;
  538.     #endif
  539.     #if (LCD_MAX_LOG_COLORS > 16)
  540.       case 8:
  541.         DrawBitLine8BPP(x0, i+y0, pData, xsize, pTrans);
  542.         break;
  543.     #endif
  544.     #if (LCD_BITSPERPIXEL > 8)
  545.       case 16:
  546.         DrawBitLine16BPP(x0, i+y0, (const U16 *)pData, xsize, pTrans);
  547.         break;
  548.     #endif
  549.     }
  550.     pData += BytesPerLine;
  551.   }
  552. }
  553. /***********************************************************************
  554.  * 名称:LCD_L0_SetOrg()
  555.  * 功能:清除屏幕。
  556.  * 入口参数:无
  557.  * 出口参数:无
  558.  ***********************************************************************/
  559. int OrgX, OrgY;
  560. void LCD_L0_SetOrg(int x, int y) 
  561. {
  562.   OrgX = x;
  563.   OrgY = y;
  564. }
  565. /***********************************************************************
  566.  * 名称:LCD_On()/LCD_Off()
  567.  * 功能:清除屏幕。
  568.  * 入口参数:无
  569.  * 出口参数:无
  570.  ***********************************************************************/
  571. void LCD_On  (void) { LCD_WriteCommand( PAGE_ALL_S,LCD_DISP_ON); }
  572. void LCD_Off (void) { LCD_WriteCommand(PAGE_ALL_S,LCD_DISP_OFF); }
  573. /***********************************************************************
  574.  * 名称:LCD_L0_SetLUTEntry()
  575.  * 功能:清除屏幕。
  576.  * 入口参数:无
  577.  * 出口参数:无
  578.  ***********************************************************************/
  579. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) 
  580. {
  581.    GUI_USE_PARA(Pos);
  582.    GUI_USE_PARA(Color);
  583. }
  584. /***********************************************************************
  585.  * 名称:LCD_L0_CheckInit()
  586.  * 功能:清除屏幕。
  587.  * 入口参数:无
  588.  * 出口参数:无
  589.  ***********************************************************************/
  590. int  LCD_L0_CheckInit(void) 
  591. {
  592.   return 0;
  593. /***********************************************************************
  594.  * 名称:LCD_L0_XorPixel()
  595.  * 功能:清除屏幕。
  596.  * 入口参数:无
  597.  * 出口参数:无
  598.  ***********************************************************************/
  599. void LCD_L0_XorPixel(int x, int y) 
  600. {
  601.    LCD_PIXELINDEX PixelIndex = LCD_L0_GetPixelIndex(x, y);
  602.    LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - PixelIndex - 1);
  603. }
  604. /***********************************************************************
  605.  * END
  606.  ***********************************************************************/