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