中级会员
 
- 积分
- 233
- 金钱
- 233
- 注册时间
- 2021-5-7
- 在线时间
- 102 小时
|
1金钱
板子是stm32f407,看的是综合实验,目前只看了跟界面初始化相关的部分,有几个问题请教下
1.PICTURE/piclib.c的void ai_draw_init(void)
{
float temp,temp1;
temp=(float)picinfo.S_Width/picinfo.ImgWidth;
temp1=(float)picinfo.S_Height/picinfo.ImgHeight;
if(temp<temp1)temp1=temp;//取较小的那个
if(temp1>1)temp1=1;
//使图片处于所给区域的中间
picinfo.S_XOFF+=(picinfo.S_Width-temp1*picinfo.ImgWidth)/2;
picinfo.S_YOFF+=(picinfo.S_Height-temp1*picinfo.ImgHeight)/2;
temp1*=8192;//扩大8192倍
picinfo.Div_Fac=temp1;
picinfo.staticx=0xffff;
picinfo.staticy=0xffff;//放到一个不可能的值上面
}
if(temp1>1)temp1=1; 为什么图片不能被放大?即只能缩小或不变?
temp1*=8192;这句是什么意思?为什么要将系数放大?又为什么是8192倍不是其它倍数?有什么用?
2.PICTURE/bmp.c的91行realy=(y*picinfo.Div_Fac)>>13;把坐标移位的操作是什么意思?为什么要定义两种坐标?(x,y和realx,realy)
3.PICTURE/bmp.c的118行color=((u16)bmpbuf[count]&0X1F);//R 我简单地理解为是将数据取低5位代表红色,但119行color+=(((u16)bmpbuf[count])&0XE0)<<1; //G 我就蒙了,看了手册也找不到答案
4.APP/spb.c的spb_init(void)函数,268-272行
//指向EX SRAM LCD BUF
pic_phy.read_point=slcd_read_point;
pic_phy.draw_point=slcd_draw_point;
pic_phy.fillcolor=slcd_fill_color;
gui_phy.read_point=slcd_read_point;
gui_phy.draw_point=slcd_draw_point;
为什么要先把这些函数指针指向slcd_xxx函数,最后又重新指向LCD_xxx函数? 为了弄清楚我看了下slcd_draw_point函数的定义:
void slcd_draw_point(u16 x,u16 y,u16 color)
{
sramlcdbuf[y+x*spbdev.spbheight+spbdev.frame*spbdev.spbheight*spbdev.spbwidth]=color;
}
就是把颜色值存进一个buf里,可这个中括号里为什么是这么一大串?完全不懂。我还想知道哪里会用到这个buf,我就往下找,最终在主任务 main_task(void *pdata)的spb_load_mui();里的slcd_frame_show(spbdev.pos);里的slcd_dma_enable(x);里的DMA2_Stream0->PAR=(u32)(sramlcdbuf+x*spbdev.spbheight+dmatransfered);用到了这个buf,还有参数x,这个x就是spbdev.pos,这应该是底层了,知道跟DMA有关,DMA2_Stream0->PAR可能是个寄存器?把sramlcdbuf+x*spbdev.spbheight+dmatransfered赋给它,属实看不懂。然后就对比看了下LCD_Fast_DrawPoint函数
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
{
if(lcddev.id==0X9341||lcddev.id==0X5310)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
}else if(lcddev.id==0X5510)
{
LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);
LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);
LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF);
}else if(lcddev.id==0X1963)
{
if(lcddev.dir==0)x=lcddev.width-1-x;
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
}else if(lcddev.id==0X6804)
{
if(lcddev.dir==1)x=lcddev.width-1-x;//横屏时处理
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
}else
{
if(lcddev.dir==1)x=lcddev.width-1-x;//横屏其实就是调转x,y坐标
LCD_WriteReg(lcddev.setxcmd,x);
LCD_WriteReg(lcddev.setycmd,y);
}
LCD->LCD_REG=lcddev.wramcmd;
LCD->LCD_RAM=color;
} 又是跟寄存器有关又懵逼了。
5. 结构体m_spb_dev 有两个东西 u16 pos;(上面提到过) //当前帧的位置(x坐标) 我知道帧就是一幅图片(不准确),但还是看不懂这两个是干什么用的。
u8 frame; //当前帧(0/1)
先就这样吧。。。之前也看了相关的文档,但由于自身水平有限无法解决,可能问的问题有点多且混乱,但的确考虑到自身需要,时间也很紧,还望各位大佬不吝赐教,万分感谢,叫我看什么资料也行,我再去好好看就是了。可能今后还会有问题希望大佬们能帮帮我谢谢。
|
|