|
声明:哎,写这个东西也不容易啊,尤其是中断寄存器和这个LCD,我花费的时间很多,贴到论坛很快会沉下去。所以,接下来的试验我不再往论坛贴了,如果你喜欢,请来我的博客:http://chenjunqiang08.blog.163.com/ 。文章转载,请注明出处。谢谢!
试验目的:操作东华LCD,了解LCD使用方法。
试验环境:tq2440开发板+J-link+ADS
试验过程:
1.连上j-link,开发板上电。
2.c语言编写试验代码,并包含所需要的启动代码等文件。
3.设置ADS的RO Base为0x30000000,仿真。
4.重新设置ADS的RO Base为0x00000000,RW Base为0x33000000。下载到板子的0地址,观察现象。
5.试验中的问题:
问题a: TQ2440的板子上带的是东华的屏,这个屏跟三星的不一样,所以设置也不一样,rLCDCON1-rLCDCON5(参考数据手册18/30)按东华的手册来设。其中主要是rLCDCON5(参考手册19/30)的设置,时序图如下:
东华的:
三星的:
可以看到明显的行同步和帧同步明显不同,所以和三星的参考程序设置不一样。具体设置参考程序。
问题b:设置ADS的RO Base为0x00000000,RW Base为0x33000000。
看ADS的提示信息如下:================================================================================
Total RO Size(Code + RO Data) 2332 ( 2.28kB)
Total RW Size(RW Data + ZI Data) 153600 ( 150.00kB)
Total ROM Size(Code + RO Data + RW Data) 2332 ( 2.28kB)
================================================================================
RW段大小150k,是显示缓冲区的大小。所一只设置RO Base为0x00000000是不行的,4k的大小存不下RW段,所以把RW Base为0x33000000。
6.试验参考代码:
/*******************Phoenix2440-东华屏试验************************/
/*本实验是针对东华屏的测试,请一定要注意rLCDCON的设置尤其是rLCDCON5*/
#include "2440addr.h"
//define a array for LCD buf;为显示缓冲区定义空间
volatile unsigned short LCD_BUF1[240][320];
//initialize
void Lcd_Init()
{
//配置端口,用作LCD
rGPCUP=0x0;
rGPCCON=0xaaaa56a9;// 0xaaaa02a9;
rGPDUP=0x0;
rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
//我的HCLK=100MHZ,如果你不知道你的,请参考我的UART试验
//VCLK=100/[(7+1)*2]=6.25
rLCDCON1=(7<<8)|//CLKVAL,6.25MHZ
(0<<7)|//VM
(3<<5)|(12<<1)|0;
//按东华手册来设
rLCDCON2=(3)| //VSPW
(15<<24)| //VBPD
((240-1)<<14)| //LINRVAL
(12<<6); //VFPD
//按东华手册来设
rLCDCON4=(13<<8)|
30; //HSPW
rLCDCON3=(38<<19)| //HBPD
((320-1)<<8)| //HOZVAL
(20); //HFPD
//为什么我们的东华屏不能显示?就在这里,信号的极性没设对,
//东华和三星的不一样
rLCDCON5=(0<<7)| //VD数据极性,0-正常,////绝对正确///。
(1<<11)| //0-5:5:5:1,1-5:6:5////绝对正确///。
(0<<1)| //字节交换.////绝对正确///。
(0)| //半字节交换.////绝对正确///。
(1<<9)| //HSYNC,水平。行同步。////绝对正确///。
(1<<8)| //VSYNC,垂直。帧同步。////绝对正确///。
(0<<6)| //VDEN的极性,VM。
(1<<5)| //PWREN极性
(1<<10)| //0-VCLK的下降沿读数据,1-上升沿
(0<<4); //LEND极性
// 下面三句是设置显示缓冲区的地址,不说了
rLCDSADDR1=(((unsigned int)LCD_BUF1>>22)<<21)|(((unsigned int)LCD_BUF1>>1)&0x1fffff);
rLCDSADDR2=((((unsigned int)LCD_BUF1+(320*240))>>1)&0x1fffff);
rLCDSADDR3=(0<<11)|320;
rLCDINTMSK|=3; // MASK LCD Sub Interrupt
rTPAL=0; // Disable Temp Palette
}
void delay(int time)
{while(time--);}
void Main()
{
int i,j,k=0;
Lcd_Init();
rLCDCON1|=1; // ENVID=ON;控制信号输出使能
rTPAL=(1<<24)|(250<<16);//display RED,满屏红
delay(999999);
rTPAL=(1<<24)|(250<<8);//display GREEN
delay(999999);
rTPAL=(1<<24)|(250);//display BLUE
delay(999999);
rTPAL=(0<<24);// Disable Temp Palette
while(1)
{//下面是为每一个像素点赋值。
for(i=0;i<240;i++)
{
for(j=0;j<320;j++)
{//这三句为什么这么麻烦?是为了让屏幕的颜色变化,请直接无视
LCD_BUF1[j]=(k|(~k<<6)|((0xaa&k)<<11))&0xffff;
if(k++==32)
k=0;
}
delay(999999);
}
delay(999999);delay(999999);
}
} |
|