这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 320,240LCD 320×240LCD液晶显示,问题,高手请进,谢谢帮忙!

共2条 1/1 1 跳转至

320,240LCD 320×240LCD液晶显示,问题,高手请进,谢谢帮忙!

院士
2006-09-17 18:14:16     打赏
320,240LCD 320×240LCD液晶显示,问题,高手请进,谢谢帮忙!



关键词: 240LCD     液晶显示     问题     高手     请进     谢谢         

院士
2006-12-22 22:43:00     打赏
2楼
问 #define SCR_XSIZE     (640)  
#define SCR_YSIZE     (480)

#define LCD_XSIZE     (240)
#define LCD_YSIZE     (320)

SCR_XSIZE  LCD_XSIZE 这两者有什么不同,我用的是320×240的液晶屏,SCR我想应该是screen的意思吧,为什么会是640×320呢?

void PutPixel(U32 x, U32 y, U8 c) {

#ifdef LCDMONO    
    if(x<SCR_XSIZE && y<SCR_YSIZE)
        frameBuffer1[(319-x)][(y)/32]=( frameBuffer1[(319-x)][(y)/32] & ~(0x80000000>>((y)%32)*1) )
            | ( (c)<< ((32-1-((y)%32))*1) );
#endif
//4录露禄叶茘
#ifdef LCDG4    
    if(x<SCR_XSIZE && y<SCR_YSIZE)
        frameBuffer4[(319-x)][(y)/16]=( frameBuffer4[(319-x)][y/16] & ~(0xc0000000>>((y)%16)*2) )
            | ( (c)<<((16-1-((x)%16))*2) );
#endif
//16录露禄叶茘
#ifdef LCDG16
    if(y<SCR_XSIZE && x<SCR_YSIZE)
        frameBuffer16[(319-x)][(y)/8]=( frameBuffer16[(319-x)][(y)/8] & ~(0xf0000000>>((y)%8)*4) )
            | ( (c)<<((8-1-((y)%8))*4) );
#endif
//256色
#ifdef LCDCOLOR
    if(x<SCR_XSIZE && y<SCR_YSIZE)
        frameBuffer256[(319-x)][(y)/4]=( frameBuffer256[(319-x)][y/4] & ~(0xff000000>>((y)%4)*8) )
            | ( (c)<<((4-1-((x)%4))*8) );
#endif
}

这个是象素的显示程序吧。

frameBuffer1[(319-x)][(y)/32]=( frameBuffer1[(319-x)][(y)/32] & ~(0x80000000>>((y)%32)*1) )
            | ( (c)<< ((32-1-((y)%32))*1) );

这个公式始终没有搞明白它的意思,我想请问一下高手们,frameBuffer这个量是什么作用,这个公式怎么来的呢?

谢谢
1: 怎么没人帮忙?高手帮帮忙吧! 2: SCR_XSIZE是虚拟屏幕尺寸,可以大于LCD实际尺寸的这样LCD只能显示虚拟屏幕的一部分 3: 很简单就是将颜色代码写入显存适当位置,但不改变其它位,如图所示

XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
       \
        \
         \_CCCC__

[(y)/32] 表明是单色显示,相应2位4色为 y/(32/2),4位16色是 y/(32/4) ,显存为字对齐,即32位,frameBuffer 是显存开始地址。
4: 能再帮个忙么?实在非常感谢各位高手的指导,谢谢!
#define M5D(n) ((n) & 0x1fffff)
extern unsigned int (*frameBuffer1)[SCR_XSIZE/32];    

rLCDSADDR1= (0x0<<27) | ( ((U32)frameBuffer1>>22)<<21 ) | M5D((U32)frameBuffer1>>1);

公式中 ((U32)frameBuffer1>>22)<<21 )
相当于左移一位,为何要这样写呢?左移以为之后讲它赋予LCDBANK做何解释?
M5D((U32)frameBuffer1>>1);这句赋予LCDBASEU,又何解释呢?

谢谢,小弟愚笨,望各位大哥能给予指导,谢谢!!!
5: ((U32)frameBuffer1>>22)<<21 )((U32)frameBuffer1>>22)<<21 )
是相当于frameBuffer1右移一位才对!相当于×2,这是如何解释呢? 6: 不对公式中 ((U32)frameBuffer1>>22)<<21 )
相当于左移一位,为何要这样写呢?左移以为之后讲它赋予LCDBANK做何解释?
M5D((U32)frameBuffer1>>1);这句赋予LCDBASEU,又何解释呢?
=============

你理解错了。 frameBuffer1>>22)<<21  不等于右移一位!当frameBuffer1右移22后,低22位已经被挤掉了,再左移21位后,低21全部都是 0 了。所以最后保留的是地址中的高27-22位,即段地址。

M5D((U32)frameBuffer1>>1 式中的M5D()宏定义是用来屏蔽高位段地址,即保留低21位,但没有0位,因为根据控制器读地址的方式,这一位无效。  7: 磁场大侠,感谢您多次的帮忙,谢谢!void _PutPixelG4(U32 x,U32 y,U8 c)
{
if(x<SCR_XSIZE && y<SCR_YSIZE)
        frameBuffer4[(x)][(y)/16]=( frameBuffer4[(x)][(y)/16] & ~(0xc0000000>>((y)%16)*2) )
            | ( (c)<<((16-1-((y)%16))*2) );

}
我的液晶是320×240
以上 这是4基色画象素的程序
在执行Glib_Line(0,0,100,100,1);液晶显示如图1所示

但我想更改坐标轴显示如图2所示,因此我更改程序如下
void _PutPixelG4(U32 x,U32 y,U8 c)
{
if(x<SCR_XSIZE && y<SCR_YSIZE)
        frameBuffer4[(319-x)][(239-y)/16]=( frameBuffer4[(319-x)][(239-y)/16] & ~(0xc0000000>>((239-y)%16)*2) )
            | ( (c)<<((16-1-((239-y)%16))*2) );

}
我想说明的是,这段程序在进行单基色液晶显示的时候 ,坐标轴可以更改过来,显示图2情况。但是在进行4基色显示的时候 ,却死了。程序运行不了Glib_Line(0,0,100,100,1);这个语句。这是为何?

单基色ok,但是4基色却通过不了! 8: 反仅从你发的程序来看,怀疑你把X、Y弄反了,或者是它们的实际取值范围和你理解的不一样。比如,或许X向是短边,而Y向是长边,等。

检查方法是:1. 确认原点位置,确认X、Y轴方向;2. 在不转换坐标系的情况下,你试一下屏幕所有区域是否都能正常显示,然后再转换坐标。

对于二维数组的第二个下标,它增减一代表增减一个数据单元,而第一个下标代表增减一行。所以,如果仍有问题,你尝试在不转换坐标的情况下,将X和Y对换一下位置。

另外你再检查程序其它地方有没有问题。

共2条 1/1 1 跳转至

回复

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