共3条
1/1 1 跳转至页
320,240LCD 320×240LCD液晶显示,问题,高手请进,谢谢帮忙!
问
#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对换一下位置。
另外你再检查程序其它地方有没有问题。
#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对换一下位置。
另外你再检查程序其它地方有没有问题。
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |