📄 drv_1215.c
字号:
/************************************************************************
* *
* Copyright (C) SEIKO EPSON CORP. 2002 *
* *
* File name: Drv_1215.c *
* This is Epson S1D13706 LCD controller driver for L1F01215T13 *
* under Epson E0C33000 platform. *
* *
* *
* Revision history *
* 2002-7-19 Andrew Yin Start. *
* *
************************************************************************/
#include "Drv_1215.h"
extern unsigned char IMAGE1_4BPP, IMAGE2_4BPP, IMAGE3_4BPP;
static const unsigned char ASCIIchar[ ] = /* 8*8 dot matrix ASCII Character (Rotate 90 degree)*/
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ASCII "SPACE" Decimal:32 Hexadecimal:20 */
0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00,
0x00,0x14,0x7f,0x14,0x7f,0x14,0x00,0x00,
0x00,0x24,0x2a,0x7f,0x2a,0x12,0x00,0x00,
0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00,
0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00,
0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x1c,0x22,0x41,0x00,0x00,0x00,
0x00,0x00,0x41,0x22,0x1c,0x00,0x00,0x00,
0x00,0x14,0x08,0x3e,0x08,0x14,0x00,0x00,
0x00,0x08,0x08,0x3e,0x08,0x08,0x00,0x00,
0x00,0x00,0x50,0x30,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,
0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,
0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00,
0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00, /* 0 */
0x00,0x00,0x42,0x7f,0x40,0x00,0x00,0x00,
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00,
0x00,0x21,0x41,0x45,0x4b,0x31,0x00,0x00,
0x00,0x18,0x14,0x12,0x7f,0x10,0x00,0x00,
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,
0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00,
0x00,0x01,0x01,0x79,0x05,0x03,0x00,0x00,
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,
0x00,0x06,0x49,0x49,0x29,0x1e,0x00,0x00, /* 9 */
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,
0x00,0x00,0x56,0x36,0x00,0x00,0x00,0x00,
0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00,
0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,
0x00,0x00,0x41,0x22,0x14,0x08,0x00,0x00,
0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00,
0x00,0x32,0x49,0x79,0x41,0x3e,0x00,0x00,
0x00,0x7e,0x11,0x11,0x11,0x7e,0x00,0x00, /* A */
0x00,0x41,0x7f,0x49,0x49,0x36,0x00,0x00,
0x00,0x3e,0x41,0x41,0x41,0x22,0x00,0x00,
0x00,0x41,0x7f,0x41,0x41,0x3e,0x00,0x00,
0x00,0x7f,0x49,0x49,0x49,0x49,0x00,0x00,
0x00,0x7f,0x09,0x09,0x09,0x01,0x00,0x00,
0x00,0x3e,0x41,0x41,0x49,0x7a,0x00,0x00,
0x00,0x7f,0x08,0x08,0x08,0x7f,0x00,0x00,
0x00,0x00,0x41,0x7f,0x41,0x00,0x00,0x00,////////////////////////////////I
0x00,0x20,0x40,0x41,0x3f,0x01,0x00,0x00,
0x00,0x7f,0x08,0x14,0x22,0x41,0x00,0x00,
0x00,0x7f,0x40,0x40,0x40,0x40,0x00,0x00,
0x00,0x7f,0x02,0x0c,0x02,0x7f,0x00,0x00,
0x00,0x7f,0x06,0x08,0x30,0x7f,0x00,0x00,
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,
0x00,0x7f,0x09,0x09,0x09,0x06,0x00,0x00,
0x00,0x3e,0x41,0x51,0x21,0x5e,0x00,0x00,
0x00,0x7f,0x09,0x19,0x29,0x46,0x00,0x00,
0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00,
0x00,0x01,0x01,0x7f,0x01,0x01,0x00,0x00,
0x00,0x3f,0x40,0x40,0x40,0x3f,0x00,0x00,
0x00,0x1f,0x20,0x40,0x20,0x1f,0x00,0x00,
0x00,0x7f,0x20,0x18,0x20,0x7f,0x00,0x00,
0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00,
0x00,0x07,0x08,0x70,0x08,0x07,0x00,0x00,
0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00, /* Z */
0x00,0x00,0x7f,0x41,0x41,0x00,0x00,0x00,
0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00,
0x00,0x00,0x41,0x41,0x7f,0x00,0x00,0x00,
0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00,
0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00,
0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00,
0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00, /* a */
0x00,0x7f,0x48,0x44,0x44,0x38,0x00,0x00,
0x00,0x38,0x44,0x44,0x44,0x20,0x00,0x00,
0x00,0x38,0x44,0x44,0x48,0x7f,0x00,0x00,
0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00,//e
0x00,0x00,0x08,0x7e,0x09,0x02,0x00,0x00,
0x00,0x0c,0x52,0x52,0x4c,0x3e,0x00,0x00,//g
0x00,0x7f,0x08,0x04,0x04,0x78,0x00,0x00,
0x00,0x00,0x44,0x7d,0x40,0x00,0x00,0x00,
0x00,0x20,0x40,0x44,0x3d,0x00,0x00,0x00,
0x00,0x00,0x7f,0x10,0x28,0x44,0x00,0x00,
0x00,0x00,0x41,0x7f,0x40,0x00,0x00,0x00,//l
0x00,0x7c,0x04,0x78,0x04,0x78,0x00,0x00,
0x00,0x7c,0x08,0x04,0x04,0x78,0x00,0x00,
0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00,
0x00,0x7e,0x0c,0x12,0x12,0x0c,0x00,0x00,
0x00,0x0c,0x12,0x12,0x0c,0x7e,0x00,0x00,
0x00,0x7c,0x08,0x04,0x04,0x08,0x00,0x00,
0x00,0x48,0x54,0x54,0x54,0x20,0x00,0x00,
0x00,0x04,0x3f,0x44,0x40,0x20,0x00,0x00,
0x00,0x3c,0x40,0x40,0x3c,0x40,0x00,0x00,
0x00,0x1c,0x20,0x40,0x20,0x1c,0x00,0x00,
0x00,0x3c,0x40,0x30,0x40,0x3c,0x00,0x00,
0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00,
0x00,0x0c,0x50,0x50,0x50,0x3c,0x00,0x00,
0x00,0x44,0x64,0x54,0x4c,0x44,0x00,0x00, /* z */
0x00,0x00,0x08,0x36,0x41,0x00,0x00,0x00,
0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00,
0x00,0x00,0x41,0x36,0x08,0x00,0x00,0x00,
0x00,0x02,0x01,0x02,0x04,0x02,0x00,0x00,
0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00
};
/* API functions */
void vInitLCDL1F01215T13( void );
void vL1F01215TClr( void );
void vL1F01215TSetPixel(unsigned short usX, unsigned char ucY, unsigned char ucPixelGray );
unsigned char ucL1F01215TGetPixel( unsigned short usX, unsigned char ucY );
void vL1F01215TDrawLine(unsigned short usX1, unsigned char ucY1, unsigned short usX2,
unsigned char ucY2, unsigned char ucGray );
void vL1F01215TDrawASCII( unsigned char ucASCIIX, unsigned char ucASCIIY,
unsigned char ASCII, unsigned char ucGray);
void vL1F01215TDrawString( unsigned char ucASCIIX, unsigned char ucASCIIY,
unsigned char *string, unsigned char ucGray );
void vPutImage( unsigned char *P, unsigned short usWidth, unsigned short usHeight );
// functions formed as _functionname are used inside only and should not exposed to outside callers
void _DrawDiagonalLine( unsigned short usX1, unsigned char ucY1, unsigned short usX2,
unsigned char ucY2, unsigned char ucGray );
void _CheckAndCorrectPointPosition( unsigned short* uspX, unsigned char* ucpY );
void vVideoInvert( void );
void vEnableSubWindow( void );
void vDisableSubWindow( void );
void vSwivelView( unsigned short usAngle );
void vEnterPowerSaveMode( void );
void vExitPowerSaveMode( void );
unsigned char ExitDriver( void );
void vL1F01215TDemo( void );
void vDelay( void );
void vDelay1( void );
void _Test_DrawHorizontalStripe( void )
{
int nColumn =0 ;
int nLine =0 ;
unsigned char *pUchDispMem = ucpMemBaseAddr ;
unsigned char ddd;
for( nLine =0 ,ddd=0x05; nLine < 240 ; nLine++)
{
for(nColumn = 0; nColumn < LCD_SOLUTION_WIDTH / 8; nColumn++)
{
ddd=0x05;
*pUchDispMem++ = ddd;
*pUchDispMem++;
ddd = 0x0af;
*++pUchDispMem = ddd;
*pUchDispMem++;
}
}
}
void _Test_DrawVerticalStripe(void)
{
unsigned char i;
int nColumn =0 ;
int nLine =0 ;
unsigned short *pUshDispMem = uspMemBaseAddr ;
unsigned short ddd;
for( i = 0; i < 16; i++)
for( nLine =0 ,ddd=0x0 + 0x1111 * i; nLine < 15 ; nLine++)
{
for(nColumn = 0; nColumn < LCD_SOLUTION_WIDTH / 4; nColumn++)
{
*pUshDispMem++ = ddd;
}
}
}
/***********************************************************************************************
* vInitLCDL1F01215T13
* Type : void
* Ret val : none
* Argument : void
* Function : L1F01215T13 LCD initial routine
***********************************************************************************************/
void vInitLCDL1F01215T13(void)
{
unsigned char ucRegCount;
unsigned char i;
// Initial the MCU #WAIT pin
*( volatile unsigned char * )0x402DC |= 0x01;
// Enable Blank Display
MACRO_ENABLE_BLANK_DISPLAY();
ucRegCount = sizeof( S1D13706Mode ) / sizeof( REG_INIT_ITEM );
for( i =0 ; i < ucRegCount; i++ )
*( ucpRegBaseAddr + ( S1D13706Mode[ i ].ushIndex )) = S1D13706Mode[ i ].uchValue ;
// Disable "blanking" display
MACRO_DISABLE_BLANK_DISPLAY();
vExitPowerSaveMode( );
// after delay for 40 milli-seconds Power Up LCD
vDelay( );
MACRO_ENABLE_LCD_PANEL();
S1D_WRITE_PALETTE( ucpRegBaseAddr, 0, 0, 0, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 1, 0, 0x10, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 2, 0, 0x20, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 3, 0, 0x30, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 4, 0, 0x44, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 5, 0, 0x54, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 6, 0, 0x64, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 7, 0, 0x74, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 8, 0, 0x88, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 9, 0, 0x98, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 10, 0, 0x0A8, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 11, 0, 0x0B8, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 12, 0, 0x0CC, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 13, 0, 0x0DC, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 14, 0, 0x0EC, 0 );
S1D_WRITE_PALETTE( ucpRegBaseAddr, 15, 0, 0x0FC, 0 );
vL1F01215TDemo();
}
void vDisableSubWindow( void )
{
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR0 ) = ( unsigned char )0x7F;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR1 ) = ( unsigned char )0x25;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR2 ) = ( unsigned char )0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET0 ) = ( unsigned char )0x28;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET1 ) = ( unsigned char )0x00;
}
void vEnableSubWindow( void )
{
// enable sub-window
//*( volatile unsigned char * )( REGISTER_OFFSET + REG_SPECIAL_EFFECTS ) |= ( unsigned char )0x10;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR0 ) = ( unsigned char )0x6f;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR1 ) = ( unsigned char )0x3f;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR2 ) = ( unsigned char )0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET0 ) = ( unsigned char )0x4B;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET1 ) = ( unsigned char )0x00;
// Sub-window display start address
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_DISP_START_ADDR0 ) = 0x7f;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_DISP_START_ADDR1 ) = 0x25;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_DISP_START_ADDR2 ) = 0x00;
// Sub-window Line address offset
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_ADDR_OFFSET0 ) = 0x28;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_ADDR_OFFSET1 ) = 0x00;
// Sub-window X start position
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_X_START_POS0 ) = 40;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_X_START_POS1 ) = 0x00;
// Sub-window Y start position
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_Y_START_POS0 ) = 240;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_Y_START_POS1 ) = 0x00;
// Sub-window X end position
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_X_END_POS0 ) = 0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_X_END_POS1 ) = 0x00;
// Sub-window Y end position
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_Y_END_POS0 ) = 0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SUB_WIN_Y_END_POS1 ) = 0x00;
}
/***********************************************************************************************
* ExitDriver
* Type: unsigned char
* Ret val: none
* Argument: none
* Function: Power off the LCD
***********************************************************************************************/
unsigned char ExitDriver( void )
{
unsigned short i;
MACRO_DISABLE_LCD_PANEL();
// after delay for 10 Micro-seconds stop all LCD input signal
for( i = 0; i < 5000; i++ )
asm(" nop ");
MACRO_ENABLE_BLANK_DISPLAY();
vEnterPowerSaveMode( );
return true;
}
/***********************************************************************************************
* vPutImage
* Type: void
* Ret val: none
* Argument: unsigned char *p: Image data point
* unsigned short usWidth: Image width
* unsigned short usHeight: Image height
* Function: Power off the LCD
***********************************************************************************************/
void vPutImage( unsigned char *p, unsigned short usWidth, unsigned short usHeight )
{
unsigned short *uspTmpDispMem = uspMemBaseAddr;
unsigned long i;
unsigned short *pp = ( unsigned short * )p;
for( i = 0; i < usWidth / 8 * BPP * usHeight / 2; i++ )
*uspTmpDispMem++ = *pp++;
}
/***********************************************************************************************
* vVideoInvert
* Type : void
* Ret val : none
* Argument : none
* Function : Invert the LCD
***********************************************************************************************/
void vVideoInvert( void )
{
*( volatile unsigned char * )( REGISTER_OFFSET + REG_DISPLAY_MODE ) |= ( unsigned char )0x10;
}
/***********************************************************************************************
* vSwivelView
* Type : void
* Ret val : none
* Argument : unsigned short usAngle: 90; 180; 270.
* Function : LCD display rotation
***********************************************************************************************/
void vSwivelView( unsigned short usAngle )
{
switch( usAngle )
{
case 90:
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SPECIAL_EFFECTS ) &= ( unsigned char )0x0FC;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SPECIAL_EFFECTS ) |= ( unsigned char )0x01;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR0 ) = ( unsigned char )0x1d;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR1 ) = ( unsigned char )0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR2 ) = ( unsigned char )0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET0 ) = ( unsigned char )0x1e;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET1 ) = ( unsigned char )0x00;
break;
case 180:
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SPECIAL_EFFECTS ) &= ( unsigned char )0x0FC;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SPECIAL_EFFECTS ) |= ( unsigned char )0x02;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR0 ) = ( unsigned char )0x7f;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR1 ) = ( unsigned char )0x25;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR2 ) = ( unsigned char )0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET0 ) = ( unsigned char )0x28;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET1 ) = ( unsigned char )0x00;
break;
case 270:
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SPECIAL_EFFECTS ) &= ( unsigned char )0x0FC;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_SPECIAL_EFFECTS ) |= ( unsigned char )0x03;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR0 ) = ( unsigned char )0x62;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR1 ) = ( unsigned char )0x25;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_DISP_START_ADDR2 ) = ( unsigned char )0x00;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET0 ) = ( unsigned char )0x1e;
*( volatile unsigned char * )( REGISTER_OFFSET + REG_MAIN_WIN_ADDR_OFFSET1 ) = ( unsigned char )0x00;
break;
default:
break;
}
}
/***********************************************************************************************
* vEnterPowerSaveMode
* Type : void
* Ret val : none
* Argument : none
* Function : The S1D13706 enter power save mode
***********************************************************************************************/
void vEnterPowerSaveMode( void )
{
*( volatile unsigned char * )( REGISTER_OFFSET + 0x0a0 ) |= ( unsigned char )0x01;
}
/***********************************************************************************************
* vExitPowerSaveMode
* Type : void
* Ret val : none
* Argument : none
* Function : The S1D13706 exit power save mode
***********************************************************************************************/
void vExitPowerSaveMode( void )
{
*( volatile unsigned char * )( REGISTER_OFFSET + 0x0a0 ) &= ( unsigned char )0x0fe;
}
/***********************************************************************************************
* vL1F01215TClr
* Type : void
* Ret val : none
* Argument : none
* Function : Draw Clear the L1F01215T13 LCD screen pixel
***********************************************************************************************/
void vL1F01215TClr( void )
{
unsigned short *uspTmpDispMem = uspMemBaseAddr, i;
for( i= 0; i < ONE_LINE_SHORT_NUMBER * LCD_SOLUTION_HEIGHT; i++ )
*uspTmpDispMem ++ = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -