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

📄 lcdmemc.c

📁 lpc2478+ucosII+ucgui源码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
*********************************************************************************************************
*                                                uC/GUI
*                        Universal graphic software for embedded applications
*
*                       (c) Copyright 2002, Micrium Inc., Weston, FL
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*              礐/GUI is protected by international copyright laws. Knowledge of the
*              source code may not be used to write a similar product. This file may
*              only be used in accordance with a license and should not be redistributed
*              in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File        : LCDMem.C
Purpose     : Driver for LCDs using internal memory
----------------------------------------------------------------------
Version-Date---Author-Explanation
----------------------------------------------------------------------
2.01a   010927 JE     a) Reworked to work with LCD_MIRROR_...
                         and LCD_SWAP_XY
2.01    010814 JE     a) Support for 6bpp added,
                         HLine & 1bpp optimized
2.00    010402 RS     a) LCD_GetDevCaps removed from driver
                         (now LCD.c)
0.92    000122 RS     _GetPixel functionality written
0.91    000121 RS     Default for LCD_VRAMTYPE defined
0.90    991205 RS     Driver accelerated
0.00    990118 RS     First release. 
----------------------------------------------------------------------
Known problems or limitations with current version
----------------------------------------------------------------------
None.
---------------------------LIST OF CONFIG SWITCHES--------------------
The following is a list of additional configuration switches for this
driver. These switches might not be listed in the manual, because
the manual mainly covers the general config switches which are
supported by all drivers.
----------------------------------------------------------------------
define ----------------------Explanation------------------------------
LCD_LSB_SHIFT                Support for both big and little endian
                             systems.
                             0 for little endian (default),
                             8 for big endian.
LCD_OPTIMIZE                 Controls the use of optimized routines.
                             If 1, several (speed) optimizations are used.
                             Default: ON (1)
LCD_VRAMTYPE                 Controls storage area of VRAM
---------------------------END-OF-HEADER------------------------------
*/

#define LCDMEMC_C

#include <string.h>             /* for memset */
#include <stddef.h>           /* needed for definition of NULL */
#include "LCD_Private.h"      /* private modul definitions & config */
#include "GUI_Private.h"
#include "GUIDebug.h"
#include "LCD_0.h"            /* Defines for first display */

#ifndef LCD_VRAMTYPE
  #define LCD_VRAMTYPE
#endif



#if (LCD_CONTROLLER   == 0) && ((LCD_FIXEDPALETTE == 111) || (LCD_FIXEDPALETTE == 222)) \
      && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))



   /* Generate code only if selected ! */

#define LCD_BYTESPERLINE (3*(((LCD_VXSIZE_PHYS)+7)/8))

#ifndef WIN32
  #if   (LCD_BITSPERPIXEL == 3)
    LCD_VRAMTYPE U8 LCD_VRam[LCD_BITSPERPIXEL/3][LCD_VYSIZE_PHYS * LCD_BYTESPERLINE];
  #elif (LCD_BITSPERPIXEL == 6)
    LCD_VRAMTYPE U8 LCD_VRam_0[LCD_VYSIZE_PHYS * LCD_BYTESPERLINE];
    LCD_VRAMTYPE U8 LCD_VRam_1[LCD_VYSIZE_PHYS * LCD_BYTESPERLINE];
  #endif
#else
  U8* GetpVRam(int);
  #if   (LCD_BITSPERPIXEL == 3)
    U8* pVRam;
  #elif (LCD_BITSPERPIXEL == 6)
    U8* pVRam_0;
    U8* pVRam_1;
  #endif
#endif



/*
  ********************************************************************
  *                                                                  *
  *            Defaults for configuration                            *
  *                                                                  *
  ********************************************************************

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

*/
#ifndef LCD_VERIFY
  #define LCD_VERIFY (0)
#endif

/* Switch for support of multiple pages.
 Only available with certain LCD-controllers */
#ifndef LCD_SUPPORT_PAGING
  #define LCD_SUPPORT_PAGING            (0)
#endif

/* Switch for support of run-time inversion of display. */
#ifndef LCD_SUPPORT_REVERSEMODE
  #define LCD_SUPPORT_REVERSEMODE       (0)
#endif

/* Switch support for the LCD_SetOrg function of the driver */
#ifndef LCD_SUPPORT_SETORG
  #define LCD_SUPPORT_SETORG            (1)
#endif

#ifndef LCD_SUPPORT_PALETTE
  #define LCD_SUPPORT_PALETTE            (1)
#endif

#ifndef LCD_SCHEDULE_CNT
  #define LCD_SCHEDULE_CNT        (0)
#endif

#ifndef LCD_ISRDATA
  #define LCD_ISRDATA
#endif
  
/* Bit position of least sig. byte when accessing words */
#ifndef LCD_LSB_SHIFT
  #define LCD_LSB_SHIFT                 (0)
#endif

#ifndef LCD_OPTIMIZE
  #define LCD_OPTIMIZE                (1)
#endif

/*
  ********************************************************************
  *                                                                  *
  *                Support for Segment/COMLUTs                       *
  *                                                                  *
  ********************************************************************
*/

/* For compatibility with older configs, define defaults */
#ifndef LCD_SUPPORT_COMTRANS
  #define LCD_SUPPORT_COMTRANS 0
#endif
#ifndef LCD_SUPPORT_SEGTRANS
  #define LCD_SUPPORT_SEGTRANS 0
#endif

#if LCD_SUPPORT_COMTRANS
  extern U8 LCD__aLine2Com0[LCD_LASTCOM0-LCD_FIRSTCOM0+1];
#endif

#if LCD_SUPPORT_SEGTRANS
  extern U8 LCD__aRow2Seg0[LCD_LASTSEG0-LCD_FIRSTSEG0+1];
#endif


/*
  ********************************************************************
  *                                                                  *
  *                 Macro calculations                               *
  *                                                                  *
  ********************************************************************
*/

/* Define number of used coms/segments per controller */
#define LCD_NUM_SEGS0 (LCD_LASTSEG0-LCD_FIRSTSEG0+1)
#define LCD_NUM_COMS0 (LCD_LASTCOM0-LCD_FIRSTCOM0+1)
/* Define total number of used coms/segments */
#define LCD_NUM_SEGS LCD_NUM_SEGS0
#define LCD_NUM_COMS LCD_NUM_COMS0

#define BKCOLOR LCD_BKCOLORINDEX
#define   COLOR LCD_COLORINDEX

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

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

*/

#if (LCD_BITSPERPIXEL != 3) && (LCD_BITSPERPIXEL != 6)
  #error this value for LCD_BITSPERPIXEL not yet supported
#endif

/* Check if number of segments / coms equals resolution */
#if (LCD_NUM_SEGS < LCD_XSIZE_PHYS)
/*  #error Please check segment setup of controller 0 and X/YSIZE !!!*/
#endif
#if (LCD_NUM_COMS < LCD_YSIZE_PHYS)
/*  #error Please check com setup of controller 0 and X/YSIZE !!!*/
#endif


/*
  ********************************************************************
  *                                                                  *
  *       EXPORTs for ISR                                            *
  *                                                                  *
  ********************************************************************
*/

#ifndef LCD_TIMERINIT1
  #define LCD_TIMERINIT1  1599
#endif
#ifndef LCD_TIMERINIT0
  #define LCD_TIMERINIT0  1065
#endif

LCD_ISRDATA U16 LCD__BitsPerPixel = LCD_BITSPERPIXEL/3;
LCD_ISRDATA U8 LCD_VRAMTYPE* LCD__apVRam[LCD_BITSPERPIXEL/3];
LCD_ISRDATA U16 LCD__aTimerReload[LCD_BITSPERPIXEL/3] = {
  LCD_TIMERINIT0
  #if LCD_BITSPERPIXEL/3 >1
		,LCD_TIMERINIT1
  #endif
};

/*
  ********************************************************************
  *
  *                  ID translation table
  *
  ********************************************************************

This table contains 0, 1, 2, ... and serves as translation table for DDBs

*/

#define INTS(Base)  Base+0,Base+1,Base+2,Base+3,Base+4,Base+5,   \
                    Base+6,Base+7,Base+8,Base+9,Base+10,Base+11, \
                    Base+12,Base+13,Base+14,Base+15

static const LCD_PIXELINDEX aID[] = {
  INTS(0),
  #if LCD_MAX_LOG_COLORS > 0x10
    INTS(0x10),
  #endif
  #if LCD_MAX_LOG_COLORS > 0x20
    INTS(0x20),
    INTS(0x30),
  #endif
  #if LCD_MAX_LOG_COLORS > 0x40
    INTS(0x40),
    INTS(0x50),
    INTS(0x60),
    INTS(0x70),
  #endif
  #if LCD_MAX_LOG_COLORS > 0x80
    INTS(0x80),
    INTS(0x90),
    INTS(0xa0),
    INTS(0xb0),
    INTS(0xc0),
    INTS(0xd0),
    INTS(0xe0),
    INTS(0xf0)
  #endif
};


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

#if (LCD_SUPPORT_COMTRANS)
  #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 (!LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  #if   (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
    #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((x), (y), (c))
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((x), (y), (c))
    #define GETPIXEL(x, y)         GetPixel            ((x), (y))
    #define XORPIXEL(x, y)         XorPixel            ((x), (y))
  #elif (!LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
    #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((y), (x), (c))
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((y), (x), (c))
    #define GETPIXEL(x, y)         GetPixel            ((y), (x))
    #define XORPIXEL(x, y)         XorPixel            ((y), (x))
  #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
    #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((x), (LCD_YSIZE-1-(y)), (c))
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((x), (LCD_YSIZE-1-(y)), (c))
    #define GETPIXEL(x, y)         GetPixel            ((x), (LCD_YSIZE-1-(y)))
    #define XORPIXEL(x, y)         XorPixel            ((x), (LCD_YSIZE-1-(y)))
  #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
    #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((LCD_YSIZE-1-(y)), (x), (c))
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((LCD_YSIZE-1-(y)), (x), (c))
    #define GETPIXEL(x, y)         GetPixel            ((LCD_YSIZE-1-(y)), (x))
    #define XORPIXEL(x, y)         XorPixel            ((LCD_YSIZE-1-(y)), (x))
  #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
    #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (y), (c))
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (y), (c))
    #define GETPIXEL(x, y)         GetPixel            ((LCD_XSIZE-1-(x)), (y))
    #define XORPIXEL(x, y)         XorPixel            ((LCD_XSIZE-1-(x)), (y))
  #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
    #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((y), (LCD_XSIZE-1-(x)), (c))
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((y), (LCD_XSIZE-1-(x)), (c))
    #define GETPIXEL(x, y)         GetPixel            ((y), (LCD_XSIZE-1-(x)))
    #define XORPIXEL(x, y)         XorPixel            ((y), (LCD_XSIZE-1-(x)))
  #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
    #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (LCD_YSIZE-1-(y)), (c))
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (LCD_YSIZE-1-(y)), (c))
    #define GETPIXEL(x, y)         GetPixel            ((LCD_XSIZE-1-(x)), (LCD_YSIZE-1-(y)))
    #define XORPIXEL(x, y)         XorPixel            ((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
#elif (LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  #if (!LCD_SWAP_XY)
    #define SETPIXEL(x, y, c)      SetPixelPhys(x,LCD__aLine2Com0[y], c)
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS(x,LCD__aLine2Com0[y], c)
    #define GETPIXEL(x, y)     LCD_L0_GetPixelIndex(x,LCD__aLine2Com0[y])
    #define XORPIXEL(x, y)      XorPixel(x,LCD__aLine2Com0[y])
  #else
    #define SETPIXEL(x, y, c)      SetPixelPhys(y,LCD__aLine2Com0[x], c)
    #define SETPIXELFAST(x, y, c)  SETPIXELPHYS(y,LCD__aLine2Com0[x], c)
    #define GETPIXEL(x, y)     LCD_L0_GetPixelIndex(y,LCD__aLine2Com0[x])
    #define XORPIXEL(x, y)      XorPixel(y,LCD__aLine2Com0[x])
  #endif
#else
  #error This combination of switches not yet supported
#endif

#define XY2OFF(x,y) (y*LCD_BYTESPERLINE+3*(x>>3))

#ifndef WIN32
  #if   (LCD_BITSPERPIXEL == 3)
    #define OFF2PTR(Off) &LCD_VRam[0][Off]
  #elif (LCD_BITSPERPIXEL == 6)
    #define OFF2PTR_0(Off) &LCD_VRam_0[Off]
    #define OFF2PTR_1(Off) &LCD_VRam_1[Off]
  #endif
#else
  #if   (LCD_BITSPERPIXEL == 3)
    #define OFF2PTR(Off) (pVRam+Off)
  #elif (LCD_BITSPERPIXEL == 6)
    #define OFF2PTR_0(Off) (pVRam_0+Off)
    #define OFF2PTR_1(Off) (pVRam_1+Off)
  #endif
#endif





/*
        *********************************************************
        *                                                       *
        *       Internal set pixel routines                     *
        *                                                       *
        *********************************************************
*/

#if (LCD_BITSPERPIXEL == 3)

#define SETPIXELPHYS(x,y,c)                       \
{                                                 \
   U8 LCD_VRAMTYPE* p = OFF2PTR(XY2OFF(x,y));     \
  switch (x&7) {                                  \
  case 0:                                         \
    *p = (*p&~(7<<5))|(c<<5);                     \
    break;                                        \
  case 1:                                         \
    *p = (*p&~(7<<2))|(c<<2);                     \
    break;                                        \
  case 2:                                         \
    *p   = (*p&~(3))|(c>>1);                      \
    p++;                                          \
    *p = (*p &~(1<<7))|(c<<7);                    \
    break;                                        \
  case 3:                                         \
    p++;                                          \
    *p = (*p&~(7<<4))|(c<<4);                     \
    break;                                        \
  case 4:                                         \
    p++;                                          \
    *p = (*p&~(7<<1))|(c<<1);                     \
    break;                                        \
  case 5:                                         \
    p++;                                          \
    *p   = (*p&~(1))|(c>>2);                      \
    p++;                                          \
    *p = (*p &~(3<<6))|(c<<6);                    \
    break;                                        \
  case 6:                                         \
    p+=2;                                         \
    *p = (*p&~(7<<3))|(c<<3);                     \
    break;                                        \

⌨️ 快捷键说明

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