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

📄 lcdlin.c

📁 ucgui的3.98版本的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#else
  #define LCD_XSIZE_P LCD_YSIZE
  #define LCD_YSIZE_P LCD_XSIZE
  #define LCD_VXSIZE_P LCD_VYSIZE
  #define LCD_VYSIZE_P LCD_VXSIZE
#endif

#if   LCD_BITSPERPIXEL == 1
  #define BYTESPERLINE (LCD_VXSIZE_P/8)
  #define WORDSPERLINE (LCD_VXSIZE_P/16)
#elif   LCD_BITSPERPIXEL == 2
  #define BYTESPERLINE (LCD_VXSIZE_P/4)
  #define WORDSPERLINE (LCD_VXSIZE_P/8)
#elif   LCD_BITSPERPIXEL == 4
  #define BYTESPERLINE (LCD_VXSIZE_P/2)
  #define WORDSPERLINE (LCD_VXSIZE_P/4)
#elif LCD_BITSPERPIXEL == 8
  #define BYTESPERLINE (LCD_VXSIZE_P)
  #define WORDSPERLINE (LCD_VXSIZE_P/2)
#elif  (LCD_BITSPERPIXEL == 15)
  #define BYTESPERLINE (LCD_VXSIZE_P*2)
  #define WORDSPERLINE (LCD_VXSIZE_P)
#elif  (LCD_BITSPERPIXEL == 16)
  #define BYTESPERLINE (LCD_VXSIZE_P*2)
  #define WORDSPERLINE (LCD_VXSIZE_P)
#else
  #error This colordepth is not supported !!!
#endif

#ifndef LCD_USE_32BIT_OFF
  #if ((WORDSPERLINE * LCD_YSIZE) > 0xFFFF)
    #define LCD_USE_32BIT_OFF 1
  #else
    #define LCD_USE_32BIT_OFF 0
  #endif
#endif

#if LCD_USE_32BIT_OFF
  typedef unsigned long tOff;
#else
  typedef unsigned int  tOff;
#endif

/*
        *********************************************************
        *                                                       *
        *              Macros, standard                         *
        *                                                       *
        *********************************************************

These macros can be found in any LCD-driver as they serve purposes
that can be found in any class of LCD-driver (Like clipping).

*/

#define BKCOLOR LCD_BKCOLORINDEX
#define   COLOR LCD_COLORINDEX

/*
        *********************************************************
        *                                                       *
        *      Configuration switch checking                    *
        *                                                       *
        *********************************************************

Please be aware that not all configuration errors can be captured !

*/

/* Check number of controllers */
#if ((LCD_NUM_CONTROLLERS >1) || (LCD_NUM_CONTROLLERS <0))
  #error "More than 1 controller not supported by this driver"
#endif

#if ((LCD_CONTROLLER == 1356) || (LCD_CONTROLLER == 13806) || (LCD_CONTROLLER == 1304)) && (LCD_BUSWIDTH != 16)
  #error This controller does not work with 8-bit bus
#endif

#if (((LCD_CONTROLLER == 1356) || (LCD_CONTROLLER == 13806) || (LCD_CONTROLLER == 1304)) && LCD_USE_BITBLT && ((LCD_BITSPERPIXEL != 8) && (LCD_BITSPERPIXEL != 16)))
  #error BitBlt-Access only available for 8bpp and 16bpp mode
#endif

#if (LCD_CONTROLLER==1374)
  #if (LCD_BITSPERPIXEL == 8)
    #if (LCD_FIXEDPALETTE != 233)
      #error This controller supports only 233 palette in 8 bpp mode !
    #endif
  #endif
#endif





/*
        *********************************************************
        *                                                       *
        *       Macros for internal use                         *
        *                                                       *
        *********************************************************
*/

#if !defined (LCD_LUT_COM)
  #define LINE2COM(y) y
#else
  #define LINE2COM(y) LCD__aLine2Com0[y]
#endif

#if LCD_BUSWIDTH == 16
  #if   (LCD_BITSPERPIXEL == 16)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x))
  #elif (LCD_BITSPERPIXEL == 15)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x))
  #elif (LCD_BITSPERPIXEL ==  8)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x>>1))
  #elif (LCD_BITSPERPIXEL ==  4)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+(x>>2))
  #elif (LCD_BITSPERPIXEL ==  2)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+((x)>>3))
  #elif (LCD_BITSPERPIXEL ==  1)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)WORDSPERLINE+((x)>>4))
  #endif
#else
  #if   (LCD_BITSPERPIXEL == 16)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)<<1))
  #elif (LCD_BITSPERPIXEL == 15)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)<<1))
  #elif (LCD_BITSPERPIXEL ==  8)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+(x))
  #elif (LCD_BITSPERPIXEL ==  4)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)>>1))
  #elif (LCD_BITSPERPIXEL ==  2)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)>>2))
  #elif (LCD_BITSPERPIXEL ==  1)
    #define XY2OFF(x,y)    (tOff)((tOff)LINE2COM(y)*(tOff)BYTESPERLINE+((x)>>3))
  #endif
#endif

#if ((LCD_SWAP_BYTE_ORDER) && (LCD_BITSPERPIXEL <=8)) | ((LCD_SWAP_BYTE_ORDER==0) && (LCD_BITSPERPIXEL  > 8))
  #define READ_MEM(Off, Data)  Data = LCD_READ_MEM(Off); Data = ((Data & 0xff) << 8) + (Data >> 8)
  #define WRITE_MEM(Off, Data) LCD_WRITE_MEM(Off, (U16)(((Data & 0xff) << 8) + ((Data & 0xff00) >> 8)))
#else
  #define READ_MEM(Off, Data)  Data = LCD_READ_MEM(Off)
  #define WRITE_MEM(Off, Data) LCD_WRITE_MEM(Off, Data)
#endif

#if (LCD_SWAP_BYTE_ORDER | (LCD_BUSWIDTH == 8))
  #define READ_REG(Off, Data)  Data = LCD_READ_REG(Off)
  #define WRITE_REG(Off, Data) LCD_WRITE_REG(Off, Data)
#else
  #define READ_REG(Off, Data)  { Data = SwapBytes(LCD_READ_REG(Off)); }
  #define WRITE_REG(Off, Data) { LCD_WRITE_REG(Off, SwapBytes(Data)); }
#endif

/* No use of LCD_WRITE_MEM, LCD_READ_MEM, LCD_WRITE_REG, LCD_READ_REG from this point */

#if defined (LCD_LUT_COM)
  #if (LCD_MIRROR_Y)
    #error LCD_MIRROR_Y not supported with COMTrans !
  #endif
  #if (LCD_MIRROR_X)
    #error LCD_MIRROR_X not supported with COMTrans !
  #endif
#endif

#if (!defined(LCD_LUT_SEG))
  #if   (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY)
    #define PHYS2LOG(x, y) x, y
  #elif (!LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY)
    #define PHYS2LOG(x, y) y, x
  #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY)
    #define PHYS2LOG(x, y) x, LCD_YSIZE - 1 - (y)
  #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY)
    #define PHYS2LOG(x, y) y, LCD_XSIZE - 1 - (x)
  #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY)
    #define PHYS2LOG(x, y) LCD_XSIZE - 1 - (x), y
  #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY)
    #define PHYS2LOG(x, y) LCD_YSIZE - 1 - (y), x
  #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY)
    #define PHYS2LOG(x, y) LCD_XSIZE - 1 - (x), LCD_YSIZE - 1 - (y)
  #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY)
    #error This combination of mirroring/swapping not yet supported
  #endif
#else
  #define PHYS2LOG(x, y) LCD__aCol2Seg0[x], y
#endif

#define SETPIXEL(x, y, c)  _SetPixel    (PHYS2LOG(x, y), c)
#define GETPIXEL(x, y)     _GetPixelIndex(PHYS2LOG(x, y))
#define XORPIXEL(x, y)     XorPixel     (PHYS2LOG(x, y))

/*
        *********************************************************
        *                                                       *
        *       Register access routines                        *
        *                                                       *
        *********************************************************
*/
#if (LCD_CONTROLLER == 1374)
#if defined(LCD_READ_REG)
#if (LCD_BUSWIDTH == 8)
  #define READ_REG_BYTE(Off) LCD_READ_REG(Off)
#else
  #define READ_REG_BYTE(Off) _ReadRegByte(Off)
static U8 _ReadRegByte(int Off) {
  U16 Data = LCD_READ_REG((Off>>1));
  #if LCD_SWAP_BYTE_ORDER
    return (Off&1) ? Data>>8 : Data&255;
  #else
    return (Off&1) ? Data&255 : Data>>8;
  #endif
}
#endif
#endif
#endif


/*********************************************************************
*
*       Static routines
*
**********************************************************************
*/

/*********************************************************************
*
*       SwapBytes
*
* Changed from static to a non static function to avoid compiler warnings.
*/
U16 SwapBytes(U16 Data);
U16 SwapBytes(U16 Data) {
  return (Data<<8) | (Data>>8);
}

#if !defined(LCD_SET_LUT_ENTRY)

#if   (LCD_CONTROLLER == 1301) /* Capricorn 2 */

/*********************************************************************
*
*       _SetLUTEntry_1301
*/
static void _SetLUTEntry_1301(U8 Pos, LCD_COLOR color) {
  U8 r = color & 0xff;
  U8 g = (color & 0xff00) >> 8;
  U8 b = (color & 0xff0000) >> 16;
  U32 LUTEntry = ((r >> 3) << 27) | ((g >> 3) << 22) | ((b >> 2) << 17);
  #ifndef WIN32
    #if   (LCD_DISPLAY_INDEX == 0)
      *(U32*)(LCD_LUT_0_VADR + 4 * Pos) = LUTEntry;
    #elif (LCD_DISPLAY_INDEX == 1)
      *(U32*)(LCD_LUT_1_VADR + 4 * Pos) = LUTEntry;
    #elif (LCD_DISPLAY_INDEX == 2)
      *(U32*)(LCD_LUT_2_VADR + 4 * Pos) = LUTEntry;
    #elif (LCD_DISPLAY_INDEX == 3)
      *(U32*)(LCD_LUT_3_VADR + 4 * Pos) = LUTEntry;
    #else
      #error Illegal Layer!
    #endif
  #else
    LCDSIM_SetLUTEntry(Pos, color, LCD_DISPLAY_INDEX);
  #endif
}
#define LCD_SET_LUT_ENTRY(Pos, Color) _SetLUTEntry_1301(Pos, Color)

#elif (LCD_CONTROLLER == 1302) && defined (__WATCOMC__)

/*********************************************************************
*
*       _SetLUTEntry_1302
*/
static void _SetLUTEntry_1302(U8 Pos, LCD_COLOR color) {
  U8 r = color & 0xff;
  U8 g = (color & 0xff00) >> 8;
  U8 b = (color & 0xff0000) >> 16;
  outp(0x3c8, Pos);
  outp(0x3c9, r);
  outp(0x3c9, g);
  outp(0x3c9, b);
}
#define LCD_SET_LUT_ENTRY(Pos, Color) _SetLUTEntry_1302(Pos, Color)

#elif (LCD_CONTROLLER == 1374)

/*********************************************************************
*
*       _SetLUTEntry_1374
*/
static void _SetLUTEntry_1374(U8 Pos, LCD_COLOR color) {
  int i;
  U16 aColorSep[3];
  for (i = 0; i < 3; i++) {
    aColorSep[i] = color &0xff;
    color >>= 8;
  }
  /* Convert 8 bit color seperation into index */
  for (i = 0; i < 3; i++) {
    aColorSep[i] = (U16)(aColorSep[i] + 8) / 17;
  }
  /* Write into palette register */
  LCD_ENABLE_REG_ACCESS();
  /* 4 bit palette */
  #if (LCD_BUSWIDTH == 16)
    WRITE_REG((0x14 >> 1), Pos * 0x101);   /* Select position */
    for (i = 0; i < 3; i++) {
      WRITE_REG((0x16 >> 1), ((U16)aColorSep[i] * 17) << 8);  /* 1375 expects high nibble, 1374 low nibble (so this works on both) */
    }
  #else
    WRITE_REG((0x15), Pos);   /* Select position */
    for (i = 0; i < 3; i++) {
      WRITE_REG((0x17), aColorSep[i]);
    }
  #endif
  LCD_ENABLE_MEM_ACCESS();
}
#define LCD_SET_LUT_ENTRY(Pos, Color) _SetLUTEntry_1374(Pos, Color)

#elif (LCD_CONTROLLER == 1375)

/*********************************************************************
*
*       _SetLUTEntry_1375
*/
static void _SetLUTEntry_1375(U8 Pos, LCD_COLOR color) {
  int i;
  U16 aColorSep[3];
  for (i = 0; i < 3; i++) {

⌨️ 快捷键说明

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