#include"RGB_24Bit_LCDInit.h"
//这个头文件是用于定义寄存器地址相关的一些信息
//头文件下面有给出,注意该ARM芯片支持多窗口,这里使用的是Win0窗口
//u32 为 unsigned long
u32 (*LCD_BUFFER)[LCD_XSIZE];//当前使用的缓冲区指针
u32 LCD_BUFFER0[LCD_YSIZE][LCD_XSIZE];
u32 LCD_BUFFER1[LCD_YSIZE][LCD_XSIZE];
void LCD_Clear(u32 color)
{
int x,y;
for( x = 0;x<LCD_XSIZE;x++ )
{
for( y=0;y<LCD_YSIZE;y++ )
{
LCD_BUFFER[y][x] = color;
}
}
}
void LCD_Disable(void)
{
WINCON0 &= ~0x1;//1失能
}
void LCD_Enable(void)
{
WINCON0 |= 0x1;//1使能
}
void Win0_BufferSel(char bufferNum)//选择LCD缓冲区
{
LCD_Disable();
if(bufferNum==1)//缓冲区1
{
WINCON0 |= (0x00000001<<20);//选择为缓冲区1
LCD_BUFFER=LCD_BUFFER1;
}
else//缓冲区0
{
WINCON0 &= ~(1<<20);//选择为缓冲区0
LCD_BUFFER=LCD_BUFFER0;
}
LCD_Enable();
}
void LCD_Win0Init(void)
{
LCD_Disable();
GPICON = 0xaaaaaaaa;
GPJCON = 0xaaaaaaaa;
SPCON &= ~0x00000003;// 将SPCON寄存器中,最低两位设为01,即RGB I/F style
SPCON |= 0x00000001;
MIFPCON &= ~0x00000008;// (1)MOFPCON:SEL_BYPASS[3] value@0x7410800C 必须设置为0
VIDCON0 = VIDCON0_CONFIG;//视频主控制器0寄存器配置
VIDCON1 = VIDCON1_CONFIG;//视频主控制器1寄存器配置
VIDCON2 = 0;//视频主控制器2寄存器配置
VIDTCON0 = VIDTCON0_CONFIG;//视频时序控制0寄存器配置
VIDTCON1 = VIDTCON1_CONFIG;//视频时序控制1寄存器配置
VIDTCON2 = VIDTCON2_CONFIG;//视频时序控制2寄存器配置
WINCON0 = WINCON0_CONFIG;//窗口0控制寄存器配置
VIDOSD0A = VIDOSD0A_CONFIG;//窗口0位置控制A寄存器配置
VIDOSD0B = VIDOSD0B_CONFIG;//窗口0位置控制B寄存器配置
VIDOSD0C = VIDOSD0C_OSDSIZE;//窗口0位置控制C寄存器配置
VIDW00ADD2 = (0 << 13)|(LCD_XSIZE * 2);//缓冲区大小
//缓冲区0配置
VIDW00ADD0B0 = (u32)LCD_BUFFER0;//缓冲区0起始地址
VIDW00ADD1B0 = ((u32)LCD_BUFFER0&0xffffff+480*272);//缓冲区0结束地址
//缓冲区1配置
VIDW00ADD0B1 = (u32)LCD_BUFFER1;//缓冲区1起始地址
VIDW00ADD1B1 = (((u32)LCD_BUFFER1)&0xffffff+480*272 );//缓冲区0结束地址
LCD_BUFFER=LCD_BUFFER0;//初始化时,指向缓冲区0
DITHMODE=(1<<5)|(1<<3)|(1<<1)|(1<<0);//设置抖动
LCD_Enable();
}
/*
为该C源程序所用到的头文件 RGB_24Bit_LCDInit.h
I端口共16个只引脚,作LCD脚时,对应的寄存器2位应该设置为 "10"
GPI[0]-GPIp[15]分别对应LCD VD[0]-LCD VD[15]
I端口和J端口前8个引脚为LCD的数据位
J端口共12只引脚,作LCD脚时,和I端口情况一致
GPJ[8]-GPJ[11]分别对应HSYNC,VSYNC,VDEN,VCLK
*/
#define GPICON *((u32*)(0x7F008100))
#define GPIDAT *((u32*)(0x7F008104))
#define GPIPUD *((u32*)(0x7F008108))
#define GPJCON *((u32*)(0x7F008120))
#define GPJDAT *((u32*)(0x7F008124))
#define GPJPUD *((u32*)(0x7F008128))
//视频主控制寄存器
#define VIDCON0 *((u32*)(0x77100000))
#define VIDCON1 *((u32*)(0x77100004))
#define VIDCON2 *((u32*)(0x77100008))
//视频时序控制寄存器
#define VIDTCON0 *((u32*)(0x77100010))//配置视频输出时序和显示尺寸
#define VIDTCON1 *((u32*)(0x77100014))
#define VIDTCON2 *((u32*)(0x77100018))
//0窗口寄存器
#define WINCON0 *((u32*)(0x77100020))
#define VIDOSD0A *((u32*)(0x77100040))
#define VIDOSD0B *((u32*)(0x77100044))
#define VIDOSD0C *((u32*)(0x77100048))
//1窗口寄存器
#define WINCON1 *((u32*)(0x77100024))
#define VIDOSD1A *((u32*)(0x77100050))
#define VIDOSD1B *((u32*)(0x77100054))
#define VIDOSD1C *((u32*)(0x77100058))
#define VIDOSD1D *((u32*)(0x7710005C))
//2窗口寄存器
#define WINCON2 *((u32*)(0x77100028))
#define VIDOSD2A *((u32*)(0x77100060))
#define VIDOSD2B *((u32*)(0x77100064))
#define VIDOSD2C *((u32*)(0x77100068))
#define VIDOSD2D *((u32*)(0x7710006C))
//3窗口寄存器
#define WINCON3 *((u32*)(0x7710002C))
#define VIDOSD3A *((u32*)(0x77100070))
#define VIDOSD3B *((u32*)(0x77100074))
#define VIDOSD3C *((u32*)(0x77100078))
//4窗口寄存器
#define WINCON4 *((u32*)(0x77100030))
#define VIDOSD4A *((u32*)(0x77100080))
#define VIDOSD4B *((u32*)(0x77100084))
#define VIDOSD4C *((u32*)(0x77100088))
//各窗口缓冲寄存器
#define VIDW00ADD0B0 *((u32*)(0x771000A0))
#define VIDW00ADD0B1 *((u32*)(0x771000A4))
#define VIDW01ADD0B0 *((u32*)(0x771000A8))
#define VIDW01ADD0B1 *((u32*)(0x771000AC))
#define VIDW02ADD0 *((u32*)(0x771000B0))
#define VIDW03ADD0 *((u32*)(0x771000B8))
#define VIDW04ADD0 *((u32*)(0x771000C0))
#define VIDW00ADD1B0 *((u32*)(0x771000D0))
#define VIDW00ADD1B1 *((u32*)(0x771000D4))
#define VIDW01ADD1B0 *((u32*)(0x771000D8))
#define VIDW01ADD1B1 *((u32*)(0x771000DC))
#define VIDW02ADD1 *((u32*)(0x771000E0))
#define VIDW03ADD1 *((u32*)(0x771000E8))
#define VIDW04ADD1 *((u32*)(0x771000F0))
#define VIDW00ADD2 *((u32*)(0x77100100))
#define VIDW01ADD2 *((u32*)(0x77100104))
#define VIDW02ADD2 *((u32*)(0x77100108))
#define VIDW03ADD2 *((u32*)(0x7710010C))
#define VIDW04ADD2 *((u32*)(0x77100110))
#define VIDINTCON0 *((u32*)(0x77100130))
#define VIDINTCON1 *((u32*)(0x77100134))
#define W1KEYCON0 *((u32*)(0x77100140))
#define W1KEYCON1 *((u32*)(0x77100144))
#define W2KEYCON0 *((u32*)(0x77100148))
#define W2KEYCON1 *((u32*)(0x7710014C))
#define W3KEYCON0 *((u32*)(0x77100150))
#define W3KEYCON1 *((u32*)(0x77100154))
#define W4KEYCON0 *((u32*)(0x77100158))
#define W4KEYCON1 *((u32*)(0x7710015C))
#define DITHMODE *((u32*)(0x77100170))
#define WIN0MAP *((u32*)(0x77100180))
#define WIN1MAP *((u32*)(0x77100184))
#define WIN2MAP *((u32*)(0x77100188))
#define WIN3MAP *((u32*)(0x7710018C))
#define WIN4MAP *((u32*)(0x77100190))
#define MIFPCON *((u32*)(0x7410800c))//常规显示模式下该寄存器必须设置为0
#define SPCON *((u32*)(0x7F0081A0))
/*
使用的是WXCAT43的TFT 24位480*272LCD
下面是关于窗口0的配置,对应dataSheet里面的内容。
配置为 24位真彩RGB显示
*/
//视频主控制器0寄存器VIDCON0
#define VIDCON0_INTERLACE_F (0<<29)//渐行
#define VIDCON0_VIDOUT (0<<26)//RGB接口
#define VIDCON0_L1_DATA16 (0<<23)//I80 (LDI1)输出24bit模式 无关紧要
#define VIDCON0_L0_DATA16 (0<<20)//I80 (LDI0)输出24bit模式 无关紧要
#define VIDCON0_PNRMODE (0<<17)//显示格式 RGB格式
#define VIDCON0_CLKVALUP (0<<16)//选择CLKVAL_F 更新时序控制
#define VIDCON0_CLKVAL_F (14<<6)//时钟分频,最大66MHz VCLK=视频时钟源/(CLKVAL+1) CLKVAL>=1 VCLK推荐为9MHz
#define VIDCON0_VCLKFREE (0<<5)//VCLK 自由运行控制(只有在RGB IF 模式下有效):自由运行模式
#define VIDCON0_CLKDIR (1<<4)//用CLKVAL_F 寄存器划分时钟源
#define VIDCON0_CLKSEL_F (0<<2)//选择时钟源,HCLK = 133MHz
#define VIDCON0_ENVID (1<<1)//视频输出及显示控制信号禁止,该位用于关闭显示控制器不可与ENVID_F同时设置为0
#define VIDCON0_ENVID_F (1<<0)//单帧视频输出及显示控制信号禁止
#define VIDCON0_CONFIG (VIDCON0_INTERLACE_F|VIDCON0_VIDOUT|VIDCON0_L1_DATA16|VIDCON0_L0_DATA16|VIDCON0_PNRMODE|VIDCON0_CLKVALUP|VIDCON0_CLKVAL_F|VIDCON0_VCLKFREE|VIDCON0_CLKDIR|VIDCON0_CLKSEL_F|VIDCON0_ENVID|VIDCON0_ENVID_F)
//视频主控制器1寄存器VIDCON1
#define VIDCON1_IVCLK (0<<7)//时钟下降沿有效
#define VIDCON1_IHSYNC (1<<6)//HSYNC反向(负脉冲)
#define VIDCON1_IVSYNC (1<<5)//VSYNC常规(负脉冲)
#define VIDCON1_IVDEN (0<<4)//DE信号常规(上升沿有效)
#define VIDCON1_CONFIG (VIDCON1_IVCLK|VIDCON1_IHSYNC|VIDCON1_IVSYNC|VIDCON1_IVDEN)
//视频时序控制0寄存器VIDTCON0
#define VIDTCON0_VBPDE (0<<24)//在帧开始处,垂直后沿是不活动行的数量,在垂直同步过程之后(只对YVU 接口)
#define VIDTCON0_VBPD (1<<16)//垂直后沿是不活动行的数量,在垂直同步过程之后
#define VIDTCON0_VFPD (1<<8)//在帧末尾处,垂直前沿是不活动行的数量
#define VIDTCON0_VSPW (9<<0)//通过计算不活动行的数量,垂直同步脉冲宽度决定VSYNC 脉冲的高点品宽度。
#define VIDTCON0_CONFIG (VIDTCON0_VBPDE|VIDTCON0_VBPD|VIDTCON0_VFPD|VIDTCON0_VSPW)
//视频时序控制1寄存器VIDTCON1
#define VIDTCON1_VFPDE (0<<24)//在帧末尾处,垂直前沿是不活动行的数量,在垂直同步过程之前(只对YVU 接口)
#define VIDTCON1_HBPD (1<<16)//水平后沿是HSYNC 下降沿和有效数据开始之间的VCLK 周期的数量
#define VIDTCON1_HFPD (1<<8)//水平前沿是有效数据末端和HSYNC 上升沿之间的VCLK 周期的数量
#define VIDTCON1_HSPW (40<<0)//horizontal sync pulse width
#define VIDTCON1_CONFIG (VIDTCON1_VFPDE|VIDTCON1_HBPD|VIDTCON1_HFPD|VIDTCON1_HSPW)
//视频时序控制2寄存器VIDTCON2
#define VIDTCON2_LINEVAL (271<<11)//这些位决定显示的垂直尺寸 屏幕尺寸减1
#define VIDTCON2_HOZVAL (479<<0)//这些位决定显示的水平尺寸屏幕尺寸减1
#define VIDTCON2_CONFIG (VIDTCON2_LINEVAL|VIDTCON2_HOZVAL)
//窗口0控制寄存器WINCON0
#define WINCON0_nWide_Narrow (0<<26)//根据输入值范围选择从YCbCr 到RGB 的颜色空间转换等式。YCbCr 宽范围是2’00, YCbCr 窄范围是2’11,宽范围:Y/Cb/Cr:2514-0窄范围:Y:2314-16,Cb/Cr:240-16
#define WINCON0_ENLOCAL (0<<22)//选择数据访问方式:专用DMA
#define WINCON0_BUFSEL (0<<20)//缓冲区设置为0
#define WINCON0_BUFAUTOEN (0<<19) //双缓冲区自动控制位,由BUFSEL控制
#define WINCON0_BITSWP (0<<18)//位交换禁止
#define WINCON0_BYTSWP (0<<17)//字节交换禁止
#define WINCON0_HAWSWP (0<<16)//半子交换禁止
#define WINCON0_InRGB (0<<13)//此位指明源图像的输入颜色空间(只对ENLOCALI 有效):RGB
#define WINCON0_BURSTLEN (0<<9)//DMA 的突发最大长度选择:16BYTE
#define WINCON0_BPPMODE_F (11<<2)//24bit RGB565 配制
#define WINCON0_CONFIG (WINCON0_nWide_Narrow|WINCON0_ENLOCAL|WINCON0_BUFSEL|WINCON0_BUFAUTOEN|WINCON0_BITSWP|WINCON0_BYTSWP|WINCON0_HAWSWP|WINCON0_InRGB|WINCON0_BURSTLEN|WINCON0_BPPMODE_F)
//窗口0位置控制A寄存器VIDOSD0A
#define VIDOSD0A_OSD_LeftTopX_F (0 << 11)//左上角的OSD 图像像素横向屏幕坐标
#define VIDOSD0A_OSD_LeftTopY_F (0 << 0) //左上角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为偶数)
#define VIDOSD0A_CONFIG (VIDOSD0A_OSD_LeftTopX_F+VIDOSD0A_OSD_LeftTopY_F)
//窗口0位置控制B寄存器VIDOSD0B
#define VIDOSD0B_OSD_RightBotX_F (479<<11)//右下角的OSD 图像像素横向屏幕坐标
#define VIDOSD0B_OSD_RightBotY_F (271<<0)//右下角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为奇数)
#define VIDOSD0B_CONFIG (VIDOSD0B_OSD_RightBotY_F+VIDOSD0B_OSD_RightBotX_F)
//窗口0位置控制C寄存器VIDOSD0C
#define VIDOSD0C_OSDSIZE (480*272)//窗口尺寸=高*宽(字数)
#define LCD_XSIZE 480 //水平显示尺寸
#define LCD_YSIZE 272 //垂直显示尺寸
extern u32 (*LCD_BUFFER)[LCD_XSIZE];//指向当前使用的缓冲区指针
extern u32 LCD_BUFFER0[LCD_YSIZE][LCD_XSIZE];//全局显存
extern u32 LCD_BUFFER1[LCD_YSIZE][LCD_XSIZE];
/***************************************
相关函数
***************************************/
void LCD_Win0Init(void);
void LCD_Clear(u32 Color);
void Win0_BufferSel(char bufferNum);
void LCD_Disable(void);
void LCD_Enable(void);