?? lcdlib.c
字號:
//rLCDSADDR1=(((U32)frameBuffer12Bit>>22)<<21)|M5D((U32)frameBuffer12Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer16Bit+((LCD_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3= (0<<11)|(LCD_XSIZE_CSTN);
rTPAL=0;
break;
default:
break;
}
}
/*
void Lcd_Palette_Init(void)
{
unsigned char cdata, p_red, p_green, p_blue;
U32 *palette;
palette=(U32 *)PALETTE;
*palette++=0; //black
for(cdata=1;cdata<255;cdata++)
{
p_red=(cdata & 0xe0);
p_green=(cdata & 0x1c);
p_blue=(cdata & 0x03);
*palette++=((U32)((p_red<<8)|(p_green<<6)|(p_blue<<3)));
}
*palette=0xffff; //white
}
*/
/*
void Lcd_CstnOnOff(int onoff)
{
// 1:CSTN Panel on 0:CSTN Panel off //
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
rGPBDN=rGPBDN|(1<<5); // Pull-up disable
rGPBDAT=rGPBDAT&(~(1<<5))|(onoff<<5); // GPB5=On or Off
rGPBCON=rGPBCON&(~(3<<10))|(1<<10); //GPD9=output
}
*/
void Lcd_EnvidOnOff(int onoff)
{
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}
void Lcd_CstnOnOff(int onoff)
{
// 1:CSTN Panel on 0:CSTN Panel off //
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
// rGPBDN=rGPBDN|(1<<5); // Pull-up disable
// rGPBDAT=rGPBDAT&(~(1<<5))|(onoff<<5); // GPB5=On or Off
// rGPBCON=rGPBCON&(~(3<<10))|(1<<10); //GPD9=output
}
/*
void Lcd_Lpc3600Enable(void)
{
//rTCONSEL&=~(7);
rTCONSEL=(rTCONSEL|7)&(~(1<<4)); // 240320,Enable LPC3600, Disable LCC3600
}
void Lcd_Lcc3600Enable(void)
{
rTCONSEL=(rTCONSEL|(1<<4))&(~1); // Enable LCC3600, Disable LPC3600
}
void Lcd_TconDisable(void)
{
rTCONSEL&=~((1<<4)|1); // Disable LCC3600, LPC3600
}
*/
void Lcd_PowerEnable(int invpwren,int pwren)
{
//Now, BACKLIGHT_PWM is always on. It should be changed to controlling PWM Timer @ September 24, 2005
rGPBDN |= 0x1;
rGPBDAT |= 0x1;
rGPGDN |= (1<<4);
rGPGDAT |= (1<<4);
rGPGCON = (rGPGCON & ~(0x3<<8))|(1<<8);
rGPBCON = (rGPBCON & ~(0x3<<10))|(0x1);
}
void Lcd_PowerEnableCstn(int type)
{
if(type == 1)
rGPBDAT |= (0x1<<5);
else
rGPBDAT &= ~(0x1<<5);
}
void MoveViewPort(int type)
{
int vx=0,vy=0,vd;
// minimum movement offset
vd= (type==MODE_STN_1BIT)*16+(type==MODE_STN_2BIT)*8+(type==MODE_STN_4BIT)*4
+(type==MODE_CSTN_8BIT)*2+(type==MODE_CSTN_12BIT)*4+(type==MODE_CSTN_12BIT_UP)*1+(type==MODE_CSTN_16BIT)*1
+(type==MODE_TFT_1BIT_240320)*16+(type==MODE_TFT_8BIT_240320)*2+(type==MODE_TFT_16BIT_240320)*1
+(type==MODE_TFT_1BIT_640480)*16+(type==MODE_TFT_8BIT_640480)*2+(type==MODE_TFT_16BIT_640480)*1+(type==MODE_TFT_24BIT_640480)/2
+(type==MODE_TFT_1BIT_800600)*16+(type==MODE_TFT_8BIT_800600)*2+(type==MODE_TFT_16BIT_800600)*1;
while(1)
{
switch(getchar())
{
case 'i':
if(vy>=vd)vy-=vd;
break;
case 'j':
if(vx>=vd)vx-=vd;
break;
case 'k':
//if((type==MODE_TFT_1BIT_800600)|(type==MODE_TFT_8BIT_800600)|(type==MODE_TFT_16BIT_800600))
if((type&0x4000)&&(type&0x400))
{
if(vx<=(SCR_XSIZE_TFT_800600-LCD_XSIZE_TFT_800600-vd))vx+=vd;
}
//else if((type==MODE_TFT_1BIT_640480)|(type==MODE_TFT_8BIT_640480)|(type==MODE_TFT_16BIT_640480)|(type==MODE_TFT_24BIT_640480))
else if((type&0x4000)&&(type&0x200))
{
if(vx<=(SCR_XSIZE_TFT_640480-LCD_XSIZE_TFT_640480-vd))vx+=vd;
}
//else if((type==MODE_TFT_8BIT_240320)|(type==MODE_TFT_16BIT_240320))
else if((type&0x4000)&&(type&0x100))
{
if(vx<=(SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320-vd))vx+=vd;
}
//else if((type==MODE_CSTN_8BIT)|(type==MODE_CSTN_12BIT))
else if(type&0x2000)
{
if(vx<=(SCR_XSIZE_CSTN-LCD_XSIZE_CSTN-vd))vx+=vd;
}
else
{
if(vx<=(SCR_XSIZE_STN-LCD_XSIZE_STN-vd))vx+=vd;
}
break;
case 'm':
if((type&0x4000)&&(type&0x400))
{
if(vy<=(SCR_YSIZE_TFT_800600-LCD_YSIZE_TFT_800600-vd))vy+=vd;
else if(vy==592)vy+=8;
}
else if((type&0x4000)&&(type&0x200))
{
if(vy<=(SCR_YSIZE_TFT_640480-LCD_YSIZE_TFT_640480-vd))vy+=vd;
}
else if((type&0x4000)&&(type&0x100))
{
if(vy<=(SCR_YSIZE_TFT_240320-LCD_YSIZE_TFT_240320-vd))vy+=vd;
}
else if(type&0x2000)
{
if(vy<=(SCR_YSIZE_CSTN-LCD_YSIZE_CSTN-vd))vy+=vd;
}
else
{
if(vy<=(SCR_YSIZE_STN-LCD_YSIZE_STN-vd))vy+=vd;
}
break;
case '\r':
return;
default:
break;
}
printf("vx=%3d,vy=%3d\n",vx,vy);
Lcd_MoveViewPort(vx,vy,type);
}
}
void Lcd_MoveViewPort(int vx,int vy,int type)
{
U32 addr;
switch(type)
{
case MODE_STN_1BIT:
// 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.
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:
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:
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:
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<43)
while((rLCDCON1>>18)<=1); // if x<43
#else
while((rLCDCON1>>18)==0); // if x>43
#endif
addr=(U32)frameBuffer12Bit+(vx*3/2)+vy*(SCR_XSIZE_CSTN*3/2); // Move 6Byte(4pixel)
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN*3/2))>>1));
CLR_IF();
break;
case MODE_CSTN_12BIT_UP:
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_1BIT_640480:
SET_IF();
#if (LCD_XSIZE_TFT_640480<512)
while((rLCDCON1>>18)<=1); // if x<512
#else
while((rLCDCON1>>18)==0); // if x>512 ((12+4)*32)
#endif
addr=(U32)frameBuffer1BitTft640480+(vx/8)+vy*(SCR_XSIZE_TFT_640480/8);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D( ((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480/8))>>1) );
CLR_IF();
break;
case MODE_TFT_8BIT_640480:
SET_IF();
#if (LCD_XSIZE_TFT_640480<64)
while((rLCDCON1>>18)<=1); // if x<64
#else
while((rLCDCON1>>18)==0); // if x>64
#endif
addr=(U32)frameBuffer8BitTft640480+(vx/1)+vy*(SCR_XSIZE_TFT_640480/1);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480))>>1));
CLR_IF();
break;
case MODE_TFT_16BIT_640480:
SET_IF();
#if (LCD_XSIZE_TFT_640480<32)
while((rLCDCON1>>18)<=1); // if x<32
#else
while((rLCDCON1>>18)==0); // if x>32
#endif
addr=(U32)frameBuffer16BitTft640480+(vx*2)+vy*(SCR_XSIZE_TFT_640480*2);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480*2))>>1));
CLR_IF();
break;
case MODE_TFT_24BIT_640480:
SET_IF();
#if (LCD_XSIZE_TFT_640480<16)
while((rLCDCON1>>18)<=1); // if x<16
#else
while((rLCDCON1>>18)==0); // if x>16
#endif
addr=(U32)frameBuffer24BitTft640480+(vx*4)+vy*(SCR_XSIZE_TFT_640480*4);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480*4))>>1));
CLR_IF();
break;
case MODE_TFT_1BIT_800600:
SET_IF();
#if (LCD_XSIZE_TFT_800600<512)
while((rLCDCON1>>18)<=1); // if x<512
#else
while((rLCDCON1>>18)==0); // if x>512 ((12+4)*32)
#endif
addr=(U32)frameBuffer1BitTft800600+(vx/8)+vy*(SCR_XSIZE_TFT_800600/8);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D( ((addr+(SCR_XSIZE_TFT_800600*LCD_YSIZE_TFT_800600/8))>>1) );
CLR_IF();
break;
case MODE_TFT_8BIT_800600:
SET_IF();
#if (LCD_XSIZE_TFT_800600<64)
while((rLCDCON1>>18)<=1); // if x<64
#else
while((rLCDCON1>>18)==0); // if x>64
#endif
addr=(U32)frameBuffer8BitTft800600+(vx/1)+vy*(SCR_XSIZE_TFT_800600/1);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_800600*LCD_YSIZE_TFT_800600))>>1));
CLR_IF();
break;
case MODE_TFT_16BIT_800600:
SET_IF();
#if (LCD_XSIZE_TFT_800600<32)
while((rLCDCON1>>18)<=1); // if x<32
#else
while((rLCDCON1>>18)==0); // if x>32
#endif
addr=(U32)frameBuffer16BitTft800600+(vx*2)+vy*(SCR_XSIZE_TFT_800600*2);
rLCDSADDR1= ( (addr>>22)<<21 ) | M5D(addr>>1);
rLCDSADDR2= M5D(((addr+(SCR_XSIZE_TFT_800600*LCD_YSIZE_TFT_800600*2))>>1));
CLR_IF();
break;
default:
break;
}
}
void SetGPIOforLDI(void)
{
//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);
}
void delayLoop(int count)
{
int j;
for(j = 0; j < count; j++) ;
}
#if 0
void WriteLDI_LTS350(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_Hi; // Data high
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
LCD_DCLK_Lo; // SCL Low
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -