📄 lcd_320x240.c
字号:
/*
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 + -