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

📄 lcdslin.c

📁 2410LCD驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
*********************************************************************************************************
*                                                礐/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()
#endif

static 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
#endif

static 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 + -