📄 lcdlib.c
字号:
//====================================================================
// File Name : lcdlib.c
// Function : S3C2412 LCD configuration low-level codes
// Date : Apr. 21, 2006
// Version : S3C2412
//====================================================================
#include <stdio.h>
#include <stdlib.h>
#include "def.h"
#include "2413addr.h"
#include "lcdlib.h"
#include "demo256.h"
#define V14
#ifdef V14
#define LCD_DEN (1<<6) //GPB6, nSS
#define LCD_DSERI (1<<6) //GPG6, SPIMOSI
#define LCD_DCLK (1<<7) //GPG7, SPICLK
#define LCD_RESET (1<<5) //GPG5, RESET
#define LCD_DEN_Lo (rGPBDAT&= ~LCD_DEN)
#define LCD_DEN_Hi (rGPBDAT |= LCD_DEN)
#define LCD_DCLK_Lo (rGPGDAT &= ~LCD_DCLK)
#define LCD_DCLK_Hi (rGPGDAT |= LCD_DCLK)
#define LCD_DSERI_Lo (rGPGDAT &= ~LCD_DSERI)
#define LCD_DSERI_Hi (rGPGDAT |= LCD_DSERI)
#define LCD_RESET_Lo (rGPGDAT &= ~LCD_RESET)
#define LCD_RESET_Hi (rGPGDAT |= LCD_RESET)
#else
#define LCD_DEN (1<<2) //GPG2, nSS
#define LCD_DSERI (1<<12) //GPE12, SPIMOSI
#define LCD_DCLK (1<<13) //GPE13, SPICLK
#define LCD_RESET (0)
#define LCD_DEN_Lo (rGPGDAT&= ~LCD_DEN)
#define LCD_DEN_Hi (rGPGDAT |= LCD_DEN)
#define LCD_DCLK_Lo (rGPEDAT &= ~LCD_DCLK)
#define LCD_DCLK_Hi (rGPEDAT |= LCD_DCLK)
#define LCD_DSERI_Lo (rGPEDAT &= ~LCD_DSERI)
#define LCD_DSERI_Hi (rGPEDAT |= LCD_DSERI)
#define LCD_RESET_Lo (0)
#define LCD_RESET_Hi (1)
#endif
//Mono STN
U32 (*frameBuffer1Bit)[SCR_XSIZE_STN/32];
//Gray
U32 (*frameBuffer2Bit)[SCR_XSIZE_STN/16];
U32 (*frameBuffer4Bit)[SCR_XSIZE_STN/8];
//Color STN
U32 (*frameBuffer8Bit)[SCR_XSIZE_CSTN/4];
U32 (*frameBuffer12Bit)[SCR_XSIZE_CSTN/2];
U32 (*frameBuffer16Bit)[SCR_XSIZE_CSTN/2];
//TFT 240320
U32 (*frameBuffer8BitTft240320)[SCR_XSIZE_TFT_240320/4];
U32 (*frameBuffer16BitTft240320)[SCR_XSIZE_TFT_240320/2];
U32 (*frameBuffer24BitTft240320)[SCR_XSIZE_TFT_240320];
//TFT 320240
U32 (*frameBuffer8BitTft320240)[SCR_XSIZE_TFT_320240/4];
U32 (*frameBuffer16BitTft320240)[SCR_XSIZE_TFT_320240/2];
U32 (*frameBuffer24BitTft320240)[SCR_XSIZE_TFT_320240];
unsigned save_rGPCDN,save_rGPCDAT,save_rGPCCON;
unsigned save_rGPDDN,save_rGPDDAT,save_rGPDCON;
unsigned save_rGPBDN,save_rGPBDAT,save_rGPBCON;
unsigned lcd_count;
void Lcd_Init(int type)
{
switch(type)
{
case MODE_TFT_8BIT_240320:
frameBuffer8BitTft240320=(U32 (*)[SCR_XSIZE_TFT_240320/4])LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(11<<1)|0;
rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
rLCDCON4=(MVAL<<8)|(HSPW_240320);
rLCDCON5=(1<<11)|(1<<9)|(1<<8);
rLCDSADDR1=(((U32)frameBuffer8BitTft240320>>22)<<21)|M5D((U32)frameBuffer8BitTft240320>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer8BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320/1))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/2)<<11)|(LCD_XSIZE_TFT_240320/2);
rLCDINTMSK|=(3);
rTCONSEL =0;
rTPAL=0;
break;
case MODE_TFT_16BIT_240320:
frameBuffer16BitTft240320=(U32 (*)[SCR_XSIZE_TFT_240320/2])LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
rLCDCON4=(MVAL<<8)|(HSPW_240320);
rLCDCON5=(1<<11)|(1<<9)|(1<<8);
rLCDSADDR1=(((U32)frameBuffer16BitTft240320>>22)<<21)|M5D((U32)frameBuffer16BitTft240320>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer16BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/1)<<11)|(LCD_XSIZE_TFT_240320/1);
rLCDINTMSK|=(3);
rTCONSEL=0;
rTPAL=0;
break;
case MODE_TFT_24BIT_240320:
frameBuffer24BitTft240320=(U32 (*)[SCR_XSIZE_TFT_240320])LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_240320<<8)|(3<<5)|(13<<1)|0;
rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
rLCDCON4=(MVAL<<8)|(HSPW_240320);
rLCDCON5=(0<<12)|(1<<9)|(1<<8);
rLCDSADDR1=(((U32)frameBuffer24BitTft240320>>22)<<21)|M5D((U32)frameBuffer24BitTft240320>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer24BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*4))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)*2)<<11)|(LCD_XSIZE_TFT_240320*2);
rLCDINTMSK|=(3);
rTCONSEL&=0;
rTPAL=0;
break;
case MODE_TFT_24BIT_320240:
frameBuffer24BitTft320240=(U32 (*)[SCR_XSIZE_TFT_320240])LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_320240<<8)|(3<<5)|(13<<1)|0;
rLCDCON2=(VBPD_320240<<24)|(LINEVAL_TFT_320240<<14)|(VFPD_320240<<6)|(VSPW_320240);
rLCDCON3=(HBPD_320240<<19)|(HOZVAL_TFT_320240<<8)|(HFPD_320240);
rLCDCON4=(MVAL<<8)|(HSPW_320240);
rLCDCON5=(0<<12)|(1<<10)|(1<<9)|(1<<8);
rLCDSADDR1=(((U32)frameBuffer24BitTft320240>>22)<<21)|M5D((U32)frameBuffer24BitTft320240>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer24BitTft320240+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*4))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_320240-LCD_XSIZE_TFT_320240)*2)<<11)|(LCD_XSIZE_TFT_320240*2);
rLCDINTMSK|=(3);
rTCONSEL=0;
rTPAL=0;
break;
case MODE_TFT_16BIT_320240:
frameBuffer16BitTft320240=(U32 (*)[SCR_XSIZE_TFT_320240/2])LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_320240<<8)|(3<<5)|(12<<1)|0;
rLCDCON2=(VBPD_320240<<24)|(LINEVAL_TFT_320240<<14)|(VFPD_320240<<6)|(VSPW_320240);
rLCDCON3=(HBPD_320240<<19)|(HOZVAL_TFT_320240<<8)|(HFPD_320240);
rLCDCON4=(MVAL<<8)|(HSPW_320240);
rLCDCON5=(1<<11)|(1<<10)|(1<<9)|(1<<8);
rLCDSADDR1=(((U32)frameBuffer16BitTft320240>>22)<<21)|M5D((U32)frameBuffer16BitTft320240>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer16BitTft320240+(SCR_XSIZE_TFT_320240*LCD_YSIZE_TFT_320240*2))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_320240-LCD_XSIZE_TFT_320240)/1)<<11)|(LCD_XSIZE_TFT_320240/1);
rLCDINTMSK|=(3);
rTCONSEL=0;
rTPAL=0;
break;
case MODE_CSTN_1BIT_P:
frameBuffer1Bit=(U32 (*)[SCR_XSIZE_CSTN/32])LCDFRAMEBUFFER;
LutSetting(MODE_CSTN_1BIT_P);
FrcSetting();
CstnCommonSetting();
rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(0<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDSADDR1=(((U32)frameBuffer1Bit>>22)<<21)|M5D((U32)frameBuffer1Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((LCD_XSIZE_CSTN/8)*LCD_YSIZE_CSTN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/16);
rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((SCR_XSIZE_CSTN/8)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/16)<<11)|(LCD_XSIZE_CSTN/16);
break;
case MODE_CSTN_2BIT_P:
frameBuffer2Bit=(U32 (*)[SCR_XSIZE_CSTN/16])LCDFRAMEBUFFER;
LutSetting(MODE_CSTN_2BIT_P);
FrcSetting();
CstnCommonSetting();
rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(1<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDSADDR1=(((U32)frameBuffer2Bit>>22)<<21)|M5D((U32)frameBuffer2Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((LCD_XSIZE_CSTN/4)*LCD_YSIZE_CSTN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/8);
rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((SCR_XSIZE_CSTN/4)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/8)<<11)|(LCD_XSIZE_CSTN/8);
break;
case MODE_CSTN_4BIT_P:
frameBuffer4Bit=(U32 (*)[SCR_XSIZE_CSTN/8])LCDFRAMEBUFFER;
LutSetting(MODE_CSTN_4BIT_P);
FrcSetting();
CstnCommonSetting();
rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(2<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDSADDR1=(((U32)frameBuffer4Bit>>22)<<21)|M5D((U32)frameBuffer4Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((LCD_XSIZE_CSTN/2)*LCD_YSIZE_CSTN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/4);
rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((SCR_XSIZE_CSTN/2)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/4)<<11)|(LCD_XSIZE_CSTN/4);
break;
case MODE_CSTN_8BIT_P:
frameBuffer8Bit=(U32 (*)[SCR_XSIZE_CSTN/8])LCDFRAMEBUFFER;
LutSetting(MODE_CSTN_8BIT_P);
FrcSetting();
CstnCommonSetting();
rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(3<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDSADDR1=(((U32)frameBuffer8Bit>>22)<<21)|M5D((U32)frameBuffer8Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((LCD_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/4);
rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((SCR_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/2)<<11)|(LCD_XSIZE_CSTN/2);
break;
case MODE_CSTN_8BIT:
frameBuffer8Bit=(U32 (*)[SCR_XSIZE_CSTN/4])LCDFRAMEBUFFER;
LutSetting(MODE_CSTN_8BIT);
FrcSetting();
CstnCommonSetting();
rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(4<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDSADDR1=(((U32)frameBuffer8Bit>>22)<<21)|M5D((U32)frameBuffer8Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((LCD_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN/2);
rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((SCR_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/2)<<11)|(LCD_XSIZE_CSTN/2);
break;
case MODE_CSTN_12BIT:
frameBuffer12Bit=(U32 (*)[SCR_XSIZE_CSTN/2])LCDFRAMEBUFFER;
LutSetting(MODE_CSTN_12BIT);
FrcSetting();
CstnCommonSetting();
rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(5<<1)|0;
rLCDCON5=(1<<11)|(1);
rLCDSADDR1=(((U32)frameBuffer12Bit>>22)<<21)|M5D((U32)frameBuffer12Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer12Bit+((LCD_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_CSTN);
rLCDSADDR2=M5D(((U32)frameBuffer12Bit+((SCR_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN))<<11)|(LCD_XSIZE_CSTN);
break;
case MODE_CSTN_16BIT:
frameBuffer16Bit=(U32 (*)[SCR_XSIZE_CSTN/2])LCDFRAMEBUFFER;
LutSetting(MODE_CSTN_16BIT);
FrcSetting();
CstnCommonSetting();
rLCDCON1=(CLKVAL_CSTN<<8)|(0<<7)|(2<<5)|(6<<1)|0;
rLCDCON5=(1<<11)|(1);
rLCDSADDR1=(((U32)frameBuffer16Bit>>22)<<21)|M5D((U32)frameBuffer16Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer16Bit+((LCD_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
//rLCDSADDR3= (0<<11)|(LCD_XSIZE_CSTN);
rLCDSADDR2=M5D(((U32)frameBuffer16Bit+((SCR_XSIZE_CSTN*2)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN))<<11)|(LCD_XSIZE_CSTN);
rTPAL=0;
break;
case MODE_STN_1BIT:
frameBuffer1Bit=(U32 (*)[SCR_XSIZE_STN/32])LCDFRAMEBUFFER;
LutSetting(MODE_STN_1BIT);
FrcSetting();
StnCommonSetting();
rLCDCON1=(CLKVAL_STN_MONO<<8)|(1<<7)|(1<<5)|(0<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDSADDR1=(((U32)frameBuffer1Bit>>22)<<21)|M5D((U32)frameBuffer1Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((LCD_XSIZE_STN/8)*LCD_YSIZE_STN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_STN/16);
rLCDSADDR2=M5D(((U32)frameBuffer1Bit+((SCR_XSIZE_STN/8)*LCD_YSIZE_STN))>>1);
rLCDSADDR3=(((SCR_XSIZE_STN-LCD_XSIZE_STN)/16)<<11)|(LCD_XSIZE_STN/16);
break;
case MODE_STN_2BIT:
frameBuffer2Bit=(U32 (*)[SCR_XSIZE_STN/16])LCDFRAMEBUFFER;
LutSetting(MODE_STN_2BIT);
FrcSetting();
StnCommonSetting();
rLCDCON1=(CLKVAL_STN_GRAY<<8)|(1<<7)|(1<<5)|(1<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDCON3 = (rLCDCON3& ~(0xff))|(LINEBLANK_GRAY);
rLCDSADDR1=(((U32)frameBuffer2Bit>>22)<<21)|M5D((U32)frameBuffer2Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((LCD_XSIZE_STN/4)*LCD_YSIZE_STN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_STN/8);
rLCDSADDR2=M5D(((U32)frameBuffer2Bit+((SCR_XSIZE_STN/4)*LCD_YSIZE_STN))>>1);
rLCDSADDR3=(((SCR_XSIZE_STN-LCD_XSIZE_STN)/8)<<11)|(LCD_XSIZE_STN/8);
break;
case MODE_STN_4BIT:
frameBuffer4Bit=(U32 (*)[SCR_XSIZE_STN/8])LCDFRAMEBUFFER;
LutSetting(MODE_STN_4BIT);
FrcSetting();
StnCommonSetting();
rLCDCON1=(CLKVAL_STN_GRAY<<8)|(1<<7)|(1<<5)|(2<<1)|0;
rLCDCON5=(1<<11)|(0);
rLCDCON3 = (rLCDCON3& ~(0xff))|(LINEBLANK_GRAY);
rLCDSADDR1=(((U32)frameBuffer4Bit>>22)<<21)|M5D((U32)frameBuffer4Bit>>1);
//rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((LCD_XSIZE_STN/2)*LCD_YSIZE_STN))>>1);
//rLCDSADDR3=(0<<11)|(LCD_XSIZE_STN/4);
rLCDSADDR2=M5D(((U32)frameBuffer4Bit+((SCR_XSIZE_STN/2)*LCD_YSIZE_STN))>>1);
rLCDSADDR3=(((SCR_XSIZE_STN-LCD_XSIZE_STN)/4)<<11)|(LCD_XSIZE_STN/4);
break;
default:
break;
}
}
void Lcd_Port_Init(void)
{
save_rGPCCON=rGPCCON;
save_rGPCDAT=rGPCDAT;
save_rGPCDN=rGPCDN;
save_rGPDCON=rGPDCON;
save_rGPDDAT=rGPDDAT;
save_rGPDDN=rGPDDN;
save_rGPBCON=rGPBCON;
save_rGPBDN=rGPBDN;
save_rGPBDAT=rGPBDAT;
rGPCDAT &= ~(1<<4);
rGPCDN=0xffff; // Disable Pull-up register
rGPCCON=0xaaaaa9a8; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
rGPDDN=0xffff; // Disable Pull-up register
rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
rGPBDN |= (0x1<<5);
rGPBCON = (rGPBCON & ~(0x3<<10))|(0x1<<10);
}
void Lcd_Port_Return(void)
{
rGPCCON=save_rGPCCON;
rGPCDAT=save_rGPCDAT;
rGPCDN=save_rGPCDN;
rGPDCON=save_rGPDCON;
rGPDDAT=save_rGPDDAT;
rGPDDN=save_rGPDDN;
}
void Lcd_Palette8Bit_Init(void)
{
int i;
U32 *palette;
rLCDCON5|=(1<<11); // 5:6:5 Palette Setting
palette=(U32 *)0x4d000400;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];
}
void __irq IsrLcdFrame(void)
{
rINTMSK |= BIT_LCD;
rLCDINTMSK |= 3;
rGPHDAT &= ~(1<<10);
printf(".");
rGPHDAT |= (1<<10);
rLCDSRCPND = (1<<1);
rLCDINTPND = (1<<1);
ClearPending(BIT_LCD);
rLCDINTMSK &= ~(2);
rINTMSK &= ~BIT_LCD;
}
void __irq IsrLcdFifo(void)
{
rINTMSK |= BIT_LCD;
rLCDINTMSK |= 3;
printf("fi\n");
rLCDSRCPND = (1);
rLCDINTPND = (1);
ClearPending(BIT_LCD);
rLCDINTMSK &= ~(1);
rINTMSK &= ~BIT_LCD;
}
void Lcd_EnvidOnOff(int onoff)
{
if(onoff==1)
rLCDCON1 |=1; // ENVID=ON
else
rLCDCON1 &= ~(1); // ENVID Off
}
void Lcd_CstnOnOff(int onoff)
{
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}
void Lcd_PowerEnable(int invpwren,int pwren)
{
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_1BIT_P)*16+(type==MODE_CSTN_2BIT_P)*8+(type==MODE_CSTN_4BIT_P)*4+(type==MODE_CSTN_8BIT_P)*2
+(type==MODE_CSTN_8BIT)*2+(type==MODE_CSTN_12BIT)*4+(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_24BIT_240320)
+(type==MODE_TFT_16BIT_320240)*1+(type==MODE_TFT_24BIT_320240);
while(1)
{
switch(getchar())
{
case 'i':
if(vy>=vd)vy-=vd;
break;
case 'j':
if(vx>=vd)vx-=vd;
break;
case 'k':
if((type&0x4000)&&(type&0x800))
{
if(vx<=(SCR_XSIZE_TFT_320240-LCD_XSIZE_TFT_320240-vd))vx+=vd;
}
else if((type&0x4000)&&(type&0x100))
{
if(vx<=(SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320-vd))vx+=vd;
}
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&0x800))
{
if(vy<=(SCR_YSIZE_TFT_320240-LCD_YSIZE_TFT_320240-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 0x0a:
return;
default:
break;
}
printf("vx=%3d,vy=%3d\n",vx,vy);
Lcd_MoveViewPort(vx,vy,type);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -