📄 lcdslin.c
字号:
/*********************************************************************************************************** 礐/GUI* Universal graphic software for embedded applications** (c) Copyright 2002, Micrium Inc., Weston, FL* (c) Copyright 2000, 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 : LCDSLin.C* Purpose : Driver for LCDs using simple bus interface* * Currently supported controllers:* * Toshiba T6963* Epson SED1330* Epson SED1335* * * Version-Date---Author-Explanation* * 2.00g 020319 JE a) Macro changed to fix NC30-error* 2.00f 020204 JE a) Hardwareinterface routines renamed:* ...DATA -> ...A0, ...CMD -> ...A1* 2.00e 011112 JE a) LCD_INIT_CONTROLLER added to be able to* execute LCD_X_Init during init* 2.00d 010926 JE a) Support for LCD_SWAP_XY added* 2.00c 010706 JE a) Bugfix in DrawBitLine1BPP* 2.00b 010402 RS a) LCD_GetDevCaps removed from driver* (now LCD.c)* 2.00a 008026 RS a) Simulation interface changed* 2.00 000525 JE a) Interface changed* 1.02c 000509 JE a) Simple bus interface changed for SED133x* b) Small changes in DrawBitLine1BPP* c) Cache initialisation to SED133x added* 1.02b 000508 JE a) Simple bus interface changed for T6963* 1.02a 000426 JE a) Transparent mode in DrawBitLine1BPP changed* b) Dummy LCD_L0_SetLUTEntry inserted* 1.02 000426 RS a) Changes for new LCD-driver interface V1.30* 1.00a 000410 JE a) LCD_GetDevCap changed* b) LCD_GetpCapFunc deleted* c) LCD_DrawBitMap changed* d) Definition for aColorIndex changed* 1.00 000407 JE First release** ---------------------------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_OPTIMIZE Controls the use of optimized routines.* * Known problems or limitations with current version* * None.**********************************************************************************************************/#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 == 6963) || (LCD_CONTROLLER == 1330) || (LCD_CONTROLLER == 1335) \ && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))/* ******************************************************************** * * * Conversion table * * *********************************************************************/static const LCD_PIXELINDEX LCD_ConversionTable[2] = {0, 1};/* ********************************************************* * * * Defaults for configuration * * * **********************************************************/#ifndef LCD_OPTIMIZE #define LCD_OPTIMIZE (1)#endif#ifndef LCD_CHECKBUSY #define LCD_CHECKBUSY (1)#endif#ifndef LCD_INIT #define LCD_INIT()#endif#ifndef LCD_WATCHDOG_TRIGGERCNT #define LCD_WATCHDOG_TRIGGERCNT (0)#endif#ifndef LCD_KICK_WATCHDOG #define LCD_KICK_WATCHDOG()#endif#ifndef LCD_CACHE #define LCD_CACHE (1)#endif#ifndef LCD_SUPPORT_REFRESH #define LCD_SUPPORT_REFRESH LCD_CACHE#endif#ifndef LCD_REVERSEMODE_SUPPORT #define LCD_REVERSEMODE_SUPPORT (0)#endif#ifndef LCD_SUPPORT_VERIFY #define LCD_SUPPORT_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#ifndef LCD_SCHEDULE_CNT #define LCD_SCHEDULE_CNT (0)#endif#ifndef LCD_NUM_CONTROLLERS #define LCD_NUM_CONTROLLERS (1)#endif#ifndef LCD_SUPPORT_CHECKINIT #define LCD_SUPPORT_CHECKINIT (0)#endif/* Switch support for the LCD_CopyRect function of the driver */#ifndef LCD_SUPPORT_COPYRECT #define LCD_SUPPORT_COPYRECT (1)#endif#ifndef LCD_INIT_CONTROLLER #define LCD_INIT_CONTROLLER()#endif/* ********************************************************* * * * Internal types * * * **********************************************************/#if LCD_BITSPERPIXEL == 1 #define PIXELCOLOR U8#else #error LCD_BITSPERPIXEL != 1 not supported#endif/* ********************************************************* * * * Configuration switch checking * * * *********************************************************Please be aware that not all configuration errors can be captured !*//* Check number of controllers */#if (LCD_NUM_CONTROLLERS != 1) #error "Only 1 controller supported by this driver"#endif/* ********************************************************* * * Defines for simulation * **********************************************************/#ifdef WIN32 #undef LCD_WRITE_A0 #undef LCD_WRITE_A1 #undef LCD_READ_A0 #undef LCD_READ_A1 void SIM_WriteA1C0(U8 data); void SIM_WriteA0C0(U8 cmd); U8 SIM_ReadA1C0(void); U8 SIM_ReadA0C0(void); #define LCD_WRITE_A1(data) SIM_WriteA1C0(data) #define LCD_WRITE_A0(cmd) SIM_WriteA0C0(cmd) #define LCD_READ_A1() SIM_ReadA1C0() #define LCD_READ_A0() SIM_ReadA0C0()#endif/* ********************************************************* * * * Standard variables for driver * * * **********************************************************/static U8 Cache[((LCD_XSIZE_PHYS+7)>>3)*LCD_YSIZE_PHYS];#if LCD_WATCHDOG_TRIGGERCNT int WatchdogTriggerCnt;#endif#if LCD_SUPPORT_VERIFY static int ErrCnt; static int ErrStat;#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 LCD_TYPE_COMTRANS LCD__aLine2Com0[LCD_LASTCOM0-LCD_FIRSTCOM0+1];#endif#if LCD_SUPPORT_SEGTRANS extern LCD_TYPE_SEGTRANS LCD__aRow2Seg0[LCD_LASTSEG0-LCD_FIRSTSEG0+1];#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) _SetPixel(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) _SetPixel(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) _SetPixel(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) _SetPixel(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) _SetPixel(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) _SetPixel(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) _SetPixel(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) _SetPixel(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) _SetPixel(y,LCD__aLine2Com0[x], c) #define GETPIXEL(x, y) _GetPixel(y,LCD__aLine2Com0[x]) #define XORPIXEL(x, y) XorPixel(y,LCD__aLine2Com0[x]) #endif#elif (!LCD_SUPPORT_COMTRANS && LCD_SUPPORT_SEGTRANS) #if (!LCD_SWAP_XY) #define SETPIXEL(x, y, c) _SetPixel(LCD__aRow2Seg0[x],y, c) #define GETPIXEL(x, y) _GetPixel(LCD__aRow2Seg0[x],y) #define XORPIXEL(x, y) XorPixel(LCD__aRow2Seg0[x],y) #else #define SETPIXEL(x, y, c) _SetPixel(LCD__aRow2Seg0[y],x, c) #define GETPIXEL(x, y) _GetPixel(LCD__aRow2Seg0[y],x) #define XORPIXEL(x, y) XorPixel(LCD__aRow2Seg0[y],x) #endif#elif (LCD_SUPPORT_COMTRANS && LCD_SUPPORT_SEGTRANS) #if (!LCD_SWAP_XY) #define SETPIXEL(x, y, c) _SetPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y], c) #define GETPIXEL(x, y) _GetPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y]) #define XORPIXEL(x, y) XorPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y]) #else #define SETPIXEL(x, y, c) _SetPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x], c) #define GETPIXEL(x, y) _GetPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x]) #define XORPIXEL(x, y) XorPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x]) #endif#else #error This combination of switches not yet supported#endif#define XY2OFF(x,y) ((x>>3)+y*((LCD_XSIZE_PHYS+7)>>3))#define BKCOLOR LCD_BKCOLORINDEX#define COLOR LCD_COLORINDEX/* ********************************************************* * * * ID translation table * * * *********************************************************This table contains 0, 1, 2, ... and serves as translation table for DDBs*/static const U8 TransId[] = { 0,1 };/* ********************************************************* * * * LCD Access * * * **********************************************************/int LCD_Adr;#if (!LCD_CHECKBUSY) #define LCD_WAIT()#endifstatic U8 result; /* Possibly needed for access macro *//* ********************************************************* * * * LCD Access Controller SED133x * * * **********************************************************/#if (LCD_CONTROLLER == 1330) \ ||(LCD_CONTROLLER == 1335)/* Remap ...A0, ...A1 -> ...CMD, ...DATA */#define LCD_READCMD0 LCD_READ_A0#define LCD_READDATA0 LCD_READ_A1#define LCD_WRITECMD0 LCD_WRITE_A1#define LCD_WRITEDATA0 LCD_WRITE_A0#ifndef LCD_EXTENDED_WAIT #define LCD_EXTENDED_WAIT 1#endif#ifndef LCD_WAIT #define LCD_WAIT() \ while (!(LCD_READCMD0()&0x40)); \ while ( LCD_READCMD0()&0x40) ;#endif#if LCD_EXTENDED_WAIT #define LCD_WRITECMD(cmd) { LCD_WAIT(); LCD_WRITECMD0(cmd); } #define LCD_WRITEDATA(data) { LCD_WAIT(); LCD_WRITEDATA0(data);}#else #define LCD_WRITECMD(cmd) { LCD_WRITECMD0(cmd); } #define LCD_WRITEDATA(data) { LCD_WRITEDATA0(data);}#endif#define GSTART (0x0)#if (LCD_YSIZE_PHYS >128) #define TSTART 30000#else #define TSTART 7000#endifstatic void LCD_SetSystem(void) { LCD_WRITECMD (0x40); LCD_WRITEDATA(0x30); /* P1 */ LCD_WRITEDATA(0x87); /* P2 : FX : hor. char size-1 */ LCD_WRITEDATA(0x7); /* P3 : FY : ver. char size-1 (not imp.) */ LCD_WRITEDATA(((LCD_XSIZE_PHYS+7)>>3)-1); /* P4 : Characters per row */ LCD_WRITEDATA(0x4a); /* P5 : Timing charcters per row */ LCD_WRITEDATA(LCD_YSIZE_PHYS-1); /* P6 : Number of lines per screen */ LCD_WRITEDATA((LCD_XSIZE_PHYS+7)>>3); /* P7 : Address pitch low */ LCD_WRITEDATA(0x00); /* P8 : Address pitch high */}static void LCD_SetScroll(int Adr) { LCD_WRITECMD(0x44); LCD_WRITEDATA(TSTART&255); /* address of screen 1 (text) */ LCD_WRITEDATA(TSTART>>8); LCD_WRITEDATA((LCD_YSIZE_PHYS)-1); LCD_WRITEDATA(Adr); /* address of screen 2 (graphic) */ LCD_WRITEDATA(Adr>>8); LCD_WRITEDATA((LCD_YSIZE_PHYS)-1);}static void LCD_SetAdr(int Off) { LCD_Adr=Off; #if (!LCD_EXTENDED_WAIT) LCD_WAIT(); #endif LCD_WRITECMD (0x46); LCD_WRITEDATA(Off&255); LCD_WRITEDATA(Off>>8);}#define LCD_SETADR(Off) LCD_SetAdr(Off)static void LCD_Write1(char Byte) { #if (!LCD_EXTENDED_WAIT) LCD_WAIT(); #endif LCD_WRITECMD (0x42); LCD_WRITEDATA(Byte); LCD_Adr++;}#define LCD_WRITE1(Byte) LCD_Write1(Byte)/* LCD_L0_ReInit */void LCD_L0_ReInit(void) { int i; LCD_INIT_CONTROLLER(); LCD_SetSystem(); LCD_SetScroll(GSTART) ; LCD_WRITECMD (0x4c); /* Set cursor move direction */ LCD_WRITECMD (0x5a); /* HDOT SCR : Set horiz. scroll position */ LCD_WRITEDATA(0); LCD_WRITECMD (0x5b); /* OVLAY */ LCD_WRITEDATA(1); /* Clear display memory */ LCD_SETADR(0); LCD_WRITECMD (0x42); #if (LCD_YSIZE_PHYS >128) for (i=0; i<32000; i++) #else for (i=0; i<8000; i++) #endif LCD_WRITEDATA(0); #if (LCD_REVERSE) LCD_SETADR(GSTART); LCD_WRITECMD (0x42); for (i=GSTART; i<GSTART+((LCD_XSIZE_PHYS+7)>>3)*LCD_YSIZE_PHYS; i++) LCD_WRITEDATA(0xff); #endif if(COLOR) memset(Cache,0xff,sizeof(Cache)); else memset(Cache,0x0,sizeof(Cache)); LCD_WRITECMD (0x59); /* Display on */ LCD_WRITEDATA(0x14); /* All screens on, curosr off */}/* LCD_FirstInit */static void LCD_FirstInit(void) { LCD_L0_ReInit();}#endif /* SED133x *//* ********************************************************* * * * LCD Access Controller T6963 * * * **********************************************************/#if (LCD_CONTROLLER == 6963)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -