OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » S3C44B0X,G35LCD 【讨论】S3C44B0X,G35LCD彩色液晶驱

共2条 1/1 1 跳转至

S3C44B0X,G35LCD 【讨论】S3C44B0X,G35LCD彩色液晶驱动程序

院士
2006-12-22 22:43:00    评分
S3C44B0X,G35LCD 【讨论】S3C44B0X,G35LCD彩色液晶驱动程序



关键词: S3C44B0X     G35LCD     讨论     彩色液晶         

院士
2006-12-22 22:43:00    评分
2楼
问 S3C44BOX,当使用G35,320*240,256彩色液晶屏时,遇到一些问题,由于我才大三,
第一次编写显示驱动程序,第一次使用S3C44BOX所以遇到了很多问题,目前算是入了点门,
希望我的问题能解决。大家一起学习,我的邮箱是:zbz38@163.com
下面问题中也加入了自己的理解。
(1)在Port_Init()的问题:
关键词:rPCONC,rPDATC,rPUPC,rPCOND,rPDATD,rPUPD,frameBuffer256
我看到对rPCONC、rPDATC、rPUPC、rPCOND、rPDATD、rPUPD有好几种赋值:
有rPCONC=0x0f05f555;//0x0f00ff54;//0xffffff;//0x5f55ffff;//0x0f051455;
  rPDATC=0xffff;//0x3fff;
  rPUPC=0x3000;//0x30c0;//0x0;

  rPCOND=0xaaaa;//0x8aaa;
  rPDATD=0xff;
  rPUPD=0x
【我的问题】针对G35是哪个值呢,rPCONC、rPCOND寄存器各个 位 的具体含意是什么呢?
            rPDATC、rPDATD里的各个 位 具体含意是什么呢?
PS:目前理解:当rPCOND=0xaaaa时,说明Group D端口的所有引脚都给LCD控制器使用,
   GPD[3:0]-VD[3:0],GPD[4]-VCLK,GPD[5]-VLINE,GPD[6]-VM,GPD[7]-VFRAME
   当rPCONC是上面的某个值时(不知道哪个),说明Group C端口的部分引脚给LCD控制器使用,
   GPC[7:4]-VD[7:4]
   我在程序中,没有看到讲画图时将数据通过rPDATC[7:4]和rPDATD[3:0]输出到G35 LCD上面显示,
   而是通过对frameBuffer256的赋值来显示,我理解为通过SDRAM缓冲区的赋值显示数据,我也这么
   的给frameBuffer256赋值,什么都没有显示。我也没看到对VLINE,VFRAME等的操作,我理解为对
   frameBuffer256的赋值已经包括了X,Y的操作,但我没办法演示,因为压根我的程序连基本的显示
   都没实现。另外frameBuffer256是如何将数据送到了VD[7:0]的,我不清楚,因为我不知道frameBuffer256
   的地址以及VD[7:0]的地址,我也没明白在哪儿操作页码,以实现动画。
   附:程序中是这样给frameBuffer256开辟内存的:
   frameBuffer256=(unsigned int (*)[SCR_XSIZE/4])malloc(ARRAY_SIZE_COLOR);

(2)在Lcd_Init()中的问题:
关键词:rLCDCON1,rLCDCON2,rLCDSADDR1,rLCDSADDR2,rLCDSADDR3,frameBuffer256首地址,调色板

源程序代码:rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);
        // disable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
        既然是WDLY=8clk,WLH=8clk,为什么rLCDCON1的[9:8]=11B,[11:10]=11B呢,我查了一下
        说明文档:[9:8]=11B,[11:10]=11B时是16clk的,8clk的话是01B,这儿的代码是不是错了呢?
        是不是要修正为:
        rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x1<<8)|(0x1<<10)|(CLKVAL_COLOR<<12);

源代码:rLCDSADDR1= (0x3<<27) | ( ((U32)frameBuffer256>>22)<<21 ) | M5D((U32)frameBuffer256>>1);
        // 256-color, LCDBANK, LCDBASEU
        (其中:#define M5D(n) ((n) & 0x1fffff))
        该代码个人理解为将 视频缓冲区的首地址的高6位[26:21] 对应到 系统存储区frameBuffer256的首地址的高6位[27:22],
        显示缓冲区首地址的低21位(即显示缓冲区上部地址) 对应到 系统存储区frameBuffer256的首地址的低21位[21:1]
        因此视频缓冲区的首地址构成:[26:0]分成两部份:[26:21]+[20:0]分别指向被系统缓冲区的A[27:22]和A[21:1];
        这就是说在系统中存放视频的存储区(这就是真正的视频缓冲区)首地址为:frameBuffer256的首地址。
        问题是:系统存储区的A[0]怎么办,一半的数据不是丢失了吗。
        比如:0: ;frameBuffer256   = 0x0c 00 00 00   ;执行(*frameBuffer256)=data0;
              1: ;frameBuffer256   = 0x0c 00 00 01   ;执行frameBuffer256++,然后(*frameBuffer256)=data1;
              2: ;frameBuffer256   = 0x0c 00 00 02   ;执行frameBuffer256++,然后(*frameBuffer256)=data2;
              3: ;frameBuffer256   = 0x0c 00 00 03   ;执行frameBuffer256++,然后(*frameBuffer256)=data3;
              由于frameBuffer256地址的最低位[0]并没有付给视频缓冲区,这意味着上面的第0行语句赋值data0将被第1行语句
              赋值data0所取代,同理第3行取代第2行赋值。相当于数据丢失了一半。
        数据丢失就会失真,这个东东我就不理解了。
        另外,【frameBuffer256的首地址在哪里定义的呢?】

源代码:rLCDSADDR2= M5D((((U32)frameBuffer256+(SCR_XSIZE*SCR_YSIZE))>>1)) | (MVAL<<21);
        即视频缓冲区的末地址

源代码:rLCDSADDR3= (LCD_XSIZE/2) | ( ((SCR_XSIZE-LCD_XSIZE)/2)<<9 );
        对虚拟显示屏的设置(PAGEWIDTH)|(OFFSIZE),16BIT为单位,由于采用8位一个象素的液晶显示屏,因此要除2
        
源代码:rREDLUT  =0xfdb96420;
    rGREENLUT=0xfdb96420;
    rBLUELUT =0xfb40;

    rDITHMODE=0x0;
    rDP1_2 =0xa5a5;      
    rDP4_7 =0xba5da65;
    rDP3_5 =0xa5a5f;
    rDP2_3 =0xd6b;
    rDP5_7 =0xeb7b5ed;
    rDP3_4 =0x7dbe;
    rDP4_5 =0x7ebdf;
    rDP6_7 =0x7fdfbfe;
        我只知道是颜色值查找对应表,不知道这些具体数字是怎么来的?
(3)在void Lcd_DispON(),void_Lcd PowerReset(void),void PowerUp(void)
关键词:rPDATC[8],rPDATC[4],rPDATC[5]

源代码:void Lcd_DispON(void)
        {
      Delay(5000);
          rPDATC = ( rPDATC & (~(1<<8)) );
          Delay(5000);
        }
        从这个函数中可以知道rPDATC[8]控制液晶屏的开和关
问题是:在哪儿指定了用rPDATC[8]来控制它的开和关的?
        如果是Port_Init()里面的rPCONC,具体是怎么决定的?
源代码:void Lcd_PowerReset(void)    
        {
          U8 i;
          rPDATC = ( rPDATC | 3<<4 );        //crtl=1,adj=1
          for(i=0;i<1;i++);
          rPDATC = ( rPDATC & (~(1<<5)) );    //ctrl=0
          for(i=0;i<2;i++);
          rPDATC = ( rPDATC | 1<<5 );        //ctrl=1
          for(i=0;i<1;i++);
          rPDATC = ( rPDATC & (~(1<<4)) );    //adj=0
        }
源代码:void Lcd_PowerUp(void)
        {
          U8 i;
          rPDATC = ( rPDATC | 2<<4 );        //ctrl=1,adj=0
          for(i=0;i<2;i++);
          rPDATC = ( rPDATC | 1<<4 );        //adj=1
          for(i=0;i<1;i++);
          rPDATC = ( rPDATC & (~(1<<4)) );    //adj=0
          for(i=0;i<2;i++);
        }
        从上面这两个函数猜出:ctrl=rPDATC[4],adj=rPDATC[5];
问题:  这个两个变量是怎么控制电源的?同时为什么是rPDATC[4],rPDATC[5],是在哪儿给它们指定的?
        如果是Port_Init()里面的rPCONC,具体是怎么决定的?
(4)显示屏的换页问题
     一般动画的实现可以有三种方式:
     1、对象颜色画对象,背景颜色画对象,不断移动实现动画
     2、保存画面到缓冲区,移动坐标,将缓冲区的内容输出到画面,实现动画
     另外一种3、就是通过换页方式实现动画
     不知道S3C44BOX,G35_LCD,是怎么实现换页操作的

以上就是我目前的问题,尤其是第一个问题,关于rPCONC问题和显示缓冲区frameBuffer256首地址在哪儿被指定的问题?
谢谢大家帮忙看看,点播点播。 1: 只要花心思还是很容易入门的,我是第一次搞这个G35液晶驱动终于搞出来了,上面的问题,大家可以继续探讨。G35是240*320不是320*240,并且它的坐标是在右下角,而不是左上角,选择扫描方式时最好用4-dual方式,另外HOZVAL的值大家要小心,不是按说明书上给的值,大家根据需要尽情去改动,不要拘束。另外,rPCONC,rPCOND直接参考44BOX的说明书就可以了注意是英文版,里面有详细介绍。而frameBuffer在开辟空间时,给分配了内存的一个首地址,这根据需要来。其他的应该没什么大问题了。如果要支持汉字,可以自己写一个简单的软件,将字库的汉字点阵数据COPY出来供给程序就可以了,不用自己凑一个汉字,太累了。
只要花心思还是很容易入门的,我是第一次搞这个,虽然花了5,6天就搞这个S3C44BOX上G35的驱动,但还是学到不少东西,大家共同努力。  2: 我的理解: 真正的RGB 0f 0f ff 插表的只是高4位支持一下!
你的问题大概看了一下,因为这几天把板子的几个功能调了一下,昨天今天都在液晶屏这里。基本上搞明白,但是有一个不是很清楚,你怎么理解颜色表。
redlut    0xfdb96420
greenlut  0xfdb96420
bluelut   0xfb40
我的系统(44b stn 640*480 )
一个字节对应一个像素点,332格式。那么0x03这个字节为什么就是蓝色呢?
分析: 0x03(000 0000 11) 查表 red 0  green 0 bule f
问题:那么 RGB 0 0 15根本就不可能培出来蓝色 ????那怎么回是蓝色呢?
我的理解: 真正的RGB 0f 0f ff 插表的只是高4位。但是好像没找到那里有介绍的???

//++++++++++++++++++++++++
我自己编写了 Lcd_Printf 仿照Uart_Printf ,功能基本相同。自己做的字库,只有ASCII  里面的常用字符。要的话我发给你。不过给你之前我的自己整理以下:)。
第一次打这么字。  3: 要啊很想要啊,你发到我的邮箱里:zbz38@163.com
:) 4: 本来今天想修改一下timer5中断,定时将rtc送到液晶显示但是不知道咋回事,我的中断进不了了,你调中断了吗??? 5: 发送了,不过没有整理的。 6: 收到收到谢谢:) 7: 我的定时器也搞定了,使用定时器5,定时1s 刷新时间。 8: 能将您的程序转发我一份吗,我也在做lcd非常感谢!我的email:huhaohoo@eyou.com

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]