摄像头和LCD程序是改的原子的例程,OV7725QVGA模式下LCD横屏时才能正常显示,竖屏出现斜杠,但摄像头开VGA模式下LCD竖屏又能够正常显示,LCD是2.8寸240*320,改过LCD扫描方向和对调摄像头起始坐标等都没有成功,研究了几天,实在没法了,希望各位大佬帮忙指点指点。
//OV7725摄像头测试
void OV7725_Test(void)
{
LCD_Clear(WHITE);
DCMI_Init();//DCMI配置
DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,DMA_MDATAALIGN_HALFWORD,DMA_MINC_DISABLE);
// LCD_Display_Dir(1); //1横屏 从上到下,从左到右 OK
// OV7725_Window_Set(320,240,0);//QVGA模式输出
// LCD_Display_Dir(1); //2横屏 从上到下,从左到右 OK
// OV7725_Window_Set(320,240,1);//VGA模式输出
LCD_Display_Dir(0);//竖屏
OV7725_Window_Set(240,320,0);//3竖屏QVGA模式输出 NO!
// LCD_Display_Dir(0);//竖屏
// OV7725_Window_Set(240,320,1);//4竖屏VGA模式输出 OK
DCMI_Start(); //启动传输
while(1)
{
DCMI_Stop(); //停止显示
LCD_ShowString(50,60,240,320,16,"OV7725");
DCMI_Start(); //启动传输
delay_ms(10);
}
}
//设置图像输出窗口
//width:图像宽度
//height:图像高度
//mode:0,QVGA输出模式;1,VGA输出模式
//QVGA模式可视范围广但近物不是很清晰,VGA模式可视范围小近物清晰
void OV7725_Window_Set(u16 width,u16 height,u8 mode)
{
u8 raw,temp;
u16 sx,sy;
if(mode)
{
if(width>640) width=640;
if(height>480) height=480;
sx=(640-width)/2;
sy=(480-height)/2;
OV7725_WR_Reg(COM7,0x06); //设置为VGA模式
OV7725_WR_Reg(HSTART,0x23); //水平起始位置
OV7725_WR_Reg(HSIZE,0xA0); //水平尺寸
OV7725_WR_Reg(VSTRT,0x07); //垂直起始位置
OV7725_WR_Reg(VSIZE,0xF0); //垂直尺寸
OV7725_WR_Reg(HREF,0x00);
OV7725_WR_Reg(HOutSize,0xA0); //输出尺寸
OV7725_WR_Reg(VOutSize,0xF0); //输出尺寸
}
else
{
// sx=(320-width)/2;// 横屏 原始
// sy=(240-height)/2;// or↓
width = 240;//
height = 320;
sx=(240-width)/2;// 竖屏 or↑
sy=(320-height)/2;//
OV7725_WR_Reg(COM7,0x46); //设置为QVGA模式
OV7725_WR_Reg(HSTART,0x3f); //水平起始位置
OV7725_WR_Reg(HSIZE, 0x50); //水平尺寸
OV7725_WR_Reg(VSTRT, 0x03); //垂直起始位置
OV7725_WR_Reg(VSIZE, 0x78); //垂直尺寸
OV7725_WR_Reg(HREF, 0x00);
OV7725_WR_Reg(HOutSize,0x50); //输出尺寸
OV7725_WR_Reg(VOutSize,0x78); //输出尺寸
}
raw=OV7725_RD_Reg(HSTART);
temp=raw+(sx>>2);//sx高8位存在HSTART,低2位存在HREF[5:4]
OV7725_WR_Reg(HSTART,temp);
OV7725_WR_Reg(HSIZE,width>>2);//width高8位存在HSIZE,低2位存在HREF[1:0]
raw=OV7725_RD_Reg(VSTRT);
temp=raw+(sy>>1);//sy高8位存在VSTRT,低1位存在HREF[6]
OV7725_WR_Reg(VSTRT,temp);
OV7725_WR_Reg(VSIZE,height>>1);//height高8位存在VSIZE,低1位存在HREF[2]
raw=OV7725_RD_Reg(HREF);
temp=((sy&0x01)<<6)|((sx&0x03)<<4)|((height&0x01)<<2)|(width&0x03)|raw;
OV7725_WR_Reg(HREF,temp);
OV7725_WR_Reg(HOutSize,width>>2);
OV7725_WR_Reg(VOutSize,height>>1);
OV7725_RD_Reg(EXHCH);
temp = (raw|(width&0x03)|((height&0x01)<<2));
OV7725_WR_Reg(EXHCH,temp);
} |