📄 lcdmemc.c
字号:
/*********************************************************************************************************** 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.CPurpose : Driver for LCDs using internal memory----------------------------------------------------------------------Version-Date---Author-Explanation----------------------------------------------------------------------2.01a 010927 JE a) Reworked to work with LCD_MIRROR_... and LCD_SWAP_XY2.01 010814 JE a) Support for 6bpp added, HLine & 1bpp optimized2.00 010402 RS a) LCD_GetDevCaps removed from driver (now LCD.c)0.92 000122 RS _GetPixel functionality written0.91 000121 RS Default for LCD_VRAMTYPE defined0.90 991205 RS Driver accelerated0.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 thisdriver. These switches might not be listed in the manual, becausethe manual mainly covers the general config switches which aresupported 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#endifLCD_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+15static 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); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -