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

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, 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. ----------------------------------------------------------------------
  15. File        : LCD15E05.C
  16. Purpose     : Driver for LCDs using a Seiko Epson S1D15E05 controller
  17. ----------------------------------------------------------------------   
  18. Version-Date---Author-Explanation                                        
  19. ----------------------------------------------------------------------   
  20. 1.00a   020708 JE     a) Changed to work with 2bpp DDP bitmaps
  21. 1.00    020204 JE     a) Hardwareinterface routines renamed:
  22.                          ...DATA -> ...A1, ...CMD -> ...A0
  23. 0.90.00 011030 JE     a) First release
  24. ---------------------------LIST OF CONFIG SWITCHES--------------------
  25. The following is a list of additional configuration switches for this
  26. driver. These switches might not be listed in the manual, because
  27. the manual mainly covers the general config switches which are
  28. supported by all drivers.
  29. ----------------------------------------------------------------------
  30. define ----------------------Explanation------------------------------
  31. LCD_OPTIMIZE                 Controls the use of optimized routines.
  32. ----------------------------------------------------------------------
  33. Known problems or limitations with current version
  34. ----------------------------------------------------------------------
  35. Driver supports only 2bpp mode
  36. ----------------------------------------------------------------------
  37. Open issues
  38. ----------------------------------------------------------------------
  39. 1bpp mode
  40. ---------------------------END-OF-HEADER------------------------------
  41. */
  42. #include <string.h>           /* needed for memset */
  43. #include <stddef.h>           /* needed for definition of NULL */
  44. #include "LCD_Private.h"      /* private modul definitions & config */
  45. #include "GUI_Private.h"
  46. #include "GUIDebug.h"
  47. #include "LCD_0.h"            /* Defines for first display */
  48. #if    (LCD_CONTROLLER == 0x15E05) 
  49.        && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  50. /*
  51.         *********************************************************
  52.         *
  53.         *           Defaults for config switches
  54.         *
  55.         *********************************************************
  56. */
  57. #ifndef LCD_CACHE
  58.   #define  LCD_CACHE                  (1)
  59. #endif
  60. #ifndef LCD_INIT_CONTROLLER
  61.   #define LCD_INIT_CONTROLLER()
  62. #endif
  63. /*
  64.         *********************************************************
  65.         *
  66.         *           Defines for simulation
  67.         *
  68.         *********************************************************
  69. */
  70. #ifdef WIN32
  71.   #undef LCD_WRITE_A0
  72.   #undef LCD_WRITE_A1
  73.   #undef LCD_READ_A0
  74.   #undef LCD_READ_A1
  75.   void SIM_WriteA1C0(U8 Data);
  76.   void SIM_WriteA0C0(U8 cmd);
  77.   U8   SIM_ReadA1C0(void);
  78.   U8   SIM_ReadA0C0(void);
  79.   #define LCD_WRITE_A1(Data) SIM_WriteA1C0(Data) 
  80.   #define LCD_WRITE_A0(cmd)  SIM_WriteA0C0(cmd)
  81.   #define LCD_READ_A1()      SIM_ReadA1C0()
  82.   #define LCD_READ_A0()      SIM_ReadA0C0()
  83. #endif
  84. /*
  85.         *********************************************************
  86.         *
  87.         *          Remap ...A0, ...A1 -> ...CMD, ...DATA
  88.         *
  89.         *********************************************************
  90. */
  91. #define LCD_READCMD0    LCD_READ_A0
  92. #define LCD_READDATA0   LCD_READ_A1
  93. #define LCD_WRITECMD0   LCD_WRITE_A0
  94. #define LCD_WRITEDATA0  LCD_WRITE_A1
  95. /*
  96.         *********************************************************
  97.         *
  98.         *           Configuration switch checking
  99.         *
  100.         *********************************************************
  101. */
  102. #if (LCD_BITSPERPIXEL > 2)
  103.   #error This controller can handle only 1bpp and 2bpp displays
  104. #endif
  105. /*
  106.         *********************************************************
  107.         *                                                       *
  108.         *              Macros, standard                         *
  109.         *                                                       *
  110.         *********************************************************
  111. These macros can be found in any LCD-driver as they serve purposes
  112. that can be found in any class of LCD-driver (Like clipping).
  113. */
  114. #if (!defined (LCD_LUT_COM) && !defined(LCD_LUT_SEG))
  115.   #if   (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  116.     #define LOG2PHYS(x, y) x, y
  117.   #elif (!LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  118.     #define LOG2PHYS(x, y) y, x
  119.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  120.     #define LOG2PHYS(x, y) x, LCD_YSIZE - 1 - (y)
  121.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  122.     #define LOG2PHYS(x, y) LCD_YSIZE - 1 - (y), x
  123.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  124.     #define LOG2PHYS(x, y) LCD_XSIZE - 1 - (x), y
  125.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  126.     #define LOG2PHYS(x, y) LCD_YSIZE - 1 - (y), x
  127.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  128.     #define LOG2PHYS(x, y) LCD_XSIZE - 1 - (x), LCD_YSIZE - 1 - (y)
  129.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  130.     #error This combination of mirroring/swapping not yet supported
  131.   #endif
  132. #else
  133.   #if   ( defined (LCD_LUT_COM) && !defined(LCD_LUT_SEG))
  134.     #define LOG2PHYS(x, y) x, LCD__aLine2Com0[y]
  135.   #elif (!defined (LCD_LUT_COM) &&  defined(LCD_LUT_SEG))
  136.     #define LOG2PHYS(x, y) LCD__aCol2Seg0[x], y
  137.   #elif ( defined (LCD_LUT_COM) &&  defined(LCD_LUT_SEG))
  138.     #define LOG2PHYS(x, y) LCD__aCol2Seg0[x], LCD__aLine2Com0[y]
  139.   #endif
  140. #endif
  141. #define BKCOLOR LCD_BKCOLORINDEX
  142. #define   COLOR LCD_COLORINDEX
  143. /*
  144.         *********************************************************
  145.         *
  146.         *           Static variables for driver
  147.         *
  148.         *********************************************************
  149. */
  150. #if LCD_CACHE
  151.   #if   (LCD_BITSPERPIXEL == 1)
  152.     static U8 aVRam[(LCD_YSIZE_PHYS + 7) >> 3][LCD_XSIZE_PHYS];
  153.   #elif (LCD_BITSPERPIXEL == 2)
  154.     static U8 aVRam[(LCD_YSIZE_PHYS + 3) >> 2][LCD_XSIZE_PHYS];
  155.   #endif
  156. #endif
  157. static int Page, Offset;
  158. /*
  159.         *********************************************************
  160.         *
  161.         *           Hardware access macros
  162.         *
  163.         *********************************************************
  164. */
  165. #define MAX_PAGE   32
  166. #define MAX_OFFSET 159
  167. #define INCREMENT_CURSOR() 
  168.   Offset++; 
  169.   if (Offset > MAX_OFFSET) { 
  170.     Offset = 0; 
  171.     Page ++; 
  172.     if (Page > MAX_PAGE) 
  173.       Page = 0; 
  174.   }
  175. #if LCD_CACHE
  176.   #define READ_DATA(Data) 
  177.     Data = aVRam[Page][Offset]
  178.   #define WRITE_DATA(Data) 
  179.     LCD_WRITECMD0(0x1d); 
  180.     LCD_WRITEDATA0(Data); 
  181.     aVRam[Page][Offset] = Data; 
  182.     INCREMENT_CURSOR()
  183. #else
  184.   #define READ_DATA(Data) 
  185.     LCD_WRITECMD0(0x1c); 
  186.     Data = LCD_READDATA0(); 
  187.     INCREMENT_CURSOR()
  188.   #define WRITE_DATA(Data) 
  189.     LCD_WRITECMD0(0x1d); 
  190.     LCD_WRITEDATA0(Data); 
  191.     INCREMENT_CURSOR()
  192. #endif
  193. #define WRITE_PAGE(NewPage) 
  194.   LCD_WRITECMD0(0xb1); 
  195.   LCD_WRITEDATA0(NewPage); 
  196.   Page = NewPage
  197. #define WRITE_OFFSET(NewOffset) 
  198.   LCD_WRITECMD0(0x13); 
  199.   LCD_WRITEDATA0(NewOffset); 
  200.   Offset = NewOffset
  201. #define SET_PAGE_IF_NEEDED(y) 
  202.   if (Page != (y >> 2)) { 
  203.     WRITE_PAGE(y >> 2); 
  204.   }
  205. #define SET_OFFSET_IF_NEEDED(x) 
  206.   if (Offset != x) { 
  207.     WRITE_OFFSET(x); 
  208.   }
  209. /*
  210.         *********************************************************
  211.         *
  212.         *           Static access routines for pixel access
  213.         *
  214.         *********************************************************
  215. These routines should be only used by access macros to keep
  216. sure, that logical coordinates are mapped to physical level
  217. */
  218. /*
  219.         *****************************************
  220.         *
  221.         *           SetPixelIndex
  222.         *
  223.         *****************************************
  224. */
  225. static void SetPixelIndex(int x, int y, LCD_PIXELINDEX ColorIndex) {
  226.   U8 Shift = ((y & 3) << 1);
  227.   U8 AndMask = ~(0x03 << Shift);
  228.   U8 OrMask  = ColorIndex << Shift;
  229.   U8 Data;
  230.   SET_PAGE_IF_NEEDED(y);
  231.   SET_OFFSET_IF_NEEDED(x);
  232.   READ_DATA(Data);
  233.   Data &= AndMask;
  234.   Data |= OrMask;
  235.   SET_OFFSET_IF_NEEDED(x);
  236.   WRITE_DATA(Data);
  237. }
  238. /*
  239.         *****************************************
  240.         *
  241.         *           GetPixelIndex
  242.         *
  243.         *****************************************
  244. */
  245. static LCD_PIXELINDEX GetPixelIndex(int x, int y) {
  246.   U8 Shift = ((y & 3) << 1);
  247.   U8 AndMask = 0x03 << Shift;
  248.   U8 Data;
  249.   SET_PAGE_IF_NEEDED(y);
  250.   SET_OFFSET_IF_NEEDED(x);
  251.   READ_DATA(Data);
  252.   return (Data & AndMask) >> Shift;
  253. }
  254. /*
  255.         *****************************************
  256.         *
  257.         *           XorPixel
  258.         *
  259.         *****************************************
  260. */
  261. static void XorPixel(int x, int y) {
  262.   U8 Data = GetPixelIndex(x, y);
  263.   Data = LCD_NUM_COLORS - 1 - Data;
  264.   SetPixelIndex(x, y, Data);
  265. }
  266. /*
  267.         *********************************************************
  268.         *
  269.         *           Access macros for pixel access
  270.         *
  271.         *********************************************************
  272. */
  273. #define SETPIXEL(x, y, c)  SetPixelIndex(LOG2PHYS(x, y), c)
  274. #define GETPIXEL(x, y)     GetPixelIndex(LOG2PHYS(x, y))
  275. #define XORPIXEL(x, y)     XorPixel     (LOG2PHYS(x, y))
  276. /*
  277.         *********************************************************
  278.         *
  279.         *           Static DrawBitLineXBPP functions
  280.         *
  281.         *********************************************************
  282. */
  283. /*
  284.         *****************************************
  285.         *
  286.         *           Draw Bitmap 1 BPP
  287.         *           no optimizations
  288.         *
  289.         *****************************************
  290. */
  291. static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  292.   LCD_PIXELINDEX pixels;
  293.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  294.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  295. /*
  296. // Jump to right entry point
  297. */
  298.   pixels = *p;
  299.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  300.   case 0:
  301.     switch (Diff&7) {
  302.     case 0:   
  303.       goto WriteBit0;
  304.     case 1:   
  305.       goto WriteBit1;
  306.     case 2:
  307.       goto WriteBit2;
  308.     case 3:
  309.       goto WriteBit3;
  310.     case 4:
  311.       goto WriteBit4;
  312.     case 5:   
  313.       goto WriteBit5;
  314.     case 6:   
  315.       goto WriteBit6;
  316.     case 7:   
  317.       goto WriteBit7;
  318.     }
  319.     break;
  320.   case LCD_DRAWMODE_TRANS:
  321.     switch (Diff&7) {
  322.     case 0:
  323.       goto WriteTBit0;
  324.     case 1:
  325.       goto WriteTBit1;
  326.     case 2:
  327.       goto WriteTBit2;
  328.     case 3:
  329.       goto WriteTBit3;
  330.     case 4:
  331.       goto WriteTBit4;
  332.     case 5:   
  333.       goto WriteTBit5;
  334.     case 6:   
  335.       goto WriteTBit6;
  336.     case 7:   
  337.       goto WriteTBit7;
  338.     }
  339.     break;
  340.   case LCD_DRAWMODE_XOR:
  341.     switch (Diff&7) {
  342.     case 0:   
  343.       goto WriteXBit0;
  344.     case 1:   
  345.       goto WriteXBit1;
  346.     case 2:
  347.       goto WriteXBit2;
  348.     case 3:
  349.       goto WriteXBit3;
  350.     case 4:
  351.       goto WriteXBit4;
  352.     case 5:   
  353.       goto WriteXBit5;
  354.     case 6:   
  355.       goto WriteXBit6;
  356.     case 7:   
  357.       goto WriteXBit7;
  358.     }
  359.   }
  360. /*
  361.         Write with transparency
  362. */
  363.   WriteTBit0:
  364.     if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
  365.     if (!--xsize)
  366.       return;
  367.   WriteTBit1:
  368.     if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
  369.     if (!--xsize)
  370.       return;
  371.   WriteTBit2:
  372.     if (pixels&(1<<5)) SETPIXEL(x+2, y, Index1);
  373.     if (!--xsize)
  374.       return;
  375.   WriteTBit3:
  376.     if (pixels&(1<<4)) SETPIXEL(x+3, y, Index1);
  377.     if (!--xsize)
  378.       return;
  379.   WriteTBit4:
  380.     if (pixels&(1<<3)) SETPIXEL(x+4, y, Index1);
  381.     if (!--xsize)
  382.       return;
  383.   WriteTBit5:
  384.     if (pixels&(1<<2)) SETPIXEL(x+5, y, Index1);
  385.     if (!--xsize)
  386.       return;
  387.   WriteTBit6:
  388.     if (pixels&(1<<1)) SETPIXEL(x+6, y, Index1);
  389.     if (!--xsize)
  390.       return;
  391.   WriteTBit7:
  392.     if (pixels&(1<<0)) SETPIXEL(x+7, y, Index1);
  393.     if (!--xsize)
  394.       return;
  395.     x+=8;
  396.     pixels = *(++p);
  397.     goto WriteTBit0;
  398. /*
  399.         Write without transparency
  400. */
  401.   WriteBit0:
  402.     SETPIXEL(x+0, y, (pixels&(1<<7)) ? Index1 : Index0);
  403.     if (!--xsize)
  404.       return;
  405.   WriteBit1:
  406.     SETPIXEL(x+1, y, (pixels&(1<<6)) ? Index1 : Index0);
  407.     if (!--xsize)
  408.       return;
  409.   WriteBit2:
  410.     SETPIXEL(x+2, y, (pixels&(1<<5)) ? Index1 : Index0);
  411.     if (!--xsize)
  412.       return;
  413.   WriteBit3:
  414.     SETPIXEL(x+3, y, (pixels&(1<<4)) ? Index1 : Index0);
  415.     if (!--xsize)
  416.       return;
  417.   WriteBit4:
  418.     SETPIXEL(x+4, y, (pixels&(1<<3)) ? Index1 : Index0);
  419.     if (!--xsize)
  420.       return;
  421.   WriteBit5:
  422.     SETPIXEL(x+5, y, (pixels&(1<<2)) ? Index1 : Index0);
  423.     if (!--xsize)
  424.       return;
  425.   WriteBit6:
  426.     SETPIXEL(x+6, y, (pixels&(1<<1)) ? Index1 : Index0);
  427.     if (!--xsize)
  428.       return;
  429.   WriteBit7:
  430.     SETPIXEL(x+7, y, (pixels&(1<<0)) ? Index1 : Index0);
  431.     if (!--xsize)
  432.       return;
  433.     x+=8;
  434.     pixels = *(++p);
  435.     goto WriteBit0;
  436. /*
  437.         Write XOR mode
  438. */
  439.   WriteXBit0:
  440.     if (pixels&(1<<7))
  441.       XORPIXEL(x+0, y);
  442.     if (!--xsize)
  443.       return;
  444.   WriteXBit1:
  445.     if (pixels&(1<<6))
  446.       XORPIXEL(x+1, y);
  447.     if (!--xsize)
  448.       return;
  449.   WriteXBit2:
  450.     if (pixels&(1<<5))
  451.       XORPIXEL(x+2, y);
  452.     if (!--xsize)
  453.       return;
  454.   WriteXBit3:
  455.     if (pixels&(1<<4))
  456.       XORPIXEL(x+3, y);
  457.     if (!--xsize)
  458.       return;
  459.   WriteXBit4:
  460.     if (pixels&(1<<3))
  461.       XORPIXEL(x+4, y);
  462.     if (!--xsize)
  463.       return;
  464.   WriteXBit5:
  465.     if (pixels&(1<<2))
  466.       XORPIXEL(x+5, y);
  467.     if (!--xsize)
  468.       return;
  469.   WriteXBit6:
  470.     if (pixels&(1<<1))
  471.       XORPIXEL(x+6, y);
  472.     if (!--xsize)
  473.       return;
  474.   WriteXBit7:
  475.     if (pixels&(1<<0))
  476.       XORPIXEL(x+7, y);
  477.     if (!--xsize)
  478.       return;
  479.     x+=8;
  480.     pixels = *(++p);
  481.     goto WriteXBit0;
  482. }
  483. /*
  484.         *****************************************
  485.         *
  486.         *           Draw Bitmap 2 BPP
  487.         *           no optimizations
  488.         *
  489.         *****************************************
  490. */
  491. #if (LCD_MAX_LOG_COLORS > 2)
  492. static void  DrawBitLine2BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  493.   LCD_PIXELINDEX pixels;
  494. /*
  495. // Jump to right entry point
  496. */
  497.   pixels = *p;
  498.   if (pTrans) {
  499.     /*
  500.       with palette
  501.     */
  502.     if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) switch (Diff&3) {
  503.     case 0:
  504.       goto WriteTBit0;
  505.     case 1:
  506.       goto WriteTBit1;
  507.     case 2:
  508.       goto WriteTBit2;
  509.     default:
  510.       goto WriteTBit3;
  511.     } else switch (Diff&3) {
  512.     case 0:
  513.       goto WriteBit0;
  514.     case 1:
  515.       goto WriteBit1;
  516.     case 2:
  517.       goto WriteBit2;
  518.     default:
  519.       goto WriteBit3;
  520.     }
  521.   /*
  522.           Write without transparency
  523.   */
  524.   WriteBit0:
  525.     SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  526.     if (!--xsize)
  527.       return;
  528.   WriteBit1:
  529.     SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  530.     if (!--xsize)
  531.       return;
  532.   WriteBit2:
  533.     SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  534.     if (!--xsize)
  535.       return;
  536.   WriteBit3:
  537.     SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  538.     if (!--xsize)
  539.       return;
  540.     pixels = *(++p);
  541.     x+=4;
  542.     goto WriteBit0;
  543.   /*
  544.           Write with transparency
  545.   */
  546.   WriteTBit0:
  547.     if (pixels&(3<<6))
  548.       SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  549.     if (!--xsize)
  550.       return;
  551.   WriteTBit1:
  552.     if (pixels&(3<<4))
  553.       SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  554.     if (!--xsize)
  555.       return;
  556.   WriteTBit2:
  557.     if (pixels&(3<<2))
  558.       SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  559.     if (!--xsize)
  560.       return;
  561.   WriteTBit3:
  562.     if (pixels&(3<<0))
  563.       SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  564.     if (!--xsize)
  565.       return;
  566.     pixels = *(++p);
  567.     x+=4;
  568.     goto WriteTBit0;
  569.   } else { 
  570.     /* 
  571.       without palette 
  572.     */
  573.     if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) switch (Diff&3) {
  574.     case 0:
  575.       goto WriteDDPTBit0;
  576.     case 1:
  577.       goto WriteDDPTBit1;
  578.     case 2:
  579.       goto WriteDDPTBit2;
  580.     default:
  581.       goto WriteDDPTBit3;
  582.     } else switch (Diff&3) {
  583.     case 0:
  584.       goto WriteDDPBit0;
  585.     case 1:
  586.       goto WriteDDPBit1;
  587.     case 2:
  588.       goto WriteDDPBit2;
  589.     default:
  590.       goto WriteDDPBit3;
  591.     }
  592.   /*
  593.           Write without transparency
  594.   */
  595.   WriteDDPBit0:
  596.     SETPIXEL(x+0, y, (pixels>>6));
  597.     if (!--xsize)
  598.       return;
  599.   WriteDDPBit1:
  600.     SETPIXEL(x+1, y, (3&(pixels>>4)));
  601.     if (!--xsize)
  602.       return;
  603.   WriteDDPBit2:
  604.     SETPIXEL(x+2, y, (3&(pixels>>2)));
  605.     if (!--xsize)
  606.       return;
  607.   WriteDDPBit3:
  608.     SETPIXEL(x+3, y, (3&(pixels)));
  609.     if (!--xsize)
  610.       return;
  611.     pixels = *(++p);
  612.     x+=4;
  613.     goto WriteDDPBit0;
  614.   /*
  615.           Write with transparency
  616.   */
  617.   WriteDDPTBit0:
  618.     if (pixels&(3<<6))
  619.       SETPIXEL(x+0, y, (pixels>>6));
  620.     if (!--xsize)
  621.       return;
  622.   WriteDDPTBit1:
  623.     if (pixels&(3<<4))
  624.       SETPIXEL(x+1, y, (3&(pixels>>4)));
  625.     if (!--xsize)
  626.       return;
  627.   WriteDDPTBit2:
  628.     if (pixels&(3<<2))
  629.       SETPIXEL(x+2, y, (3&(pixels>>2)));
  630.     if (!--xsize)
  631.       return;
  632.   WriteDDPTBit3:
  633.     if (pixels&(3<<0))
  634.       SETPIXEL(x+3, y, (3&(pixels)));
  635.     if (!--xsize)
  636.       return;
  637.     pixels = *(++p);
  638.     x+=4;
  639.     goto WriteDDPTBit0;
  640.   }
  641. }
  642. #endif /* (LCD_MAX_LOG_COLORS > 2) */
  643. /*
  644.         *****************************************
  645.         *
  646.         *           Draw Bitmap 4 BPP
  647.         *           no optimizations
  648.         *
  649.         *****************************************
  650. */
  651. #if (LCD_MAX_LOG_COLORS > 4)
  652. static void  DrawBitLine4BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  653.   LCD_PIXELINDEX pixels;
  654. /*
  655. // Jump to right entry point
  656. */
  657.   pixels = *p;
  658.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  659.     if ((Diff&1) ==0)
  660.       goto WriteTBit0;
  661.     goto WriteTBit1;
  662.   } else {
  663.     if ((Diff&1) ==0)
  664.       goto WriteBit0;
  665.     goto WriteBit1;
  666.   }
  667. /*
  668.         Write without transparency
  669. */
  670. WriteBit0:
  671.   SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  672.   if (!--xsize)
  673.     return;
  674. WriteBit1:
  675.   SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  676.   if (!--xsize)
  677.     return;
  678.   x+=2;
  679.   pixels = *(++p);
  680.   goto WriteBit0;
  681. /*
  682.         Write with transparency
  683. */
  684. WriteTBit0:
  685.   if (pixels>>4)
  686.     SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  687.   if (!--xsize)
  688.     return;
  689. WriteTBit1:
  690.   if (pixels&0xf)
  691.     SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  692.   if (!--xsize)
  693.     return;
  694.   x+=2;
  695.   pixels = *(++p);
  696.   goto WriteTBit0;
  697. }
  698. #endif /* (LCD_MAX_LOG_COLORS > 4) */
  699. /*
  700.         *****************************************
  701.         *
  702.         *           Draw Bitmap 8 BPP
  703.         *           no optimizations
  704.         *
  705.         *****************************************
  706. */
  707. #if (LCD_MAX_LOG_COLORS > 16)
  708. static void  DrawBitLine8BPP(int x, int y, U8 const*p, int xsize, const LCD_PIXELINDEX*pTrans) {
  709.   LCD_PIXELINDEX pixel;
  710.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  711.     if (pTrans) {
  712.       for (;xsize > 0; xsize--,x++,p++) {
  713.         pixel = *p;
  714.         SETPIXEL(x, y, *(pTrans+pixel));
  715.       }
  716.     } else {
  717.       for (;xsize > 0; xsize--,x++,p++) {
  718.         SETPIXEL(x, y, *p);
  719.       }
  720.     }
  721.   } else {   /* Handle transparent bitmap */
  722.     if (pTrans) {
  723.       for (; xsize > 0; xsize--, x++, p++) {
  724.         pixel = *p;
  725.         if (pixel) {
  726.           SETPIXEL(x+0, y, *(pTrans+pixel));
  727.         }
  728.       }
  729.     } else {
  730.       for (; xsize > 0; xsize--, x++, p++) {
  731.         pixel = *p;
  732.         if (pixel) {
  733.           SETPIXEL(x+0, y, pixel);
  734.         }
  735.       }
  736.     }
  737.   }
  738. }
  739. #endif /* (LCD_MAX_LOG_COLORS > 16) */
  740. /*
  741.         *********************************************************
  742.         *
  743.         *           Exported, but not currently supported
  744.         *
  745.         *********************************************************
  746. */
  747. /*
  748.         *****************************************
  749.         *
  750.         *           LCD_L0_SetLUTEntry
  751.         *
  752.         *****************************************
  753. */
  754. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) {
  755.   Pos = Pos;
  756.   Color = Color;
  757. }
  758. /*
  759.         *********************************************************
  760.         *
  761.         *           Exported routines
  762.         *
  763.         *********************************************************
  764. */
  765. /*
  766.         *****************************************
  767.         *
  768.         *           LCD_L0_On
  769.         *
  770.         *****************************************
  771. */
  772. void LCD_L0_On(void) {
  773.   LCD_WRITECMD0(0xaf);
  774. }
  775. /*
  776.         *****************************************
  777.         *
  778.         *           LCD_L0_Off
  779.         *
  780.         *****************************************
  781. */
  782. void LCD_L0_Off(void) {
  783.   LCD_WRITECMD0(0xae);
  784. }
  785. /*
  786.         *****************************************
  787.         *
  788.         *           LCD_L0_XorPixel
  789.         *
  790.         *****************************************
  791. */
  792. void LCD_L0_XorPixel(int x, int y) {
  793.   XORPIXEL(x, y);
  794. }
  795. /*
  796.         *****************************************
  797.         *
  798.         *           LCD_L0_SetPixelIndex
  799.         *
  800.         *****************************************
  801. */
  802. void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {
  803.   SETPIXEL(x, y, ColorIndex);
  804. }
  805. /*
  806.         *****************************************
  807.         *
  808.         *           LCD_L0_GetPixelIndex
  809.         *
  810.         *****************************************
  811. */
  812. unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  813.   U8 ColorIndex = GETPIXEL(x, y);
  814.   return ColorIndex;
  815. }
  816. /*
  817.         *****************************************
  818.         *
  819.         *           LCD_L0_DrawPixel
  820.         *
  821.         *****************************************
  822. */
  823. void LCD_L0_DrawPixel(int x, int y) {
  824.   SETPIXEL(x, y, COLOR);
  825. }
  826. /*
  827.         *****************************************
  828.         *
  829.         *           LCD_L0_DrawHLine
  830.         *
  831.         *****************************************
  832. */
  833. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  834.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  835.     while (x0 <= x1) {
  836.       XORPIXEL(x0, y);
  837.       x0++;
  838.     }
  839.   } else {
  840.     while (x0 <= x1) {
  841.       SETPIXEL(x0, y, COLOR);
  842.       x0++;
  843.     }
  844.   }
  845. }
  846. /*
  847.         *****************************************
  848.         *
  849.         *           LCD_L0_DrawVLine
  850.         *
  851.         *****************************************
  852. */
  853. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  854.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  855.     while (y0 <= y1) {
  856.       XORPIXEL(x, y0);
  857.       y0++;
  858.     }
  859.   } else {
  860.     while (y0 <= y1) {
  861.       SETPIXEL(x, y0, COLOR);
  862.       y0++;
  863.     }
  864.   }
  865. }
  866. /*
  867.         *****************************************
  868.         *
  869.         *           LCD_L0_FillRect
  870.         *
  871.         *****************************************
  872. */
  873. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  874.   for (; y0 <= y1; y0++) {
  875.     LCD_L0_DrawHLine(x0, y0, x1);
  876.   }
  877. }
  878. /*
  879.         *****************************************
  880.         *
  881.         *           LCD_L0_DrawBitmap
  882.         *
  883.         *****************************************
  884. */
  885. void LCD_L0_DrawBitmap   (int x0, int y0,
  886.                        int xsize, int ysize,
  887.                        int BitsPerPixel, 
  888.                        int BytesPerLine,
  889.                        const U8* pData, int Diff,
  890.                        const LCD_PIXELINDEX* pTrans)
  891. {
  892.   int i;
  893.   /*
  894.      Use DrawBitLineXBPP
  895.   */
  896.   for (i=0; i<ysize; i++) {
  897.     switch (BitsPerPixel) {
  898.     case 1:
  899.       DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  900.       break;
  901.     #if (LCD_MAX_LOG_COLORS > 2)
  902.       case 2:
  903.         DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  904.         break;
  905.     #endif
  906.     #if (LCD_MAX_LOG_COLORS > 4)
  907.       case 4:
  908.         DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  909.         break;
  910.     #endif
  911.     #if (LCD_MAX_LOG_COLORS > 16)
  912.       case 8:
  913.         DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans);
  914.         break;
  915.     #endif
  916.     }
  917.     pData += BytesPerLine;
  918.   }
  919. }
  920. /*
  921.         *****************************************
  922.         *
  923.         *           LCD_L0_SetOrg
  924.         *
  925.         *****************************************
  926. */
  927. int OrgX, OrgY;
  928. void LCD_L0_SetOrg(int x, int y) {
  929.   OrgX = x;
  930.   OrgY = y;
  931. }
  932. /*
  933.         *****************************************
  934.         *
  935.         *           LCD_L0_Init
  936.         *
  937.         *****************************************
  938. */
  939. int  LCD_L0_Init(void) {
  940.   GUI_DEBUG_LOG("nLCD_Init()");
  941.   LCD_INIT_CONTROLLER();
  942.   /* set cursor to illegal value */
  943.   Page = Offset = 0xfff;
  944.   /* clear LCD */
  945.   {
  946.     int pg;
  947.     for (pg = 0; pg < ((LCD_YSIZE_PHYS + 3) >> 2); pg++) {
  948.       int x = LCD_XSIZE_PHYS;
  949.       WRITE_PAGE(pg);
  950.       WRITE_OFFSET(0);
  951.       while(x--) {
  952.         WRITE_DATA(0);
  953.       }
  954.     }
  955.   }
  956.   /* clear aVRam */
  957.   memset(aVRam, 0, sizeof(aVRam));
  958.   /* turn off */
  959.   LCD_Off();
  960.   return 0;
  961. }
  962. #else
  963. void LCD15E05(void) { } /* avoid empty object files */
  964. #endif /* LCD_COMPILE_DRIVER */