📄 lcdmem.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.C
Purpose : Driver for LCDs using internal memory
----------------------------------------------------------------------
Version-Date---Author-Explanation
----------------------------------------------------------------------
2.00a 010926 JE a) Reworked to work with LCD_MIRROR_...
and LCD_SWAP_XY
2.00 010402 RS a) LCD_GetDevCaps removed from driver
(now LCD.c)
1.00.04 990930 RS Prototyp changed for LCD_Init()
1.00.03 990927 RS Config defaults added
1.00.02 990925 RS Bugfix for transparent 4 color bitmaps
1.00.01 990920 RS Bugfix for DrawHline
1.00 990823 RS Xor accelerated.
0.00 990118 RS First release.
----------------------------------------------------------------------
Known problems or limitations with current version
----------------------------------------------------------------------
None.
---------------------------END-OF-HEADER------------------------------
*/
#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 */
#if ((LCD_CONTROLLER == 0) && ((LCD_FIXEDPALETTE==2) | (LCD_FIXEDPALETTE==1)) ) \
&& (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
#define LCD_BYTESPERLINE (((LCD_VXSIZE_PHYS)+7)/8)
#ifndef LCD_VRAMTYPE
#define LCD_VRAMTYPE
#endif
#ifdef WIN32
#undef LCD_VRAMTYPE
#define LCD_VRAMTYPE
#endif
LCD_VRAMTYPE U8 LCD_VRam[LCD_BITSPERPIXEL][LCD_VYSIZE_PHYS * LCD_BYTESPERLINE];
/*
********************************************************************
* *
* Defaults for configuration *
* *
********************************************************************
Please be aware that not all configuration errors can be captured !
*/
#ifndef LCD_NUM_EMPTY_LINES
#define LCD_NUM_EMPTY_LINES 0
#endif
#ifndef LCD_REVERSEMODE_SUPPORT
#define LCD_REVERSEMODE_SUPPORT (1)
#endif
#ifndef LCD_VERIFY
#define LCD_VERIFY (0)
#endif
#ifndef LCD_REVERSEMODE_SUPPORT
#define LCD_REVERSEMODE_SUPPORT (0)
#endif
#ifndef LCD_SUPPORT_VERIFY
#define LCD_SUPPORT_VERIFY (0)
#endif
/* If disabled, selected drawmode is ignored.
==> XOR, REVERSE drawing not supported */
#ifndef LCD_SUPPORT_DRAWMODE
#define LCD_SUPPORT_DRAWMODE (1)
#endif
/* Switch support for the LCD_On, LCD_Off functions of the driver */
#ifndef LCD_SUPPORT_ONOFF
#define LCD_SUPPORT_ONOFF (1)
#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
/*
********************************************************************
* *
* SCHEDULING *
* *
********************************************************************
*/
#if (LCD_SCHEDULE_CNT !=0)
static int ScheduleCntRem=LCD_SCHEDULE_CNT;
#define CHECK_SCHEDULE(PixelCnt) \
if ((ScheduleCntRem-=(PixelCnt)) <=0) { \
ScheduleCntRem=LCD_SCHEDULE_CNT; \
LCD_SCHEDULE(); \
}
#else
#define CHECK_SCHEDULE(PixelCnt)
#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 LCD_MEMSIZE LCD_VXSIZE_PHYS*(LCD_VYSIZE_PHYS+LCD_NUM_EMPTY_LINES)
/*
********************************************************************
* *
* Configuration switch checking *
* *
********************************************************************
Please be aware that not all configuration errors can be captured !
*/
#if (LCD_BITSPERPIXEL != 2) & (LCD_BITSPERPIXEL != 1)
#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
U16 LCD__BitsPerPixel = LCD_BITSPERPIXEL;
LCD_VRAMTYPE U8 LCD_VRAMTYPE* LCD__apVRam[LCD_BITSPERPIXEL];
LCD_VRAMTYPE U16 LCD__aTimerReload[LCD_BITSPERPIXEL] = {
LCD_TIMERINIT0
#if LCD_BITSPERPIXEL > 1
,LCD_TIMERINIT1
#endif
};
/*
********************************************************************
* *
* Standard variables for driver *
* *
********************************************************************
*/
#define PIXELCOLOR U8
#define BKCOLOR LCD_BKCOLORINDEX
#define COLOR LCD_COLORINDEX
/*
********************************************************************
*
* 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
};
/*
*********************************************************
* *
* 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 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 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 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) _GetPixel(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) _GetPixel(y,LCD__aLine2Com0[x])
#define XORPIXEL(x, y) XorPixel(y,LCD__aLine2Com0[x])
#endif
#else
#error This combination of switches not yet supported
#endif
/*
*********************************************************
* *
* Internal set pixel routines *
* *
*********************************************************
*/
#if LCD_BITSPERPIXEL == 1
#define SETPIXELPHYS(x,y,c) \
{ \
unsigned int Off = y*LCD_BYTESPERLINE+((x)>>3); \
U8 Data = 0x80>>((x)&7); \
if (c&1) LCD_VRam[0][Off] |= Data; \
else LCD_VRam[0][Off] &= ~Data; \
}
#elif LCD_BITSPERPIXEL == 2
#define SETPIXELPHYS(x,y,c) \
{ \
unsigned int Off = y*LCD_BYTESPERLINE+((x)>>3); \
U8 Data = 0x80>>((x)&7); \
if (c&1) LCD_VRam[0][Off] |= Data; \
else LCD_VRam[0][Off] &= ~Data; \
if (c&2) LCD_VRam[1][Off] |= Data; \
else LCD_VRam[1][Off] &= ~Data; \
}
#else
#error unsupported Configuration
#endif
static void SetPixelPhys(int x, int y, PIXELCOLOR c) {
SETPIXELPHYS(x,y,c);
}
static U8 _GetPixel(int x, int y) {
#if LCD_BITSPERPIXEL == 1
unsigned int Off = y*LCD_BYTESPERLINE+(x>>3);
U8 Data = (LCD_VRam[0][Off] >> (7-(x&7))) &1;
return Data;
#elif LCD_BITSPERPIXEL == 2
unsigned int Off = y*LCD_BYTESPERLINE+(x>>3);
U8 Data = (LCD_VRam[0][Off] >> (7-(x&7))) &1;
Data |= ((LCD_VRam[1][Off] >> (7-(x&7)))<<1) &2;
return Data;
#else
#error Colordepth not supported by this driver !
#endif
}
static void XorPixel (int x, int y) {
PIXELCOLOR Index = _GetPixel(x,y);
Index = LCD_NUM_COLORS-1-Index;
SetPixelPhys(x,y,Index);
}
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -