|
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "string.h"
#include "ov7725.h"
#include "tpad.h"
#include "timer.h"
#include "exti.h"
#include "usmart.h"
//由于OV7725傳感器安裝方式原因,OV7725_WINDOW_WIDTH相當于LCD的高度,OV7725_WINDOW_HEIGHT相當于LCD的寬度
//注意:此宏定義只對OV7725有效
#define OV7725_WINDOW_WIDTH 320 // <=320
#define OV7725_WINDOW_HEIGHT 240 // <=240
const u8*LMODE_TBL[6]={"Auto","Sunny","Cloudy","Office","Home","Night"};//6種光照模式
const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"}; //7種特效
extern u8 ov_sta; //在exit.c里 面定義
extern u8 ov_frame; //在timer.c里面定義
//更新LCD顯示(OV7725)
void OV7725_camera_refresh(void)
{
u32 i,j;
u16 color;
if(ov_sta)//有幀中斷更新
{
LCD_Scan_Dir(U2D_L2R); //從上到下,從左到右
LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT);//將顯示區域設置到屏幕中央
if(lcddev.id==0X1963)
LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_HEIGHT,OV7725_WINDOW_WIDTH);//將顯示區域設置到屏幕中央
LCD_WriteRAM_Prepare(); //開始寫入GRAM
OV7725_RRST=0; //開始復位讀指針
OV7725_RCK_L;
OV7725_RCK_H;
OV7725_RCK_L;
OV7725_RRST=1; //復位讀指針結束
OV7725_RCK_H;
for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
{
for(j=0;j<OV7725_WINDOW_WIDTH;j++)
{
OV7725_RCK_L;
color=GPIOC->IDR&0XFF; //讀數據
OV7725_RCK_H;
color<<=8;
OV7725_RCK_L;
color|=GPIOC->IDR&0XFF; //讀數據
OV7725_RCK_H;
LCD->LCD_RAM=color;
}
}
ov_sta=0; //清零幀中斷標記
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢復默認掃描方向
}
}
int main(void)
{
u8 key;
u8 i=0;
u8 msgbuf[15];//消息緩存區
u8 tm=0;
u8 lightmode=0,effect=0;
s8 saturation=0,brightness=0,contrast=0;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
uart_init(115200); //串口初始化為 115200
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化與LED連接的硬件接口
KEY_Init(); //初始化按鍵
LCD_Init(); //初始化LCD
TPAD_Init(6); //觸摸按鍵初始化
POINT_COLOR=RED; //設置字體為紅色
LCD_ShowString(30,50,200,16,16,"WarShip STM32");
LCD_ShowString(30,70,200,16,16,"OV7725 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2019/10/16");
LCD_ShowString(30,130,200,16,16,"KEY0:Light Mode");
LCD_ShowString(30,150,200,16,16,"KEY1:Saturation");
LCD_ShowString(30,170,200,16,16,"KEY2:Brightness");
LCD_ShowString(30,190,200,16,16,"KEY_UP:Contrast");
LCD_ShowString(30,210,200,16,16,"TPAD:Effects");
LCD_ShowString(30,230,200,16,16,"OV7725 Init...");
while(1)//初始化OV7725
{
if(OV7725_Init()==0)
{
LCD_ShowString(30,210,200,16,16,"OV7725 Init OK ");
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式輸出
break;
}else if(key==KEY1_PRES)
{
OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,1);//VGA模式輸出
break;
}
i++;
if(i==100)LCD_ShowString(30,230,210,16,16,"KEY0:QVGA KEY1:VGA"); //閃爍顯示提示信息
if(i==200)
{
LCD_Fill(30,230,210,250+16,WHITE);
i=0;
}
delay_ms(5);
}
OV7725_Light_Mode(lightmode);
OV7725_Color_Saturation(saturation);
OV7725_Brightness(brightness);
OV7725_Contrast(contrast);
OV7725_Special_Effects(effect);
OV7725_CS=0;
break;
}else
{
LCD_ShowString(30,210,200,16,16,"OV7725 Error!!");
delay_ms(200);
LCD_Fill(30,210,239,246,WHITE);
delay_ms(200);
}
}
TIM6_Int_Init(10000,7199); //10Khz計數頻率,1秒鐘中斷
EXTI8_Init(); //使能外部中斷8,捕獲幀中斷
LCD_Clear(BLACK);
while(1)
{
key=KEY_Scan(0);//不支持連按
if(key)
{
tm=20;
switch(key)
{
case KEY0_PRES: //燈光模式Light Mode
lightmode++;
if(lightmode>5)lightmode=0;
OV7725_Light_Mode(lightmode);
sprintf((char*)msgbuf,"%s",LMODE_TBL[lightmode]);
break;
case KEY1_PRES: //飽和度Saturation
saturation++;
if(saturation>4)saturation=-4;
else if(saturation<-4)saturation=4;
OV7725_Color_Saturation(saturation);
sprintf((char*)msgbuf,"Saturation:%d",saturation);
break;
case WKUP_PRES: //對比度Contrast
contrast++;
if(contrast>4)contrast=-4;
else if(contrast<-4)contrast=4;
OV7725_Contrast(contrast);
sprintf((char*)msgbuf,"Contrast:%d",contrast);
break;
}
}
if(TPAD_Scan(0))//檢測到觸摸按鍵
{
effect++;
if(effect>6)effect=0;
OV7725_Special_Effects(effect); //設置特效
sprintf((char*)msgbuf,"%s",EFFECTS_TBL[effect]);
tm=20;
}
OV7725_camera_refresh(); //更新顯示
if(tm)
{
LCD_ShowString((lcddev.width-240)/2+30,(lcddev.height-320)/2+60,200,16,16,msgbuf);
tm--;
}
i++;
if(i>=15)//DS0閃爍.
{
i=0;
LED0=!LED0;
}
}
}
|
|