基于TINYM0 LPC1114的ov7670图像采集源程序
[复制链接]
经过一个月的酝酿,两周的程序调试,实现了应用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上的中断
}
}