|  | 
 
| 声明:哎,写这个东西也不容易啊,尤其是中断寄存器和这个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);
 }
 }
 | 
 |