战舰上面OV7670中设置图像输出窗口这段该如何理解呢,应该说是算法如何理解,谢谢大家了

2019-08-22 16:20发布

//设置图像输出窗口
//对QVGA设置。
void OV7670_Window_Set(u16 sx,u16 sy,u16 width,u16 height)
{
 u16 endx;
 u16 endy;
 u8 temp;
 endx=sx+width*2; //V*2
  endy=sy+height*2;
 if(endy>784)endy-=784;
 temp=SCCB_RD_Reg(0X03);    //读取Vref之前的值
 temp&=0XF0;
 temp|=((endx&0X03)<<2)|(sx&0X03);
 SCCB_WR_Reg(0X03,temp);    //设置Vref的start和end的最低2位
 SCCB_WR_Reg(0X19,sx>>2);   //设置Vref的start高8位
 SCCB_WR_Reg(0X1A,endx>>2);   //设置Vref的end的高8位  temp=SCCB_RD_Reg(0X32);    //读取Href之前的值
 temp&=0XC0;
 temp|=((endy&0X07)<<3)|(sy&0X07);
 SCCB_WR_Reg(0X17,sy>>3);   //设置Href的start高8位
 SCCB_WR_Reg(0X18,endy>>3);   //设置Href的end的高8位
}  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
30条回答
正点原子
2019-08-24 01:52
mini板的扩展例程13,里面有:
//设置窗口
//sx,sy,ex,ey窗口坐标
//窗口大小ex-sx+1)*(ey-ex+1)
//注意,确保ex>=sx;ey>=sy!!!!
//9320/9325/9328/4531/4535/1505/b505/8989等IC已经实际测试    
void LCD_Set_Window(u16 sx,u16 sy,u16 ex,u16 ey)    
{
u8 hsareg,heareg,vsareg,veareg;
u16 hsaval,heaval,vsaval,veaval;  
#if USE_HORIZONTAL  //使用横屏
//窗口值
hsaval=sy;
heaval=ey;
vsaval=319-ex;
veaval=319-sx;
#else //竖屏
//窗口值
hsaval=sx;
heaval=ex;
vsaval=sy;
veaval=ey;
#endif
if(DeviceCode==0X9341)
{
LCD_WR_REG(0x2A); 
LCD_WR_DATA(hsaval>>8); 
LCD_WR_DATA(hsaval&0XFF);  
LCD_WR_DATA(heaval>>8); 
LCD_WR_DATA(heaval&0XFF);  
LCD_WR_REG(0x2B); 
LCD_WR_DATA(vsaval>>8); 
LCD_WR_DATA(vsaval&0XFF);  
LCD_WR_DATA(veaval>>8); 
LCD_WR_DATA(veaval&0XFF);  
}else
{
  if(DeviceCode==0X8989)//8989 IC
{
hsareg=0X44;heareg=0X44;//水平方向窗口寄存器 (1289的由一个寄存器控制)
hsaval|=(heaval<<8); //得到寄存器值.
heaval=hsaval;
vsareg=0X45;veareg=0X46;//垂直方向窗口寄存器   
}else  //其他驱动IC
{
hsareg=0X50;heareg=0X51;//水平方向窗口寄存器
vsareg=0X52;veareg=0X53;//垂直方向窗口寄存器   
}   
//设置寄存器值
LCD_WriteReg(hsareg,hsaval);
LCD_WriteReg(heareg,heaval);
LCD_WriteReg(vsareg,vsaval);
LCD_WriteReg(veareg,veaval);
}
}

一周热门 更多>