經過一個月的醞釀,兩周的程序調試,實現了應用TINYM0開發板(LPC1114芯片),經過OV7670帶FIFO圖像采集模塊采集圖像并顯示在ili9325驅動的LCD液晶屏上。實驗程序移植正點原子STM32 圖像采集程序。
在調試過程中發現,LCD液晶屏與OV7670共用數據線,導致花屏現象出現,目前還沒有解決,所以沒有采用共用端口方式。(端口具體配置見LCD和OV7670初始化部分)。
單片機源程序如下:
- /******************************************************************/
- /* 名稱:OV7670圖像采集及顯示程序 */
- /* 作者:李穎 */
- /* ccutchi */
- /* 歡迎來學習 */
- /******************************************************************/
- #include "nxplpc11xx.h"
- #include "ili9325.h"
- #include "w25x16.h"
- #include "gui.h"
- #include "xpt2046.h"
- #include "delay.h"
- #include "ov7670.h"
- #include "gui.h"
- extern uint8_t ov_sta; //幀次數 置位標志位
- void EXTI2_Init(void);
- //更新LCD顯示
- void camera_refresh(void)
- {
- uint32_t j;
- uint16_t color,temp_color;
-
- if(ov_sta==2) //判斷緩存區是否存好攝像數據
- {
- OV7670_RRST_0; //開始復位讀指針
- OV7670_RCK_0;
- OV7670_RCK_1;
- OV7670_RCK_0;
- OV7670_RRST_1; //復位讀指針結束
- OV7670_RCK_1;
-
- OV7670_CS_L; //fif 開
-
- for(j=0;j<76800;j++) //分辨率為240x320 每個顏色點要兩個字節 所以 240x320x2=76800 次
- {
-
- // GPIO2->DIR &=0x00F; // 設置P2口高8位引腳為輸入,用作OV76708位并行數據輸入
- // GPIO2->DATA = 0XFF0; // P2口高8位引腳置高
-
- OV7670_RCK_0; //每一次時鐘跳變 讀一次數據
- color=GPIO0->DATA&0X1FE; //color=GPIOC->IDR&0XFF; //P0.0~P0.8讀數據 讀取顏色高字節數據
- OV7670_RCK_1;
- color<<=7; //左移8位 將高字節移到高8位 為接收低8位字節做準備
- temp_color=color;
- OV7670_RCK_0;
- color=GPIO0->DATA&0X1FE; //color=GPIOC->IDR&0XFF; //讀數據 讀取顏色低字節數據
- OV7670_RCK_1;
- color>>=1;
- color|=temp_color;
-
- LCD_WR_DATA(color);
-
- }
- GPIO1->IC = 0x3FF; // 清除GPIO1上的中斷
- ov_sta=0; //開始下一次采集
-
-
- }
-
- }
- /*
- unsigned int Image_Buffer;
- unsigned char Image[104][14];//圖像數組
- unsigned int OrgRow=0,OrgColumn=0;//行列初值設置
- unsigned int sampleRow=0,samleColumn=0;//行列初值設置
- unsigned int sampleRow_Max=239,samleColumn_Max=239;//行列初值設置最大值
-
- void ImagePlay(void);//圖像顯示函數
- void ImageProcess(void);//圖像處理函數
- void AutoControl(void);//控制函數
- void OV5116_INIT(void);
- */
- int main(void)
- {
- //uint8_t lightmode=0,saturation=2,brightness=2,contrast=2;
- //uint8_t effect=0;
- SysCLK_config(); // 時鐘配置
- SCCB_Init();
- LCD_Init(); // 液晶顯示器初始化
- SCCB_Start();
-
- while(OV7670_Init())//初始化OV7670
- {
- Draw_TextBox(20, 20, 100, 100);
- }
-
- //攝像頭 參數設置 屏蔽后為默認效果
- OV7670_Light_Mode(0);//lightmode
- OV7670_Color_Saturation(2);//saturation
- OV7670_Brightness(2);//brightness
- OV7670_Contrast(2);//contrast
- OV7670_Special_Effects(0); //effect
- OV7670_Window_Set(10,174,240,320); //設置窗口
- //OV7670_CS_L; //使能攝像頭片選
- EXTI2_Init(); //初始化中斷線
- LCD_Clear(BLUE); // 全屏顯示白色
-
- while(1)
- {
-
- camera_refresh();
-
-
- }
- }
- void EXTI2_Init(void)
- {
- SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON時鐘(bit16)
- IOCON->PIO1_0 = 0XD1; //把PIN33設置為P1.0腳
- SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON時鐘(bit16)
- //把P1.0和P1.1設置為輸入
- GPIO1->DIR &= ~(1<<0);
- GPIO1->DATA |= (1<<0);
- GPIO1->IS &= ~(1<<0); //選擇P1.0為邊沿觸發
- GPIO1->IEV |=(1<<0);//選擇P1.0為 上升沿觸發
- GPIO1->IE |= (1<<0); //設置P1.0中斷不被屏蔽
- NVIC_EnableIRQ(EINT1_IRQn); // 使能GPIO1中斷
-
- }
-
- //GPIO1中斷服務函數
- void PIOINT1_IRQHandler(void)
- {
- if((GPIO1->MIS&0x001)==0x001) // 檢測是不是P1.0引腳產生的中斷
- {
- if(ov_sta<2)
- {
- if(ov_sta==0)
- {
- OV7670_WRST_L;//=0; //復位寫指針
- OV7670_WRST_H;//=1;
- OV7670_WREN_H;//=1; //允許寫入FIFO
- }
- else
- {
-
- // OV7670_WRST_L;//=0; //復位寫指針
- // OV7670_WRST_H;//=1;
- OV7670_WREN_L;//=0; //禁止寫入FIFO
- }
- ov_sta++;
-
- }
- GPIO1->IC = 0x3FF; // 清除GPIO1上的中斷
- }
-
- }
復制代碼
所有資料51hei提供下載:
ov7670圖像顯示正確.rar
(393.87 KB, 下載次數: 12)
2018-8-16 16:30 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|