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

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        : LCDDummy.C
  16. Purpose     : Empty driver for emWin GSC
  17.               This driver does no perform any function, but it can be
  18.               used for 2 purposes:
  19.               a) Satisfy all externals so an application can be
  20.                 compiled and linked in target hardware even if the
  21.                 driver is not already available
  22.               b) Template for a starting point for a new driver.
  23. ----------------------------------------------------------------------   
  24. Adapting to a new system (creating a new driver):
  25.   In this case, the first step is to fill the routines 
  26.   LCD_L0_GetPixelIndex, LCD_L0_SetPixelIndex and LCD_L0_Init with
  27.   functionality, which is sufficient to make the hardware work.
  28.   A second (optional) step would be to optimize higher level routines. 
  29. ----------------------------------------------------------------------   
  30. Version-Date---Author-Explanation                                        
  31. ----------------------------------------------------------------------   
  32. 1.00.00 020417 JE     a) Changed to have only to adapt _GetPixelIndex
  33.                          and _SetPixelIndex
  34. 0.90.00 020214 JE     a) First release
  35. ---------------------------END-OF-HEADER------------------------------
  36. */
  37. #include "LCD_Private.h"      /* private modul definitions & config */
  38. #include "GUI_Private.h"
  39. #include "GUIDebug.h"
  40. #include "LCD_0.h"            /* Defines for first display */
  41. #if (LCD_CONTROLLER == 444) 
  42.     && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  43. /*********************************************************************
  44. *
  45. *       Defines
  46. *
  47. **********************************************************************
  48. */
  49. #ifndef LCD_INIT_CONTROLLER
  50.   #define LCD_INIT_CONTROLLER()
  51. #endif
  52. /*********************************************************************
  53. *
  54. *       Types
  55. *
  56. **********************************************************************
  57. */
  58. typedef unsigned int  tOff;
  59. /*********************************************************************
  60. *
  61. *       Macros
  62. *
  63. **********************************************************************
  64. */
  65. #define WORDS_PER_LINE  (LCD_VXSIZE * 3 /4)
  66. #define Y2OFF(y)    (WORDS_PER_LINE * y)
  67. /*********************************************
  68. *
  69. *       Macros for MIRROR_, SWAP_ and LUT_
  70. *
  71. **********************************************
  72. */
  73. #if (!defined (LCD_LUT_COM) && !defined(LCD_LUT_SEG))
  74.   #if   (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  75.     #define LOG2PHYS_X(x, y) x
  76.     #define LOG2PHYS_Y(x, y) y
  77.   #elif (!LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  78.     #define LOG2PHYS_X(x, y) y
  79.     #define LOG2PHYS_Y(x, y) x
  80.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  81.     #define LOG2PHYS_X(x, y) x
  82.     #define LOG2PHYS_Y(x, y) LCD_YSIZE - 1 - (y)
  83.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  84.     #define LOG2PHYS_X(x, y) LCD_YSIZE - 1 - (y)
  85.     #define LOG2PHYS_Y(x, y) x
  86.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  87.     #define LOG2PHYS_X(x, y) LCD_XSIZE - 1 - (x)
  88.     #define LOG2PHYS_Y(x, y) y
  89.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  90.     #define LOG2PHYS_X(x, y) LCD_YSIZE - 1 - (y)
  91.     #define LOG2PHYS_Y(x, y) x
  92.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  93.     #define LOG2PHYS_X(x, y) LCD_XSIZE - 1 - (x)
  94.     #define LOG2PHYS_Y(x, y) LCD_YSIZE - 1 - (y)
  95.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  96.     #error This combination of mirroring/swapping not yet supported
  97.   #endif
  98. #else
  99.   #if   ( defined (LCD_LUT_COM) && !defined(LCD_LUT_SEG))
  100.     #define LOG2PHYS_X(x, y) x
  101.     #define LOG2PHYS_Y(x, y) LCD__aLine2Com0[y]
  102.   #elif (!defined (LCD_LUT_COM) &&  defined(LCD_LUT_SEG))
  103.     #define LOG2PHYS_X(x, y) LCD__aCol2Seg0[x]
  104.     #define LOG2PHYS_Y(x, y) y
  105.   #elif ( defined (LCD_LUT_COM) &&  defined(LCD_LUT_SEG))
  106.     #define LOG2PHYS_X(x, y) LCD__aCol2Seg0[x]
  107.     #define LOG2PHYS_Y(x, y) LCD__aLine2Com0[y]
  108.   #endif
  109. #endif
  110. /*********************************************
  111. *
  112. *       Macros for simulation
  113. *
  114. **********************************************
  115. */
  116. /*********************************************************************
  117. *
  118. *       Static functions
  119. *
  120. **********************************************************************
  121. */
  122. #if defined(WIN32)
  123.   void SIM_WriteMem16(unsigned int Off, int Data);
  124.   int  SIM_ReadMem16(unsigned int Off);
  125.   #undef  LCD_READ_MEM16
  126.   #undef  LCD_WRITE_MEM16
  127.   #define  LCD_READ_MEM16(Off)        SIM_ReadMem16(Off)
  128.   #define  LCD_WRITE_MEM16(Off, Data) SIM_WriteMem16(Off, Data)
  129. #endif
  130. /*********************************************
  131. *
  132. *       Draw Bitmap 1 BPP
  133. *
  134. **********************************************
  135. */
  136. static void  _DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  137.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  138.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  139.   x += Diff;
  140.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  141.     case 0:
  142.       do {
  143.         LCD_L0_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0);
  144.   if (++Diff == 8) {
  145.           Diff = 0;
  146.   p++;
  147.   }
  148.   } while (--xsize);
  149.       break;
  150.     case LCD_DRAWMODE_TRANS:
  151.       do {
  152.      if (*p & (0x80 >> Diff))
  153.           LCD_L0_SetPixelIndex(x, y, Index1);
  154.         x++;
  155.   if (++Diff == 8) {
  156.           Diff = 0;
  157.   p++;
  158.   }
  159.   } while (--xsize);
  160.       break;
  161.     case LCD_DRAWMODE_XOR:;
  162.       do {
  163.      if (*p & (0x80 >> Diff)) {
  164.           int Pixel = LCD_L0_GetPixelIndex(x, y);
  165.           LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
  166.         }
  167.         x++;
  168.   if (++Diff == 8) {
  169.           Diff = 0;
  170.   p++;
  171.   }
  172.   } while (--xsize);
  173.       break;
  174. }
  175. }
  176. /*********************************************
  177. *
  178. *       Draw Bitmap 2 BPP
  179. *
  180. **********************************************
  181. */
  182. #if (LCD_MAX_LOG_COLORS > 2)
  183. static void  _DrawBitLine2BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  184.   LCD_PIXELINDEX Pixels = *p;
  185.   int CurrentPixel = Diff;
  186.   x += Diff;
  187.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  188.     case 0:
  189.       do {
  190.         int Shift = (3 - CurrentPixel) << 1;
  191.         int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
  192.         LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  193.         LCD_L0_SetPixelIndex(x++, y, PixelIndex);
  194.         if (++CurrentPixel == 4) {
  195.           CurrentPixel = 0;
  196.           Pixels = *(++p);
  197.         }
  198.   } while (--xsize);
  199.       break;
  200.     case LCD_DRAWMODE_TRANS:
  201.       do {
  202.         int Shift = (3 - CurrentPixel) << 1;
  203.         int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
  204.         if (Index) {
  205.           LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  206.           LCD_L0_SetPixelIndex(x, y, PixelIndex);
  207.         }
  208.         x++;
  209.         if (++CurrentPixel == 4) {
  210.           CurrentPixel = 0;
  211.           Pixels = *(++p);
  212.         }
  213.   } while (--xsize);
  214.       break;
  215.   }
  216. }
  217. #endif
  218. /*********************************************
  219. *
  220. *       Draw Bitmap 4 BPP
  221. *
  222. **********************************************
  223. */
  224. #if (LCD_MAX_LOG_COLORS > 4)
  225. static void  _DrawBitLine4BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  226.   LCD_PIXELINDEX Pixels = *p;
  227.   int CurrentPixel = Diff;
  228.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  229.     case 0:
  230.       do {
  231.         int Shift = (1 - CurrentPixel) << 2;
  232.         int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
  233.         LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  234.         LCD_L0_SetPixelIndex(x++, y, PixelIndex);
  235.         if (++CurrentPixel == 2) {
  236.           CurrentPixel = 0;
  237.           Pixels = *(++p);
  238.         }
  239.   } while (--xsize);
  240.       break;
  241.     case LCD_DRAWMODE_TRANS:
  242.       do {
  243.         int Shift = (1 - CurrentPixel) << 2;
  244.         int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
  245.         if (Index) {
  246.           LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  247.           LCD_L0_SetPixelIndex(x, y, PixelIndex);
  248.         }
  249.         x++;
  250.         if (++CurrentPixel == 2) {
  251.           CurrentPixel = 0;
  252.           Pixels = *(++p);
  253.         }
  254.   } while (--xsize);
  255.       break;
  256.   }
  257. }
  258. #endif
  259. /*********************************************
  260. *
  261. *       Draw Bitmap 8 BPP
  262. *
  263. **********************************************
  264. */
  265. #if (LCD_MAX_LOG_COLORS > 16)
  266. static void  _DrawBitLine8BPP(int x, int y, U8 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
  267.   LCD_PIXELINDEX Pixel;
  268.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  269.     case 0:
  270.       if (pTrans) {
  271.         for (; xsize > 0; xsize--, x++, p++) {
  272.           Pixel = *p;
  273.           LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  274.         }
  275.       } else {
  276.         for (; xsize > 0; xsize--, x++, p++) {
  277.           LCD_L0_SetPixelIndex(x, y, *p);
  278.         }
  279.       }
  280.       break;
  281.     case LCD_DRAWMODE_TRANS:
  282.       if (pTrans) {
  283.         for (; xsize > 0; xsize--, x++, p++) {
  284.           Pixel = *p;
  285.           if (Pixel) {
  286.             LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  287.           }
  288.         }
  289.       } else {
  290.         for (; xsize > 0; xsize--, x++, p++) {
  291.           Pixel = *p;
  292.           if (Pixel) {
  293.             LCD_L0_SetPixelIndex(x, y, Pixel);
  294.           }
  295.         }
  296.       }
  297.       break;
  298.   }
  299. }
  300. #endif
  301. /*********************************************
  302. *
  303. *       Draw Bitmap 16 BPP
  304. *
  305. **********************************************
  306. */
  307. #if (LCD_BITSPERPIXEL > 8)
  308. static void  DrawBitLine16BPP(int x, int y, U16 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
  309.   LCD_PIXELINDEX pixel;
  310.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) {
  311.     if (pTrans) {
  312.       for (; xsize > 0; xsize--, x++, p++) {
  313.         pixel = *p;
  314.         LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));
  315.       }
  316.     } else {
  317.       for (;xsize > 0; xsize--, x++, p++) {
  318.         LCD_L0_SetPixelIndex(x, y, *p);
  319.       }
  320.     }
  321.   } else {
  322.     if (pTrans) {
  323.       for (; xsize > 0; xsize--, x++, p++) {
  324.         pixel = *p;
  325.         if (pixel) {
  326.           LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));
  327.         }
  328.       }
  329.     } else {
  330.       for (; xsize > 0; xsize--, x++, p++) {
  331.         pixel = *p;
  332.         if (pixel) {
  333.           LCD_L0_SetPixelIndex(x, y, pixel);
  334.         }
  335.       }
  336.     }
  337.   }
  338. }
  339. #endif
  340. /*********************************************************************
  341. *
  342. *       Exported functions
  343. *
  344. **********************************************************************
  345. */
  346. /*********************************************
  347. *
  348. *       LCD_L0_SetPixelIndex
  349. *
  350. **********************************************
  351. Purpose:
  352.   Sets the index of the given pixel. The upper layers of emWin
  353.   calling this routine make sure that the coordinates are in range, so
  354.   that no check on the parameters needs to be performed.
  355. */
  356. void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {
  357.   unsigned Off;
  358.   U16 Data;
  359.   /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
  360.   #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
  361.     int xPhys = LOG2PHYS_X(x, y);
  362.     int yPhys = LOG2PHYS_Y(x, y);
  363.   #else
  364.     #define xPhys x
  365.     #define yPhys y
  366.   #endif
  367.   /* Write into hardware ... Adapt to your system */
  368.   {
  369.     Off = Y2OFF(yPhys);
  370.     Off += 3 * x/4;
  371.     switch (x&3) {
  372.     case 0:
  373.       Data = LCD_READ_MEM16(Off);
  374.       Data &= 0xf000;
  375.       Data |= PixelIndex;
  376.       LCD_WRITE_MEM16(Off, Data);
  377.       break;
  378.     case 1:;
  379.       Data = LCD_READ_MEM16(Off);
  380.       Data &= 0xfff;
  381.       Data |= (U16)(PixelIndex << 12);
  382.       LCD_WRITE_MEM16(Off, Data);
  383.       Off++;
  384.       Data = LCD_READ_MEM16(Off);
  385.       Data &= 0xff00;
  386.       Data |= PixelIndex>>4;
  387.       LCD_WRITE_MEM16(Off, Data);
  388.       break;
  389.     case 2:;
  390.       Data = LCD_READ_MEM16(Off);
  391.       Data &= 0xff;
  392.       Data |= (U16)(PixelIndex << 8);
  393.       LCD_WRITE_MEM16(Off, Data);
  394.       Off++;
  395.       Data = LCD_READ_MEM16(Off);
  396.       Data &= 0xfff0;
  397.       Data |= PixelIndex>>8;
  398.       LCD_WRITE_MEM16(Off, Data);
  399.       break;
  400.     case 3:;
  401.       Data = LCD_READ_MEM16(Off);
  402.       Data &= 0xf;
  403.       Data |= PixelIndex << 4;
  404.       LCD_WRITE_MEM16(Off, Data);
  405.       break;
  406.     }
  407.     /* ... */
  408.   }
  409. }
  410. /*********************************************
  411. *
  412. *       LCD_L0_GetPixelIndex
  413. *
  414. **********************************************
  415. Purpose:
  416.   Returns the index of the given pixel. The upper layers of emWin
  417.   calling this routine make sure that the coordinates are in range, so
  418.   that no check on the parameters needs to be performed.
  419. */
  420. unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  421.   LCD_PIXELINDEX PixelIndex;
  422.   U16 Data0, Data1;
  423.   unsigned Off;
  424.   /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
  425.   #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
  426.     int xPhys = LOG2PHYS_X(x, y);
  427.     int yPhys = LOG2PHYS_Y(x, y);
  428.   #else
  429.     #define xPhys x
  430.     #define yPhys y
  431.   #endif
  432.   /* Write into hardware ... Adapt to your system */
  433.   {
  434.     Off = Y2OFF(yPhys);
  435.     Off += 3 * x/4;
  436.     switch (x&3) {
  437.     case 0:
  438.       PixelIndex = LCD_READ_MEM16(Off) & 0xfff;
  439.       break;
  440.     case 1:
  441.       Data0 = LCD_READ_MEM16(Off);
  442.       Off++;
  443.       Data1 = LCD_READ_MEM16(Off);
  444.       PixelIndex  = Data0 >> 12;
  445.       PixelIndex |= (Data1 & 255) << 4;
  446.       break;
  447.     case 2:
  448.       Data0 = LCD_READ_MEM16(Off);
  449.       Off++;
  450.       Data1 = LCD_READ_MEM16(Off);
  451.       PixelIndex  = Data0 >> 8;
  452.       PixelIndex |= (Data1 & 15) << 8;
  453.       break;
  454.     case 3:
  455.       PixelIndex = LCD_READ_MEM16(Off);
  456.       PixelIndex >>= 4;
  457.       break;
  458.     }
  459.   }
  460.   return PixelIndex;
  461. }
  462. /*********************************************
  463. *
  464. *       LCD_L0_XorPixel
  465. *
  466. **********************************************
  467. */
  468. void LCD_L0_XorPixel(int x, int y) {
  469.   LCD_PIXELINDEX PixelIndex = LCD_L0_GetPixelIndex(x, y);
  470.   LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - PixelIndex - 1);
  471. }
  472. /*********************************************
  473. *
  474. *       LCD_L0_DrawHLine
  475. *
  476. **********************************************
  477. */
  478. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  479.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  480.     for (; x0 <= x1; x0++) {
  481.       LCD_L0_XorPixel(x0, y);
  482.     }
  483.   } else {
  484.     for (; x0 <= x1; x0++) {
  485.       LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX);
  486.     }
  487.   }
  488. }
  489. /*********************************************
  490. *
  491. *       LCD_L0_DrawVLine
  492. *
  493. **********************************************
  494. */
  495. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  496.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  497.     for (; y0 <= y1; y0++) {
  498.       LCD_L0_XorPixel(x, y0);
  499.     }
  500.   } else {
  501.     for (; y0 <= y1; y0++) {
  502.       LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX);
  503.     }
  504.   }
  505. }
  506. /*********************************************
  507. *
  508. *       LCD_L0_FillRect
  509. *
  510. **********************************************
  511. */
  512. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  513.   for (; y0 <= y1; y0++) {
  514.     LCD_L0_DrawHLine(x0, y0, x1);
  515.   }
  516. }
  517. /*********************************************
  518. *
  519. *       LCD_L0_DrawBitmap
  520. *
  521. **********************************************
  522. */
  523. void LCD_L0_DrawBitmap(int x0, int y0,
  524.                        int xsize, int ysize,
  525.                        int BitsPerPixel, 
  526.                        int BytesPerLine,
  527.                        const U8* pData, int Diff,
  528.                        const LCD_PIXELINDEX* pTrans)
  529. {
  530.   int i;
  531.   /* Use _DrawBitLineXBPP */
  532.   for (i=0; i<ysize; i++) {
  533.     switch (BitsPerPixel) {
  534.     case 1:
  535.       _DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  536.       break;
  537.       case 2:
  538.         _DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  539.         break;
  540.       case 4:
  541.         _DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  542.         break;
  543.       case 8:
  544.         _DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans);
  545.         break;
  546.       case 16:
  547.         DrawBitLine16BPP(x0, i + y0, (const U16 *)pData, xsize, pTrans);
  548.         break;
  549.     }
  550.     pData += BytesPerLine;
  551.   }
  552. }
  553. /*********************************************
  554. *
  555. *       LCD_L0_SetOrg
  556. *
  557. **********************************************
  558. */
  559. void LCD_L0_SetOrg(int x, int y) {
  560.   GUI_USE_PARA(x);
  561.   GUI_USE_PARA(y);
  562. }
  563. /*********************************************
  564. *
  565. *       LCD_On / LCD_Off
  566. *
  567. **********************************************
  568. */
  569. void LCD_On (void) {
  570. #ifdef LCD_ON
  571.   LCD_ON();
  572. #endif
  573. }
  574. void LCD_Off (void) {
  575. #ifdef LCD_OFF
  576.   LCD_OFF();
  577. #endif
  578. }
  579. /*********************************************
  580. *
  581. *       LCD_L0_Init
  582. *
  583. **********************************************
  584. Purpose:
  585.   Initialises the LCD-controller.
  586. */
  587. int  LCD_L0_Init(void) {
  588.   LCD_INIT_CONTROLLER();
  589.   return 0;
  590. }
  591. /*********************************************
  592. *
  593. *       LCD_L0_SetLUTEntry
  594. *
  595. **********************************************
  596. */
  597. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) {
  598.   GUI_USE_PARA(Pos);
  599.   GUI_USE_PARA(Color);
  600. }
  601. #else
  602. void LCD444_c(void) { } /* avoid empty object files */
  603. #endif /* (LCD_CONTROLLER undefined) */