⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_320x240.c

📁 wince lcd driver dai ma
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
   copyright(c) 2006, ShenZhen uCdragon Technology Co., Ltd.
   All rights reserved.

   file:     lcd_320x240.c
   description: test Samsung's 3.5" Color TFT-LCD LTV350QV-F05.
               The initial and control, 16Bpp mode.
   platform: FS2410DEV V6.0
   creat:    ???
   modify:   zhongzm
   date:     2006/5/15 - ?
   version:  1.01
*/

#include <string.h>
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
#include "2410slib.h"
#include "BMP_16BPP_320_240.h"
#include "lcdexp.h"
#include "gb2312_cn.h"
#include "lcd_gui.h"


#define MVAL		(13)
#define MVAL_USED 	(0)		//0=each frame   1=rate by MVAL
#define INVVDEN		(1)		//0=normal       1=inverted
#define BSWP		(0)		//Byte swap control
#define HWSWP		(1)		//Half word swap control

#define M5D(n) ((n) & 0x1fffff)	// To get lower 21bits

//TFT 240320
#define LCD_XSIZE_TFT_320240 	(240)	
#define LCD_YSIZE_TFT_320240 	(320)

//TFT 240320

#define SCR_XSIZE_TFT_320240 	(240)
#define SCR_YSIZE_TFT_320240 	(320)

//TFT240320
#define HOZVAL_TFT_320240	(LCD_XSIZE_TFT_240320-1)
#define LINEVAL_TFT_320240	(LCD_YSIZE_TFT_240320-1)

//Timing parameter for LCD
#define VBPD_320240		(2)		//垂直同步信号的后肩
#define VFPD_320240		(2)		//垂直同步信号的前肩
#define VSPW_320240		(4)		//垂直同步信号的脉宽

#define HBPD_320240		(8)		//水平同步信号的后肩
#define HFPD_320240		(8)		//水平同步信号的前肩
#define HSPW_320240		(6)		//水平同步信号的脉宽

#define CLKVAL_TFT_240320	(5) 	
//FCLK=180MHz,HCLK=90MHz,VCLK=6.5MHz



// GPB1/TOUT1 for Backlight control(PWM)
#define GPB1_TO_OUT()   (rGPBUP &= 0xfffd, rGPBCON &= 0xfffffff3, rGPBCON |= 0x00000004)
#define GPB1_TO_1()     (rGPBDAT |= 0x0002)
#define GPB1_TO_0()     (rGPBDAT &= 0xfffd)

volatile static unsigned short LCD_BUFER[SCR_YSIZE_TFT_320240][SCR_XSIZE_TFT_320240];
unsigned short LCD_POINT_COLOR[SCR_YSIZE_TFT_320240][SCR_XSIZE_TFT_320240];
unsigned long  LCD_POINT_SUM=0;
/*-------------------------- function declaration ---------------------------*/
static void Lcd_EnvidOnOff(int onoff);


/*-----------------------------------------------------------------------------
 *  LCD PWREN端口初始化, no use
 */
static void Lcd_Pwren_Init_On_Off( unsigned char m )
{
    rGPGCON = rGPGCON | (3<<8) ;
    rGPGUP = rGPGUP & ( ~(1<<4) ) ;
    if( m == TRUE )
        rGPGDAT = rGPGDAT | (1<<4) ;
    else
        rGPGDAT = rGPGDAT & ( ~(1<<4) );
}

/*-----------------------------------------------------------------------------
 *  320 x 240 TFT LCD数据和控制端口初始化
 */
void Lcd_Port_Init( void )
{
    //rGPCUP  = 0xffffffff; // Disable Pull-up register
    rGPCUP  = 0x00000000;
    //rGPCCON = 0xaaaa56a9; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
    rGPCCON = 0xaaaa02a9;  //qjy: for avr config lcd!!!

    //rGPDUP  = 0xffffffff; // Disable Pull-up register
    rGPDUP  = 0x00000000;
    rGPDCON = 0xaaaaaaaa; //Initialize VD[15:8]
    
    Lcd_Pwren_Init_On_Off( TRUE ) ;
}
static void Lcd_MoveViewPort(int vx, int vy);
/*-----------------------------------------------------------------------------
 *  320 x 240 TFT LCD功能模块初始化
 */
#ifndef __ASSEMBLY__
#define UData(Data)	((unsigned long) (Data))
#else
#define UData(Data)	(Data)
#endif
 #define Fld(Size, Shft)	(((Size) << 16) + (Shft))
#define FSize(Field)	((Field) >> 16)
#define FShft(Field)	((Field) & 0x0000FFFF)
#define FMsk(Field)	(((UData (1) << FSize (Field)) - 1) << FShft (Field))
#define FInsrt(Value, Field) \
                	(UData (Value) << FShft (Field))
                	
                	
#define fLCDADDR_BANK	Fld(9,21)	/* bank location for video buffer */
#define LCDADDR_BANK(x)	FInsrt((x), fLCDADDR_BANK)

#define fLCDADDR_BASEU	Fld(21,0)	/* address of upper left corner */
#define LCDADDR_BASEU(x)	FInsrt((x), fLCDADDR_BASEU)

#define fLCDADDR_BASEL	Fld(21,0)	/* address of lower right corner */
#define LCDADDR_BASEL(x)	FInsrt((x), fLCDADDR_BASEL)

void Lcd_Init(void)
{
    // TFT LCD panel, 16bpp TFT, ENVID=off
    rLCDCON1 = (7<<8)|(3<<5)|(12<<1);
    rLCDCON2 =(2<<24)|(319<<14)|(2<<6)|4;
    rLCDCON3 = (8<<19)|(239<<8)|8;
    rLCDCON4 = (13<<8)|6;
    rLCDCON5 = (1<<11)|(0<<9)|(0<<8)|(0<<6)|(1);

   // rLCDSADDR1 = (((U32)LCD_BUFER>>22)<<21) | M5D((U32)LCD_BUFER>>1);
    
    rLCDSADDR1 =LCDADDR_BANK(((unsigned long)LCD_BUFER >> 22))
		| LCDADDR_BASEU(((unsigned long)LCD_BUFER >> 1));
    rLCDSADDR2 = M5D( ((U32)LCD_BUFER
               +(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);    // MASK LCD Sub Interrupt
    rLPCSEL &= (~7) ;     // Disable LPC3480
    rTPAL = 0 ;           // Disable Temp Palette
}

/*-----------------------------------------------------------------------------
 *  LCD视频和控制信号输出或者停止,1开启视频输出
 */
void Lcd_EnvidOnOff(int onoff)
{
    if(onoff == 1)
        rLCDCON1 |= 1;         // ENVID=ON
    else
        rLCDCON1 &= 0x3fffe;   // ENVID Off
}

/*-----------------------------------------------------------------------------
 *  LPC3600 is a timing control logic unit for LTS350Q1-PD1 or LTS350Q1-PD2
 *  no use
 */
static void Lcd_Lpc3600Enable(void)
{
    rLPCSEL &= ~(7);
    rLPCSEL |= (7);    // 320240, Enable LPC3480
}    

/*-----------------------------------------------------------------------------
 *  320 x 240 16Bpp TFT LCD 背光控制使能
 */
static void Lcd_Black_Light_On_Off( unsigned char m )
{
    rGPBCON = rGPBCON & (~(3<<10)) | (1<<10) ;    //GPB5 is output
    rGPBUP  = rGPBUP & (~(1<<5)) ;                 //GPB5 pull-up is enable
    
    if ( m > 0 ) rGPBDAT |= (1<<5) ;      //GPB5 output HIGH
    else rGPBDAT &= (~(1<<5));            //GPB5 output LOW
}    

/*-----------------------------------------------------------------------------
 *  320 x 240 16Bpp TFT LCD 电源控制引脚使能, no use
 */
static void Lcd_PowerEnable(int invpwren, int pwren)
{
    //GPG4 is setted as LCD_PWREN
    rGPGUP = rGPGUP | (1<<4);         // Pull-up disable
    rGPGCON = rGPGCON | (3<<8);       //GPG4=LCD_PWREN
    
    //Enable LCD POWER ENABLE Function
    rLCDCON5 = rLCDCON5 & (~(1<<3)) | (pwren<<3);      // PWREN
    rLCDCON5 = rLCDCON5 & (~(1<<5)) | (invpwren<<5);   // INVPWREN
}


/*-----------------------------------------------------------------------------
 *  320 x 240 TFT LCD移动观察窗口
 */
static void Lcd_MoveViewPort(int vx, int vy)
{
    U32 addr;

    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)LCD_BUFER+(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();
}    
 
/*-----------------------------------------------------------------------------
 *  320 x 240 TFT LCD单个象素的显示数据输出
 */

void PutPixel(U32 x,U32 y,U16 c)
{
    if(x<SCR_XSIZE_TFT_320240 && y<SCR_YSIZE_TFT_320240){
        LCD_BUFER[(y)][(x)] = c;
    	LCD_POINT_COLOR[y][x]=c;
    	LCD_POINT_SUM++;
    }
}
void Lcd_GetXY_Color(U32 x,U32 y,unsigned short * c)
{
	int i,j;
	for(i=SCR_XSIZE_TFT_320240;i>=0;i--)
	{
		for(j=SCR_YSIZE_TFT_320240;j>=0;j--)
		{
			if((x==i)&&(y==j)){*c=LCD_POINT_COLOR[y][x];return;}
		}
	}
	if(i==0)	*c=0xf800;
}
int Lcd_CmpColor(unsigned short c0,unsigned short c)
{
	if(c0!=c)	return 0;
	return 1;
}
/*-----------------------------------------------------------------------------
 *  320 x 240 TFT LCD全屏填充特定颜色单元或清屏
 */
  void Lcd_ClearScr( U16 c)
{
    unsigned int x, y;
    
    for( y = 0 ; y < SCR_YSIZE_TFT_320240 ; y++ )
    {
        for( x = 0 ; x < SCR_XSIZE_TFT_320240 ; x++ )
        {
            LCD_BUFER[y][x] = c ;
        }
    }
}



/* draw a vertical line */
void draw_vline(int x, int y1, int y2, U16 color)
{
	int tmp; 
	int i = 0;
			        
	if ( y1>y2 ) {
		tmp = y1;
		y1 = y2;
		y2 = tmp;
	}

	tmp = y2 - y1;

	for ( i=0;i<=tmp;++i ) { 
		PutPixel(x,y1+i,color);
	}

	return;
}
void draw_hline1(int x1, int y, int x2, U16 color)
{       
	int tmp;
	int i = 0;

	if ( x1>x2 ) {
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}

	tmp = x2 - x1;

	for ( i=0;i<=tmp;++i ) {
		PutPixel(x1+i,y,color);
	}

	return;
}

/* draw a horizontal line */
void draw_hline(int x1, int x2, int y, U16 color)
{       
	int tmp;
	int i = 0;

	if ( x1>x2 ) {
		tmp = x1;
		x1 = x2;
		x2 = tmp;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -