標(biāo)題:
基于TINYM0 LPC1114的ov7670圖像采集源程序
[打印本頁]
作者:
leeyeeng
時(shí)間:
2018-8-16 16:31
標(biāo)題:
基于TINYM0 LPC1114的ov7670圖像采集源程序
經(jīng)過一個(gè)月的醞釀,兩周的程序調(diào)試,實(shí)現(xiàn)了應(yīng)用TINYM0開發(fā)板(LPC1114芯片),經(jīng)過OV7670帶FIFO圖像采集模塊采集圖像并顯示在ili9325驅(qū)動(dòng)的LCD液晶屏上。實(shí)驗(yàn)程序移植正點(diǎn)原子STM32 圖像采集程序。
在調(diào)試過程中發(fā)現(xiàn),LCD液晶屏與OV7670共用數(shù)據(jù)線,導(dǎo)致花屏現(xiàn)象出現(xiàn),目前還沒有解決,所以沒有采用共用端口方式。(端口具體配置見LCD和OV7670初始化部分)。
單片機(jī)源程序如下:
/******************************************************************/
/* 名稱:OV7670圖像采集及顯示程序 */
/* 作者:李穎 */
/* ccutchi */
/* 歡迎來學(xué)習(xí) */
/******************************************************************/
#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; //幀次數(shù) 置位標(biāo)志位
void EXTI2_Init(void);
//更新LCD顯示
void camera_refresh(void)
{
uint32_t j;
uint16_t color,temp_color;
if(ov_sta==2) //判斷緩存區(qū)是否存好攝像數(shù)據(jù)
{
OV7670_RRST_0; //開始復(fù)位讀指針
OV7670_RCK_0;
OV7670_RCK_1;
OV7670_RCK_0;
OV7670_RRST_1; //復(fù)位讀指針結(jié)束
OV7670_RCK_1;
OV7670_CS_L; //fif 開
for(j=0;j<76800;j++) //分辨率為240x320 每個(gè)顏色點(diǎn)要兩個(gè)字節(jié) 所以 240x320x2=76800 次
{
// GPIO2->DIR &=0x00F; // 設(shè)置P2口高8位引腳為輸入,用作OV76708位并行數(shù)據(jù)輸入
// GPIO2->DATA = 0XFF0; // P2口高8位引腳置高
OV7670_RCK_0; //每一次時(shí)鐘跳變 讀一次數(shù)據(jù)
color=GPIO0->DATA&0X1FE; //color=GPIOC->IDR&0XFF; //P0.0~P0.8讀數(shù)據(jù) 讀取顏色高字節(jié)數(shù)據(jù)
OV7670_RCK_1;
color<<=7; //左移8位 將高字節(jié)移到高8位 為接收低8位字節(jié)做準(zhǔn)備
temp_color=color;
OV7670_RCK_0;
color=GPIO0->DATA&0X1FE; //color=GPIOC->IDR&0XFF; //讀數(shù)據(jù) 讀取顏色低字節(jié)數(shù)據(jù)
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];//圖像數(shù)組
unsigned int OrgRow=0,OrgColumn=0;//行列初值設(shè)置
unsigned int sampleRow=0,samleColumn=0;//行列初值設(shè)置
unsigned int sampleRow_Max=239,samleColumn_Max=239;//行列初值設(shè)置最大值
void ImagePlay(void);//圖像顯示函數(shù)
void ImageProcess(void);//圖像處理函數(shù)
void AutoControl(void);//控制函數(shù)
void OV5116_INIT(void);
*/
int main(void)
{
//uint8_t lightmode=0,saturation=2,brightness=2,contrast=2;
//uint8_t effect=0;
SysCLK_config(); // 時(shí)鐘配置
SCCB_Init();
LCD_Init(); // 液晶顯示器初始化
SCCB_Start();
while(OV7670_Init())//初始化OV7670
{
Draw_TextBox(20, 20, 100, 100);
}
//攝像頭 參數(shù)設(shè)置 屏蔽后為默認(rèn)效果
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); //設(shè)置窗口
//OV7670_CS_L; //使能攝像頭片選
EXTI2_Init(); //初始化中斷線
LCD_Clear(BLUE); // 全屏顯示白色
while(1)
{
camera_refresh();
}
}
void EXTI2_Init(void)
{
SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON時(shí)鐘(bit16)
IOCON->PIO1_0 = 0XD1; //把PIN33設(shè)置為P1.0腳
SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON時(shí)鐘(bit16)
//把P1.0和P1.1設(shè)置為輸入
GPIO1->DIR &= ~(1<<0);
GPIO1->DATA |= (1<<0);
GPIO1->IS &= ~(1<<0); //選擇P1.0為邊沿觸發(fā)
GPIO1->IEV |=(1<<0);//選擇P1.0為 上升沿觸發(fā)
GPIO1->IE |= (1<<0); //設(shè)置P1.0中斷不被屏蔽
NVIC_EnableIRQ(EINT1_IRQn); // 使能GPIO1中斷
}
//GPIO1中斷服務(wù)函數(shù)
void PIOINT1_IRQHandler(void)
{
if((GPIO1->MIS&0x001)==0x001) // 檢測(cè)是不是P1.0引腳產(chǎn)生的中斷
{
if(ov_sta<2)
{
if(ov_sta==0)
{
OV7670_WRST_L;//=0; //復(fù)位寫指針
OV7670_WRST_H;//=1;
OV7670_WREN_H;//=1; //允許寫入FIFO
}
else
{
// OV7670_WRST_L;//=0; //復(fù)位寫指針
// OV7670_WRST_H;//=1;
OV7670_WREN_L;//=0; //禁止寫入FIFO
}
ov_sta++;
}
GPIO1->IC = 0x3FF; // 清除GPIO1上的中斷
}
}
復(fù)制代碼
所有資料51hei提供下載:
ov7670圖像顯示正確.rar
(393.87 KB, 下載次數(shù): 12)
2018-8-16 16:30 上傳
點(diǎn)擊文件名下載附件
程序
下載積分: 黑幣 -5
作者:
leeyeeng
時(shí)間:
2019-8-6 15:20
把TFT 數(shù)據(jù)線和 OV7670數(shù)據(jù)線分開,不共用數(shù)據(jù)線就OK了
作者:
GG276192978
時(shí)間:
2019-8-9 09:18
如果數(shù)據(jù)線復(fù)用, 你中間數(shù)據(jù)傳輸時(shí),判斷總線是否忙不就可以解決問題了嗎
作者:
Simon_Z
時(shí)間:
2022-8-17 20:53
好老的MCU啊,用點(diǎn)新的MCU就更棒了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1