共2条
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对换一下位置。
另外你再检查程序其它地方有没有问题。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? | |
抽奖了,抽奖了,金升阳医疗电源 |
打赏帖 | |
---|---|
【换取手持数字示波器】+与同事对定时器输出相位可调PWM移相全桥控制分享被打赏50分 | |
【换取手持数字示波器】+LP-MSPM0L1306开发板试用体验+串口被打赏40分 | |
CC-RL编译器相关问题求助被打赏10分 | |
【换取手持数字示波器】+与同事对ESP-12开发调试经验分享被打赏50分 | |
【换取手持数字示波器】+同事tek示波器调试spi解析被打赏50分 | |
【换取手持数字示波器】+2.6寸墨水屏调试经验被打赏50分 | |
换取手持数字示波器+个人开关电源的设计经验被打赏50分 | |
【换取手持数字示波器】+【APT32F173测评】+URAT被打赏20分 | |
【换取手持数字示波器】CH32X035的定时器以及外部中断体验被打赏50分 | |
【换取手持数字示波器】CH32X035搭建开发环境(RISC-V)被打赏50分 |