lcd640.c
来自「博创2410的实验代码」· C语言 代码 · 共 116 行
C
116 行
#include <stdarg.h>
#include <stdio.h>
#include "inc/lcd320.h"
#include "inc/macro.h"
#include "inc/reg2410.h"
#define LCDCON1_CLKVAL (1<<8)
#define LCDCON1_MMODE (0<<7)
#define LCDCON1_PNRMODE (0x3<<5) //TFT LCD
#define LCDCON1_BPPMODE (0xc<<1)//16位TFT模式
#define LCDCON1_ENVID (1)
#define LCDCON2_VBPD 32//32
#define LCDCON2_LINEVAL 479
#define LCDCON2_VFPD 9//9
#define LCDCON2_VSPW 1//
#define LCDCON3_HBPD 47//49
#define LCDCON3_HOZVAL 639
#define LCDCON3_HFPD 15//14
#define LCDCON4_HSPW 95//95
#define LCDCON5_FRM565 1//
#define LCDCON5_INVVCLK 0
#define LCDCON5_INVVLINE 1
#define LCDCON5_INVVFRAME 1
#define LCDCON5_INVVD 0
#define LCDCON5_INVVDEN 0
#define LCDCON5_INVPWREN 0
#define LCDCON5_INVLEND 0
#define LCDCON5_PWREN 1
#define LCDCON5_ENLEND 0
#define LCDCON5_BSWP 0
#define LCDCON5_HWSWP 1
#define BPP24BL 0
#define TPALEN 1
#define LPC_EN 1
#define FIWSEL 0
#define INT_FrSyn 1
#define INT_FiCnt 1
#define MVAL 13
U16* pLCDBuffer16I1=(U16*)0x32000000;
U16* pLCDBuffer16I2=(U16*)0x32096000;
U32 LCDBufferII2[LCDHEIGHT][LCDWIDTH];
U16 LCDBufferII1[307200];
/*LCD显示初始化设置函数*/
void LCD_Init()
{
U32 i;
U32 LCDBASEU,LCDBASEL,LCDBANK;
/*以下四条语句设置GPGC,GPGD端口为LCD控制端口*/
rGPCUP=0xffffffff; // Disable Pull-up register
rGPCCON=0xaaaaaaaa; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
rGPDUP=0xffffffff; // Disable Pull-up register
rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
// TFT: VCLK = HCLK / [(CLKVAL+1) * 2] ( CLKVAL>=0 )
rLCDCON1=0|LCDCON1_BPPMODE|LCDCON1_PNRMODE|LCDCON1_MMODE|LCDCON1_CLKVAL;// LCD控制寄存器设置,参见参数宏定义和手册P397-P400
// disable LINEVAL=hight-1=480-1=479
rLCDCON2=(LCDCON2_VBPD<<24)|(LCDCON2_LINEVAL<<14)|(LCDCON2_VFPD<<6)|LCDCON2_VSPW;
//320x240LCD LINEBLANK=15 (without any calculation)
rLCDCON3=(LCDCON3_HBPD<<19)|(LCDCON3_HOZVAL<<8)|LCDCON3_HFPD;//HOZVAL=width-1=640-1=639
//MVAL对TFT无效
rLCDCON4=LCDCON4_HSPW|(MVAL<<8);
//设定24bpp显示模式时,视频资料在显示缓冲区中的排列顺序(即低位有效还是高位有效)。对于16bpp的64K色显示模式,该设置位无意义。
//CPU的LCD控制器输出的时序默认是正脉冲,而LCD需要VSYNC(VFRAME)、VLINE(HSYNC)均为负脉冲,因此 INVLINE 和 INVFRAME 必须设为"1",即选择反相输出。
//PWREN 为LCD电源使能控制。ENLEND 对普通的TFT屏无效,可以不考虑。
rLCDCON5=(BPP24BL<<12)|(LCDCON5_FRM565<<11)|(LCDCON5_INVVCLK<<10)|(LCDCON5_INVVLINE<<9)|(LCDCON5_INVVFRAME<<8)|(LCDCON5_INVVD<<7)|\
(LCDCON5_INVVDEN<<6)|(LCDCON5_INVPWREN<<5)|(LCDCON5_INVLEND<<4)|(LCDCON5_PWREN<<3)|(LCDCON5_ENLEND<<2)|(LCDCON5_BSWP<<1)|LCDCON5_HWSWP;
LCDBANK=0x32000000>>22;//显示缓冲区地址
LCDBASEU=0x0;
LCDBASEL=LCDBASEU+(480)*640;
//rLCDADDR1=0x33000000>>1;
//These bits of LCDBANK indicate A[30:22] of the bank location for the video buffer in the system memory.
rLCDADDR1= (LCDBANK<<21)|LCDBASEU; //设置LCDADDR1寄存器,参见手册P403
//LCDBASEL = ((the fame end address) >>1) + 1= LCDBASEU +(PAGEWIDTH+OFFSIZE)x(LINEVAL+1)
rLCDADDR2=LCDBASEL; //设置LCDBASEL,参见手册有关说明
rLCDADDR3= (640)|(0<<11); //设置显示的宽度和偏移量,参见手册有关说明
rLCDINTMSK=(INT_FrSyn<<1)|INT_FiCnt;//|(FIWSEL<<2);设置中断屏蔽
rLCDLPCSEL=0; //LPC3600,显示伴侣设置,未使用
rTPAL=(0<<24); //调色板设置,参见手册P407
for(i=0;i<640*480;i++)
//*(pLCDBuffer161+i)=0xffff;
*(pLCDBuffer16I1+i)=0x0; //清屏
//hudelay(5000);
rLCDCON1+=LCDCON1_ENVID; //打开LCD
}
/*屏幕刷新函数*/
void LCD_Refresh()
{
int i,j;
U32 lcddata;
U16 pixcolor; //一个像素点的颜色
U8* pbuf=(U8*)LCDBufferII2[0];
U32 LCDBASEU,LCDBASEL,LCDBANK;
for(i=0;i<LCDWIDTH*LCDHEIGHT;i++){
pixcolor=((pbuf[0]&0xf8)<<11)|((pbuf[1]&0xfc)<<6)|(pbuf[2]&0xf8); //变换RGB
pbuf+=4; //下一象素
//LCDBufferII1[i]=pixcolor;
*(pLCDBuffer16I2+i)=pixcolor; //数据送至显示缓冲区
}
//for(i=0;i<LCDWIDTH*LCDHEIGHT;i++)
//*(pLCDBuffer16I2+i)=LCDBufferII1[i];
LCDBANK=0x32096000>>22; //重新设置显示缓冲区地址,下面各值定义与上类似
LCDBASEU=(0x32096000<<9)>>10;
LCDBASEL=LCDBASEU+(480)*640;
//rLCDADDR1=0x33000000>>1;
rLCDADDR1= (LCDBANK<<21)|LCDBASEU;
rLCDADDR2=LCDBASEL;
rLCDADDR3= (640)|(0<<11);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?