void camera_refresh(void)
{
u32 j;
u16 color;
u8 color_r,color_g,color_b;
if(ov_sta)//有帧中断更新?
{
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//将显示区域设置到屏幕中央
else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//将显示区域设置到屏幕中央
LCD_WriteRAM_Prepare(); //开始写入GRAM
OV7670_RRST=0; //开始复位读指针
OV7670_RCK_L;
OV7670_RCK_H;
OV7670_RCK_L;
OV7670_RRST=1; //复位读指针结束
OV7670_RCK_H;
for(j=0;j<76800;j++)
{
OV7670_RCK_L;
color=GPIOC->IDR&0XFF; //读数据,低8位
OV7670_RCK_H;
color<<=8;
OV7670_RCK_L;
color|=GPIOC->IDR&0XFF; //读数据,高8位
OV7670_RCK_H;
// LCD->LCD_RAM=color;
color_b=(color>>0)&0x1f;
color_g=(color>>5)&0x3f;
color_r=(color>>11)&0x1f;
// 从 RGB 到 YUV 空间的 Y 转换公式为:
// Y = 0.299R+0.587G+0.114B
// color=(color_r*30+color_g*11+color_b*11+50)/100;
color=(color_r*38+color_g*75+color_b*15)>>7; //二值化
if(color>16) LCD->LCD_RAM=0xffff;
else LCD->LCD_RAM=0x0000;
}
ov_sta=0; //清零帧中断标记
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
}
} |