8536|48

58

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

优龙bootloader中的lcdInit.c [复制链接]

下面这些代码是lcdInit.c源文件中的一段
———————————————————————————————
#define LCD_XSIZE_TFT         (320)       
#define LCD_YSIZE_TFT         (240)
#define SCR_XSIZE_TFT         (LCD_XSIZE_TFT*2)
#define SCR_YSIZE_TFT         (LCD_YSIZE_TFT*2)

U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT];

/*————————————————————
*  320 x 240 TFT LCD单个象素的显示数据输出
*/
static void PutPixel(U32 x,U32 y,U16 c)
{
    if(x         frameBuffer16BitTft[(y)][(x)] = c;
}

#define LCDFRAMEBUFFER 0x33800000

frameBuffer16BitTft=(U16 (*)[SCR_XSIZE_TFT])LCDFRAMEBUFFER;
———————————————————————————————
Q1: 320*240 的TFT LCD屏幕上不是一共有320*240个像素吗?这里为什么
是if(x SCR_YSIZE_TFT = 480

Q2:
LCD_XSIZE_TFT (320)       
LCD_YSIZE_TFT (240)
SCR_XSIZE_TFT (LCD_XSIZE_TFT*2)
SCR_YSIZE_TFT (LCD_YSIZE_TFT*2)
这4个宏分别代表什么意思?

Q3:
frameBuffer16BitTft=(U16 (*)[SCR_XSIZE_TFT])LCDFRAMEBUFFER;
这句代码看不懂呢,SCR_XSIZE_TFT和LCDFRAMEBUFFER不都是常数吗?
(U16 (*)[SCR_XSIZE_TFT])LCDFRAMEBUFFER综合起来是什么意思?

————————————————————————————————
#define LCDFRAMEBUFFER 0x33800000
frameBuffer16BitTft=(U16 (*)[SCR_XSIZE_TFT])LCDFRAMEBUFFER;
————————————————————————————————
这两行代码有什么作用?

谢谢大家!
————————————————————————————————
JOYZML(菜鸟朱铭雷)

最新回复

谢LZ的发问和娜娜的回答,学习到了。  详情 回复 发表于 2010-1-24 22:32
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
320*240 是屏的像素。

像素是 565 的结构,每个像素需要 16 bit(2Byte) 来表示。
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
if(x
LCD_XSIZE_TFT (320)
LCD_YSIZE_TFT (240) 这个是你的像素  如果你用大屏幕,分辨率是640*480的 就要这两个参数
SCR_XSIZE_TFT (LCD_XSIZE_TFT*2)
SCR_YSIZE_TFT (LCD_YSIZE_TFT*2) 因为LCD是16位的,一个像素要有两个字节数据表示
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
#define LCDFRAMEBUFFER 0x33800000 //定义SDRAM的地址 第六块中

U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT]; 定义一个指针数组,指针中有SCR_XSIZE_TFT个元素 也就是frameBuffer16BitTft所值的对象是有SCR_XSIZE_TFT个
U16的元素的数组 即frameBuffer16BitTft是行指针

frameBuffer16BitTft=(U16 (*)[SCR_XSIZE_TFT])LCDFRAMEBUFFER; //这个就是给frameBuffer16BitTft指针赋值 地址为0x33800000

你好好看C语言的数组指针那一章 就会明白了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
全让娜娜说了,我就顶了!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 gooogleman 的回复:
全让娜娜说了,我就顶了!


呵呵,都是牛人啊。我来学习。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
YES!
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

8
 
嘿嘿。小弟愚笨
接着问,还是这个函数
——————————————————————————
static void PutPixel(U32 x,U32 y,U16 c)
{
    if(x         frameBuffer16BitTft[(y)][(x)] = c;
}
——————————————————————————
因为这里SCR_XSIZE_TFT=640,SCR_YSIZE_TFT=480
那么这样看,frameBuffer16BitTft数组的成员个数不是640*480个吗
看了娜娜的回复,理解了一些。但是下面这个定义:
U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT];
如果说是定义了指针数组,但是它的成员个数不是SCR_XSIZE_TFT=640个吗
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 joyzml 的回复:
嘿嘿。小弟愚笨
接着问,还是这个函数
——————————————————————————
static void PutPixel(U32 x,U32 y,U16 c)
{
? ? if(x ? ? ? ? frameBuffer16BitTft[(y)][(x)] = c;
}
——————————————————————————
因为这里SCR_XSIZE_TFT=640,SCR_YSIZE_TFT=480
那么这样看,frameBuffer16BitTft数组的成员个数不是640*480个吗
看了娜娜的回复,理解了一些。但是下面这个定义:
U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT];
如果说是定义了指针数组,但是它的成员个数不是SCR_XSIZE_TFT=640个吗

不管多少元素
frameBuffer16BitTft也只是个指针啊。
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

10
 
U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT];
它的行元素就是SCR_XSIZE_TFT个 也就是说每一行中有
SCR_XSIZE_TFT 640个 也就是要有640个数据表示一行,呵呵

他只是个指针 后面的数据表示元素的个数,至于有多少行,要看你自己用多少了
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 
U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT];
简化的就像 char *p[x];  p和frameBuffer16BitTft是地址,x和SCR_XSIZE_TFT是数组大小

U16注意这里的16位的,不是32位的
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

12
 
学习,分析很详细,致谢
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
先感谢楼上朋友们的回答
由于工作原因,也是抽时间来看帖
U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT];
以下frameBuffer16BitTft简写为f
SCR_XSIZE_TFT简写为S

U16 (*f) 其实就是:U16 (*f)[640]
我的理解是:
这么声明的作用应该就是分配一块内存区域,f是其首地址,
在首地址接下来的内存区域存放640个U16类型的数据。
看了大家的回答,我还是没明白,320*240的屏,一行320个像素
那么320个像素,就需要320个16位(U16)的数据来控制它,
这里U16 (*f)[640],已经是U16类型的了,为什么要声明640个呢
是什么意思?娜娜说是行指针,我还是没能理解。

 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

14
 
/*-----------------------------------------------------------------------------
*  320 x 240 TFT LCD全屏填充特定颜色单元或清屏
*/
static void Lcd_ClearScr( U16 c)
{
    unsigned int x, y;
   
    for( y = 0 ; y < SCR_YSIZE_TFT ; y++ )
    {
        for( x = 0 ; x < SCR_XSIZE_TFT ; x++ )
        {
            frameBuffer16BitTft[y][x] = c ;
        }
    }
}
—————————————————————————————
上面这个是清屏的函数,从这个函数看,控制320*240的屏,
需要SCR_YSIZE_TFT *SCR_XSIZE_TFT=640*480个U16(无符号16位)的数据吗?
为什么?不是1个像素由一个16的数据控制吗
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
因为他是二维数组嘛 有行列之分嘛
f是第一行 一行有640个数据 数据类型是U16的
f++ 就指向第二行了  

你应该看看C语言的多维数组指针那 讲的很清楚的
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 joyzml 的回复:
上面这个是清屏的函数,从这个函数看,控制320*240的屏,
需要SCR_YSIZE_TFT *SCR_XSIZE_TFT=640*480个U16(无符号16位)的数据吗?
为什么?不是1个像素由一个16的数据控制吗

一个像素是16位 要给一个像素附颜色值 就是给两个字节数据赋值嘛
所以你的320*240个点 就要赋 640*480个数据嘛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

17
 
U16(无符号16位)只是你的数组中数据的类型 也就是颜色值 RGB的
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

18
 
————————————————————————————————
static void PutPixel(U32 x,U32 y,U16 c)
{
    if(x         frameBuffer16BitTft[(y)][(x)] = c;
}
————————————————————————————————
我想将第200行,第300列这个像素点,置为蓝色。

我是该这样调用函数:PutPixel(200,300,31);//   00000 000000 11111
还是该这样调用函数:PutPixel(400,600,31);//   00000 000000 11111

假如是这样PutPixel(400,600,31);
函数执行结果就是:frameBuffer16BitTft[600][400] = 0x001f;

下面我画个示意图:按照理解,是不是应该下面这样的结果?
————————————————————————————————
   f(数组首地址)
   |
   |
   [0][0]  [0][1]  ......                             [0][479]
   [1][0]  [1][1]  ......                             [1][479]
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                                                       .
   .                           值为0x00    值为0x1f         .
   [600][0]        ......     [600][400]  [600][401]              
   .                                                       .                 
   .                                                       .
   .                                                       .
   [639][0]        ......                             [639][479]   
—————————————————————————————————
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

19
 
用这个PutPixel(200,300,31);//  00000 000000 11111


因为有这个定义 U16 (*frameBuffer16BitTft)[SCR_XSIZE_TFT];
frameBuffer16BitTft[(y)][(x)] = c;这句就相当于y*SCR_XSIZE_TFT+x

计算显示点对应显示缓冲区的位置 来赋值就行了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

20
 
恩。不错。娜娜。看了你18楼的回答。
又清楚了一成。原来是这样。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表