ARM中TFT点屏的实验
来源:互联网 发布:江涵usb时尚创意数据 编辑:程序博客网 时间:2024/06/16 03:44
作者:gurongjiang
转自:http://bbs.ednchina.com/BLOG_ARTICLE_211557.HTM
大体过程如下:
一系列初始化LCD的相关寄存器:
要点: LCD的显示是直接在ram中开辟4M的空间对应在lcd中显示
lcdbank=0x180,用于对ram寻址
lcdbaseu=0x80000,上部扫描地址
lcdbasel 下部扫描地址
二者的设置可以滚动
另外注意lcd时钟,行场扫描的计算公式
颜色是个16bpp,24位的数值(自动查找表)
为了回答一些人的提问补充一些要点:
这里我再强调一下要点,因为GUI移植成败与它直接相关:
1) 初始化LCD的IO口
2) 开启LCD的背光
3) 配置LCDCON1,他主要设置的是vclk(hclk/(clkval+1)*2,clkval自定义),vclk‘一般应该大于6.5M。设置选择了TFT,16bbp的颜色深度等等
4) 配置LCDCON2,3,4。根据时序图(与LCD液晶datasheet相关)例如:
设置:一下的字域:他们直接影响屏幕的偏移,可以手动慢慢调试也可以计算:
#define VFPD (1) //垂直同步信号的前肩
#define VSPW (1) //垂直同步信号的脉宽
#define HBPD (22) //水平同步信号的后肩
#define HFPD (18) //水平同步信号的前肩
#define HSPW (18) //水平同步信号的脉宽
方法如下:
VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图,VBPD=t3/t6=1.02 mS/31.77μs=32。
VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,
是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,如图,VFPD=t5/t6=0.35 ms/31.77μs=11。
VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。如图,VSPW=t2/t6=0.06 ms/31.77μs=2。
HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数,如图,VBPD=t7×VCLK=1.89 μs×25MHz=47。
HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,如图,HFPD=t9×VCLK=0.94 μs×25 MHz="24"。
HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数,如图,HSPW=3.77μs×25 MHz="94"。
代码:实现了几种颜色的切换
void LCD_Init(void)
{
// LCD port initialize.
rGPCUP = 0xFFFFFFFF; //上拉
rGPCCON = 0xAAAAAAAA; //选择lcd模式
rGPCCON = 0xAAAAAAAA;
rGPDUP = 0xFFFFFFFF;
rGPDCON = 0xAAAAAAAA;
rGPGCON &= ~(3 << 8); //选择lcd power
/* Set LCD_PWREN as output*/
rGPGDAT |= (1 << 4); /* 点亮LCD,Backlight ON*/
rLCDCON1=(7<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0; //设置vclk=hclk/7*2,选择场同步mmode=1,选择tft,16bpp,禁止viedio
// TFT LCD panel,16bpp TFT,ENVID=off
rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW); //设置帧速率
rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);//设置帧速率,与lcd手册数据有关
rLCDCON4=(MVAL<<8)|(HSPW);
rLCDCON5=(1<<11)|(1<<9)|(1<<8)|(1<<3)|(1<<0); //FRM5:6:5,HSYNC and VSYNC are inverted ,初始化tft
rLCDSADDR1=((FRAMEBUF_DMA_BASE>>22)<<21)|M5D(FRAMEBUF_DMA_BASE>>1);//lcdbank=0x180,lcdbaseu=0x80000,上部扫描地址
rLCDSADDR2=M5D( (FRAMEBUF_DMA_BASE+(LCD_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );//下部扫描地址
rLCDSADDR3=(((LCD_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);//偏移大小+虚拟屏幕宽,这里与原屏幕一样
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
rLPCSEL&=(~7); // Disable LPC3600
rTPAL=0; // Disable Temp Palette
rLCDCON1 |= 1;
}
void LCD_Draw(void)
{
int I;
long int *pDisp=(long int *)FRAMEBUF_DMA_BASE; //lcd显示的buffer
//long int *addr=(long int *)(0x34000000);
while(1)
{
for(I=0;I<(LCD_XSIZE_TFT* LCD_YSIZE_TFT/2);I++)
{
*pDisp++=0xFF00FF00; //颜色为32位,因为选择了16bpp,就是 5位red 6位green 5位blue
//*pDisp++=*addr++;
}
delay05(200); //延时一秒
pDisp=(long int *)FRAMEBUF_DMA_BASE;
for(I=0;I<(LCD_XSIZE_TFT* LCD_YSIZE_TFT/2);I++)
{
*pDisp++=0x00FF00FF; //颜色为32位,因为选择了16bpp,就是 5位red 6位green 5位blue
//*pDisp++=*addr++;
}
delay05(200); //延时一秒
pDisp=(long int *)FRAMEBUF_DMA_BASE;
for(I=0;I<(LCD_XSIZE_TFT* LCD_YSIZE_TFT/2);I++)
{
*pDisp++=0xFFFF0000; //颜色为32位,因为选择了16bpp,就是 5位red 6位green 5位blue
//*pDisp++=*addr++;
}
delay05(200); //延时一秒
pDisp=(long int *)FRAMEBUF_DMA_BASE;
}
}
int main(void)
{
LCD_Init();
LCD_Draw();
return 0;
}
- ARM中TFT点屏的实验
- TFT屏的点距
- TFT中Vcom的作用
- 基于ARM芯片S3C2410的TFT-LCD驱动方法
- TFT和IPS屏的区别
- 一个SPI接口的TFT屏ILI9341
- WXGA TFT和XGA TFT的区别
- JZ2440开发板-TFT LCD实验
- TFT屏同步信号
- TFT
- TFT LCD的各种参数设置
- TFT ST7735的Netduino驱动
- arm汇编实验-arm指令集的应用
- ARM汇编的.balignl对齐实验
- 【ARM学习笔记】实验一:S3C2440A的GPIO输出实验
- 【ARM学习笔记】实验二:S3C2440A的GPIO输入实验
- ARM S3C44B0X驱动TFT真彩屏成功,发几个图
- 中、小尺寸TFT-LCD系统时序控制模块的设计
- 开始写博客,为了写思考
- VS2005+WINDDK+Driver Studio 3.2编译出第一个测试驱动程序
- STM32之RCC的配置
- imdb官网xpath大全[旧版镜像]
- HBase源码分析之org.apache.hadoop.hbase.catalog包
- ARM中TFT点屏的实验
- 杭电1867
- Android 拍照 邮件小结
- Python的50个模块,满足你各种需要
- HDU 2136 Largest prime factor
- org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist:
- 在Wince中添加微软雅黑字体
- 全球移动互联网大会:Yuri Milner——最成功的社交媒体投资人
- 杭电1869