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

📄 2410-lcd_320x240.c

📁 MXL9328LCD驱动实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************
The initial and control for 320×240 24Bpp TFT LCD----3.5寸横屏
**************************************************************/

#include <string.h>
#include "def.h"
#include "2410addr.h"
#include "2410slib.h"
#include "2410lib.h"
#include "LCD_TX06D18.h"

#define LCD_spi_cs	0x0020
#define LCD_spi_scl	0x0040
#define LCD_spi_sdi	0x0080

#define FIWSEL		(0)	//触发LCD FIFO.0:4字,1:8字,
#define INT_FrSyn	(1)	//LCD帧同步中断,0:NO中断请求.1:中断请求.
#define INT_FiCnt	(1)	//LCD FIFO中断,0:NO中断请求.1:中断请求.

#define BPP24BL		(0)	//确定24 bpp图像存储器时序,0:低24位有效,1:高24位有效
#define FRM565		(0)	//图像输出FORMAT,0: 5:5:5:1,  1: 5:6:5
#define INVVCLK		(1)	//VCLK上下降沿,0:下降沿,1:上升沿
#define INVVLINE	(1)	//VLINE/HSYNC的极性,0:正向,1:反向
#define INVVFRAME	(1)	//VFRAME/VSYNC的极性,0:正向,1:反向
#define INVVD		(0)	//VD (video data)的极性,0:正向,1:反向
#define INVVDEN		(0)	//VDEN的极性,0:正向,1:反向
#define INVPWREN	(0)	//PWREN的极性,0:正向,1:反向
#define INVLEND		(0)	//LEND的极性,0:正向,1:反向
#define PWREN		(0)	//PWREN输出使能,1=使能
#define ENLEND		(0)	//LEND输出使能,1=使能
#define BSWP		(0)	//字节交换使能,1=使能
#define HWSWP		(0)	//半字交换使能,1=使能

#define MVAL		(13)		//STN: 在MMODE=1,时定义VM速率
#define MMODE		(0)		//0=each frame   1=rate by MVAL	VM速率.
#define PNRMODE		(3)		//显示模式 00:4位双扫描STN;01:4位单扫描STN;10:8位单扫描STN;11:TFT
#define BPPMODE		(13)		//0000:1 bpp单色STN,0001:2 bpp 4级灰度STN,0010:4 bpp 16级灰度STN,0011:8 bpp彩色STN,0100:12 bpp彩色STN,1000:1 bpp TFT,1001:2 bpp TFT,1010:4 bpp TFT,1011:8 bpp TFT,1100:16 bpp TFT,1101:24 bpp TFT
#define ENVID_off	(0)		//LCD视频输出0:DN,1:EN
#define ENVID_on	(1)		//LCD视频输出0:DN,1:EN

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

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

//TFT 320240
#define SCR_XSIZE_TFT_320240	(320)
#define SCR_YSIZE_TFT_320240	(240)

//TFT 320240
#define HOZVAL_TFT_240320	(LCD_XSIZE_TFT_320240-1)	//水平大小
#define LINEVAL_TFT_240320	(LCD_YSIZE_TFT_320240-1)	//垂直大小

//Timing parameter for LCD
#define VBPD_240320		(7)		//垂直同步信号的后肩
#define VFPD_240320		(4)		//垂直同步信号的前肩
#define VSPW_240320		(2)		//垂直同步信号的脉宽

#define HBPD_240320		(37)		//水平同步信号的后肩
#define HFPD_240320		(32)		//水平同步信号的前肩
#define HSPW_240320		(5)		//水平同步信号的脉宽

#define CLKVAL_TFT_240320	(5) 		//VCLK <30MHz分频系数TFT: VCLK = HCLK / [(CLKVAL+1) ′ 2]
//FCLK=180MHz,HCLK=90MHz,VCLK=6.5MHz
#define	LCD_command_INDEX	1
#define	LCD_command_INSTR	0

static void lcd_spi_process(unsigned char type,U16 datas);
static void lcd_samsung_LTV350QV_SPI_write(unsigned char reg,U16 datas);
static void samsung_LTV350QV_init(void);
static void Lcd_Init(void);
static void Lcd_EnvidOnOff(char onoff);
static void MoveViewPort(void);
static void Lcd_MoveViewPort(int vx,int vy);
static void PutPixel(U32 x,U32 y,U32 c);
static void Glib_FilledRectangle(int x1,int y1,int x2,int y2,U32 color);
static void Glib_Line(int x1,int y1,int x2,int y2,U32 color);
static void Lcd_ClearScr(U32 c);
static void Paint_Bmp(int x0,int y0,int l,int h,unsigned char bmp[]);
unsigned char byte_inverter(unsigned char input_data);

extern unsigned char KONGLONG_309_233_24bpp[];

volatile static U32 LCD_BUFER[240][320];	//显示缓冲

/**************************************************************
SAMSUNG LCD LTV350QV SPI 接口程序
**************************************************************/
static void lcd_spi_process(unsigned char type,U16 datas)
{	
	unsigned char i;
	unsigned char orders;
	
	rGPCDAT &= ~LCD_spi_cs;
	Delay(3);
	if(type)	orders = 0x74;
	else		orders = 0x76;
	for(i = 0; i < 8; i++)
	{
		rGPCDAT &= ~LCD_spi_scl;
		Delay(1);
		if(orders & 0x80)	rGPCDAT |= LCD_spi_sdi;
		else			rGPCDAT &= ~LCD_spi_sdi;
		Delay(1);
		rGPCDAT |= LCD_spi_scl;
		Delay(1);
		orders = orders << 1;
	}
	
	for(i = 0; i < 16; i++)
	{
		rGPCDAT &= ~LCD_spi_scl;
		Delay(1);
		if(datas & 0x8000)	rGPCDAT |= LCD_spi_sdi;
	 	else 			rGPCDAT &= ~LCD_spi_sdi;
	 	Delay(1);
	 	rGPCDAT |= LCD_spi_scl;
	 	Delay(1);
	 	datas = datas << 1;
	}
	rGPCDAT |= LCD_spi_cs;
}

static void lcd_samsung_LTV350QV_SPI_write(unsigned char reg,U16 datas)
{
	lcd_spi_process(LCD_command_INDEX,reg);
	lcd_spi_process(LCD_command_INSTR,datas);
}

static void samsung_LTV350QV_init(void)
{
	lcd_samsung_LTV350QV_SPI_write(9,0);
	Delay(100);
	lcd_samsung_LTV350QV_SPI_write(9,0x4000);
	lcd_samsung_LTV350QV_SPI_write(10,0x2000);
	lcd_samsung_LTV350QV_SPI_write(9,0x4055);
	Delay(500);
	lcd_samsung_LTV350QV_SPI_write(1,0x409d);
	lcd_samsung_LTV350QV_SPI_write(2,0x0204);
	lcd_samsung_LTV350QV_SPI_write(3,0x0100);
	lcd_samsung_LTV350QV_SPI_write(4,0x3000);
	lcd_samsung_LTV350QV_SPI_write(5,0x4003);
	lcd_samsung_LTV350QV_SPI_write(6,0x000a);
	lcd_samsung_LTV350QV_SPI_write(7,0x0021);
	
	lcd_samsung_LTV350QV_SPI_write(8,0x0c00);
	lcd_samsung_LTV350QV_SPI_write(10,0x0103);
	lcd_samsung_LTV350QV_SPI_write(11,0x0301);
	lcd_samsung_LTV350QV_SPI_write(12,0x1f0f);
	lcd_samsung_LTV350QV_SPI_write(13,0x1f0f);
	lcd_samsung_LTV350QV_SPI_write(14,0x0707);
	lcd_samsung_LTV350QV_SPI_write(15,0x0307);
	lcd_samsung_LTV350QV_SPI_write(16,0x0707);
	lcd_samsung_LTV350QV_SPI_write(17,0x0000);
	lcd_samsung_LTV350QV_SPI_write(18,0x0004);
	lcd_samsung_LTV350QV_SPI_write(19,0x0000);
	Delay(300);
	lcd_samsung_LTV350QV_SPI_write(9,0x4a55);
	lcd_samsung_LTV350QV_SPI_write(5,0x5003);
}

/**************************************************************
320×240 16Bpp TFT LCD数据和控制端口初始化
**************************************************************/
static void Lcd_Port_Init(void)
{
	rGPCUP = 0x0;		//上拉电阻
	rGPCCON = 0xaaaa56a8;	//初始化VD[7:0],VM,VFRAME,VLINE,VCLK

	rGPDUP = 0x0;		//上拉电阻
	rGPDCON = 0xaaaaaaaa;	//初始化VD[23:16][15:8]
	
	//rGPGUP = rGPGUP |(1<<4);	// Pull-up disable
	//rGPGCON = rGPGCON |(3<<8);	//GPG4=LCD_PWREN
}

/**************************************************************
320×240 16Bpp TFT LCD功能模块初始化
**************************************************************/
static void Lcd_Init(void)
{
	rLCDCON1 = (CLKVAL_TFT_240320 << 8) | ((PNRMODE) << 5) | (BPPMODE << 1);    	// TFT LCD panel,24bpp 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 = (HSPW_240320);
	rLCDCON5 = (INVVCLK) << 10) | ((INVVLINE) << 9) | ((INVVFRAME) << 8) | ((INVVD) << 7) | ((INVVDEN) << 6) | (BSWP<<1) | (HWSWP);	//FRM5:6:5,HSYNC and VSYNC are inverted----LQ035Q7DB02
	
	rLCDSADDR1 = (((U32)LCD_BUFER >> 22) << 21) | M5D((U32)LCD_BUFER >> 1);
	rLCDSADDR2 = M5D(((U32)LCD_BUFER + (320 * 480 * 2)) >> 1);
	rLCDSADDR3 = (((0) / 1) << 11) | (320 / 1);
	
	rLCDINTMSK |= (3); // MASK LCD Sub Interrupt
	rLPCSEL &= (~7); // Disable LPC3600
	rTPAL = 0; // Disable Temp Palette
}

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

/**************************************************************
320×240 16Bpp 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×240 16Bpp TFT LCD移动观察窗口
**************************************************************/
static void MoveViewPort(void)
{
    int vx=0,vy=0,vd=1;

    printf("\n*Move the LCD view windos:\n");
    printf(" press 8 is up\n");
    printf(" press 2 is down\n");
    printf(" press 4 is left\n");
    printf(" press 6 is right\n");
    printf(" press Enter to exit!\n");

    while(1)
    {
    	switch(getkey())
    	{
    	case '8':
	    if(vy>=vd)vy-=vd;    	   	
        break;

    	case '4':
    	    if(vx>=vd)vx-=vd;
    	break;

    	case '6':
                if(vx<=(SCR_XSIZE_TFT_320240-LCD_XSIZE_TFT_320240-vd))vx+=vd;   	    
   	    break;

    	case '2':
                if(vy<=(SCR_YSIZE_TFT_320240-LCD_YSIZE_TFT_320240-vd))vy+=vd;   	    
   	    break;

    	case '\r':
   	    return;

    	default:
	    break;
		}
	//printf("vx=%3d,vy=%3d\n",vx,vy);
	Lcd_MoveViewPort(vx,vy);
    }
}

/**************************************************************
320×240 24Bpp TFT LCD单个象素的显示数据输出
**************************************************************/
static void PutPixel(U32 x,U32 y,U32 c)

⌨️ 快捷键说明

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