📄 lcdlib.c
字号:
void Lcd_MoveViewPort(int vx,int vy,int type)
{
U32 addr;
switch(type)
{
// LCDBASEU,LCDBASEL register has to be changed before 12 words before the end of VLINE.
// In mono mode, x=320 is 10 words, So, We can't change LCDBASEU,LCDBASEL
// during LINECNT=1~0 at mono mode.
// The processor mode should be superviser mode.
case MODE_STN_1BIT:
case MODE_CSTN_1BIT_P:
SET_IF();
#if (LCD_XSIZE_STN<512)
while((rLCDCON1>>18)<=1); // if x<512
#else
while((rLCDCON1>>18)==0); // if x>512 ((12+4)*32)
#endif
addr=(U32)frameBuffer1Bit+(vx/8)+vy*(SCR_XSIZE_STN/8);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D( ((addr+(SCR_XSIZE_STN*LCD_YSIZE_STN/8))>>1) );
CLR_IF();
break;
case MODE_STN_2BIT:
case MODE_CSTN_2BIT_P:
SET_IF();
#if (LCD_XSIZE_STN<256)
while((rLCDCON1>>18)<=1); // if x<256
#else
while((rLCDCON1>>18)==0); // if x>256
#endif
addr=(U32)frameBuffer2Bit+(vx/4)+vy*(SCR_XSIZE_STN/4);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_STN*LCD_YSIZE_STN/4))>>1));
CLR_IF();
break;
case MODE_STN_4BIT:
case MODE_CSTN_4BIT_P:
SET_IF();
#if (LCD_XSIZE_STN<128)
while((rLCDCON1>>18)<=1); // if x<128
#else
while((rLCDCON1>>18)==0); // if x>128
#endif
addr=(U32)frameBuffer4Bit+(vx/2)+vy*(SCR_XSIZE_STN/2);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_STN*LCD_YSIZE_STN/2))>>1));
CLR_IF();
break;
case MODE_CSTN_8BIT:
case MODE_CSTN_8BIT_P:
SET_IF();
#if (LCD_XSIZE_CSTN<64)
while((rLCDCON1>>18)<=1); // if x<64
#else
while((rLCDCON1>>18)==0); // if x>64
#endif
addr=(U32)frameBuffer8Bit+(vx/1)+vy*(SCR_XSIZE_CSTN/1);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN))>>1));
CLR_IF();
break;
case MODE_CSTN_12BIT:
SET_IF();
#if (LCD_XSIZE_CSTN<32)
while((rLCDCON1>>18)<=1); // if x<32
#else
while((rLCDCON1>>18)==0); // if x>32
#endif
addr=(U32)frameBuffer12Bit+(vx*2)+vy*(SCR_XSIZE_CSTN*2); // Move 6Byte(4pixel)
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN*2))>>1));
CLR_IF();
break;
case MODE_CSTN_16BIT:
SET_IF();
#if (LCD_XSIZE_CSTN<32)
while((rLCDCON1>>18)<=1); // if x<32
#else
while((rLCDCON1>>18)==0); // if x>32
#endif
addr=(U32)frameBuffer16Bit+(vx*2)+vy*(SCR_XSIZE_CSTN*2);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN*2))>>1));
CLR_IF();
break;
case MODE_TFT_1BIT_240320:
SET_IF();
#if (LCD_XSIZE_TFT_240320<512)
while((rLCDCON1>>18)<=1); // if x<512
#else
while((rLCDCON1>>18)==0); // if x>512
#endif
addr=(U32)frameBuffer8BitTft240320+(vx/8)+vy*(SCR_XSIZE_TFT_240320/8);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320/8))>>1));
CLR_IF();
break;
case MODE_TFT_8BIT_240320:
SET_IF();
#if (LCD_XSIZE_TFT_240320<64)
while((rLCDCON1>>18)<=1); // if x<64
#else
while((rLCDCON1>>18)==0); // if x>64
#endif
addr=(U32)frameBuffer8BitTft240320+(vx/1)+vy*(SCR_XSIZE_TFT_240320/1);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320))>>1));
CLR_IF();
break;
case MODE_TFT_16BIT_240320:
SET_IF();
#if (LCD_XSIZE_TFT_240320<32)
while((rLCDCON1>>18)<=1); // if x<32
#else
while((rLCDCON1>>18)==0); // if x>32
#endif
addr=(U32)frameBuffer16BitTft240320+(vx*2)+vy*(SCR_XSIZE_TFT_240320*2);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1));
CLR_IF();
break;
case MODE_TFT_24BIT_240320:
SET_IF();
#if (LCD_XSIZE_TFT_240320<16)
while((rLCDCON1>>18)<=1); // if x<16
#else
while((rLCDCON1>>18)==0); // if x>16
#endif
addr=(U32)frameBuffer24BitTft240320+(vx*4)+vy*(SCR_XSIZE_TFT_240320*4);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*4))>>1));
CLR_IF();
break;
case MODE_TFT_16BIT_320240:
SET_IF();
#if (LCD_XSIZE_TFT_320240<32)
while((rLCDCON1>>18)<=1); // if x<32
#else
while((rLCDCON1>>18)==0); // if x>32
#endif
addr=(U32)frameBuffer16BitTft320240+(vx*2)+vy*(SCR_XSIZE_TFT_320240*2);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*2))>>1));
CLR_IF();
break;
case MODE_TFT_24BIT_320240:
SET_IF();
#if (LCD_XSIZE_TFT_320240<16)
while((rLCDCON1>>18)<=1); // if x<16
#else
while((rLCDCON1>>18)==0); // if x>16
#endif
addr=(U32)frameBuffer24BitTft320240+(vx*4)+vy*(SCR_XSIZE_TFT_320240*4);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*4))>>1));
CLR_IF();
break;
default:
break;
}
}
void SetGPIOforLDI(void)
{
#ifdef V14
//GPIO Configuration for setting LDI
rGPBDN |= (0x1<<6);
rGPGDN |= (0x7<<5);
rGPBDAT |= (0x1<<6);
rGPGDAT |= (0x7<<5);
rGPBCON = (rGPBCON & ~(0x3<<12))|(0x1<<12);
rGPGCON = (rGPGCON & ~(0x3f<<10))|(0x15<<10);
#else
//GPIO Configuration for setting LDI
rGPEDN |= (0x3<<12);
rGPGDN |= (0x1<<2);
rGPEDAT |= (0x3<<12);
rGPGDAT |= (0x1<<2);
rGPECON = (rGPECON & ~(0xf<<24))|(0x5<<24);
rGPGCON = (rGPGCON & ~(0x3<<4))|(0x1<<4);
#endif
}
void delayLoop(int count)
{
int j;
for(j = 0; j < count; j++) ;
}
void WriteLDI_LTS350(int address, int data)
{
unsigned char dev_id_code=0x1D;
int j;
//unsigned char DELAY=50;
unsigned char DELAY=100;
LCD_DEN_Hi; // EN = High CS high
LCD_DCLK_Hi; // SCL High
LCD_DSERI_Hi; // Data Low
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
for (j = 5; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((dev_id_code >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
// RS = "0" : index data
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
// Write
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
for (j = 15; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((address >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
LCD_DSERI_Hi;
delayLoop(DELAY);
LCD_DEN_Hi; // EN = High
delayLoop(DELAY*10);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
for (j = 5; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((dev_id_code >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
// RS = "1" instruction data
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Hi;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
// Write
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
for (j = 15; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((data >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
LCD_DEN_Hi; // EN = High
delayLoop(DELAY);
}
void WriteLDI_LTS222(int address, int data)
{
int j;
//unsigned char DELAY=100;
unsigned char DELAY=10;
LCD_DEN_Hi; // EN = High CS high
// LCD_DCLK_Lo;
LCD_DCLK_Hi; // SCL High
LCD_DSERI_Lo; // Data Low
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
LCD_DCLK_Lo; // SCL Low
delayLoop(DELAY);
for (j = 7; j >= 0; j--)
{
if ((address >> j) & 0x0001) // DATA HIGH or LOW
LCD_DSERI_Hi;
else
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
if(j != 0)
{
LCD_DCLK_Lo;
delayLoop(DELAY); // CLOCK = Low
}
}
LCD_DSERI_Lo; // Data Low
delayLoop(DELAY);
LCD_DEN_Hi; // EN = High
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low
delayLoop(DELAY);
LCD_DCLK_Lo;
delayLoop(DELAY); // CLOCK = Low
for (j = 7; j >= 0; j--)
{
if ((data >> j) & 0x0001) // DATA HIGH or LOW
LCD_DSERI_Hi;
else
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
if(j != 0)
{
LCD_DCLK_Lo;
delayLoop(DELAY); // CLOCK = Low
}
}
LCD_DEN_Hi; // EN = High
delayLoop(DELAY);
}
void InitLDI_LTV350(void)
{
SetGPIOforLDI();
#ifdef V14
// LCD Reset
rGPGDAT |= (1<<0); // Reset High
rGPGCON &= ~(3<<0);
rGPGCON |= (1<<0);
Delay(500);
rGPGDAT &= ~(1<<0); // Reset Low
Delay(1000);
//Delay(100);
rGPGDAT |= (1<<0); // Reset High
Delay(100);
#else
LCD_RESET_Hi;
Delay(500);
LCD_RESET_Lo;
Delay(1000);
LCD_RESET_Hi;
Delay(100);
#endif
LCD_DEN_Hi;
LCD_DCLK_Hi;
LCD_DSERI_Hi;
Delay(10);
WriteLDI_LTS350(0x09,0x0000);
Delay(200); // more than 10ms
WriteLDI_LTS350(0x09,0x4000);
WriteLDI_LTS350(0x0a,0x2000);
WriteLDI_LTS350(0x09,0x4055);
Delay(1000); // more than 50ms
WriteLDI_LTS350(0x01,0x409d);
WriteLDI_LTS350(0x02,0x0204); // note 1
WriteLDI_LTS350(0x03,0x0100);
WriteLDI_LTS350(0x04,0x3000);
WriteLDI_LTS350(0x05,0x4003);
WriteLDI_LTS350(0x06,0x000a); // note 2 060707
WriteLDI_LTS350(0x07,0x0021); // note 2 060707
WriteLDI_LTS350(0x08,0x0c00);
WriteLDI_LTS350(0x10,0x0103);
WriteLDI_LTS350(0x11,0x0301);
WriteLDI_LTS350(0x12,0x1f0f);
WriteLDI_LTS350(0x13,0x1f0f);
WriteLDI_LTS350(0x14,0x0707);
WriteLDI_LTS350(0x15,0x0307);
WriteLDI_LTS350(0x16,0x0707);
WriteLDI_LTS350(0x17,0x0000);
WriteLDI_LTS350(0x18,0x0004);
WriteLDI_LTS350(0x19,0x0000);
Delay(1000); // more than 2 frames
WriteLDI_LTS350(0x09,0x4a55);
WriteLDI_LTS350(0x05,0x5003);
}
void InitLDI_LTS222(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -