📄 lcdlib.c
字号:
/*****************************************
NAME: lcdlib.c
DESC: lcd configuration low-level codes
HISTORY:
2002.03.13:draft ver 0.0
*****************************************/
#include <string.h>
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
//#include "option.h"
#include "2410slib.h"
#include "lcdlib.h"
//TFT 240320
U32 (*frameBuffer8BitTft240320)[SCR_XSIZE_TFT_240320/4];
U32 (*frameBuffer16BitTft240320)[SCR_XSIZE_TFT_240320/2];
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;
// TFT LCD panel,8bpp TFT,ENVID=off
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); //FRM5:6:5,HSYNC and VSYNC are inverted
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); // MASK LCD Sub Interrupt
rLPCSEL&=(~7); // Disable LPC3600
rTPAL=0; // Disable Temp Palette
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); // MASK LCD Sub Interrupt
rLPCSEL&=(~7); // Disable LPC3600
rTPAL=0; // Disable Temp Palette
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_EnvidOnOff(int onoff)
{
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}
void Lcd_Lpc3600Enable(void)
{
rLPCSEL&=~(7);
rLPCSEL|=(2); // 240320,Enable LPC3600
}
void Lcd_PowerEnable(int invpwren,int pwren)
{
//GPG4 is setted as LCD_PWREN
rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
//Enable LCD POWER ENABLE Function
rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3); // PWREN
rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN
}
void MoveViewPort(int type)
{
int vx=0,vy=0,vd;
vd=(type==MODE_TFT_1BIT_240320)*16+(type==MODE_TFT_8BIT_240320)*2+(type==MODE_TFT_16BIT_240320)*1;
while(1)
{
switch(Uart_Getch())
{
case 'i':
if(vy>=vd)vy-=vd;
break;
case 'j':
if(vx>=vd)vx-=vd;
break;
case 'k':
if(vx<=(SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320-vd))vx+=vd;
break;
case 'm':
if(vy<=(SCR_YSIZE_TFT_240320-LCD_YSIZE_TFT_240320-vd))vy+=vd;
break;
case '\r':
return;
default:
break;
}
Uart_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_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;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -