关于实现用mini来照相的问题

2019-07-21 02:37发布

自己修改了精英的函数用在mini上,可是不知道哪里有问题,无法实现拍照,求解答!!


#include "sys.h"
#include "usart.h"               
#include "delay.h"       
#include "led.h"
#include "usmart.h"
#include "lcd.h"
#include "ov7670.h"
#include "ov7725.h"
#include "exti.h"
#include "timer.h"
#include "piclib.h"
#include "key.h"
#include "ff.h"
#include "exfuns.h"
#include "malloc.h"
#include "string.h"
#include "math.h"
#include "text.h"
#include "spi.h"
#include "flash.h"

//ALIENTEK Mini STM32开发板扩展实验9
//摄像头实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司  

//传感器名字定义
#define  OV7725 1
#define  OV7670 2

//由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
//注意:此宏定义只对OV7725有效
#define  OV7725_WINDOW_WIDTH                320 // <=320
#define  OV7725_WINDOW_HEIGHT                240 // <=240

extern u8 ov_sta;        //在exit.c里面定义
extern u8 ov_frame;        //在timer.c里面定义

FRESULT res_sd;//文件操作结果
FIL fnew; //文件对
UINT fnum; //文件成功读写数量


void camera_refresh(void)
{       
        u32 i,j;
        u16 color;

        //没有按键按下,刷新LCD
        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_CS=0;
                OV7725_RRST=0;                                //开始复位读指针
                OV7725_RCK=0;
                OV7725_RCK=1;
                OV7725_RCK=0;
                OV7725_RRST=1;                                //复位读指针结束
                OV7725_RCK=1;
               

                for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
                {
                        for(j=0;j<OV7725_WINDOW_WIDTH;j++)
                        {
                                OV7725_RCK=0;
                                color=OV7725_DATA;        //读数据
                                OV7725_RCK=1;
                                color<<=8;  
                                OV7725_RCK=0;
                                color|=OV7725_DATA;        //读数据
                                OV7725_RCK=1;
                                LCD_WR_DATA(color);
                        }
                }

                ov_sta=0;                //清零帧中断标记
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
        }
}


void camera_new_pathname(u8 *pname)
{         
        u8 res;                                         
        u16 index=0;
        while(index<0XFFFF)
        {
                sprintf((char*)pname,"0HOTO/PIC%05d.bmp",index);
                res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
                if(res==FR_NO_FILE)break;                //该文件名不存在=正是我们需要的.
                index++;
        }
}

int main(void)
{       
        u8 sensor=0;
        u8 res;
        u8 i;       
        u8 *pname;
        u8 key;       
        u8 sd_ok=1;
         
        delay_init();                     //延时函数初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        uart_init(9600);
        usmart_dev.init(72);        //初始化USMART
         
        LED_Init();                 //初始化与LED连接的硬件接口
  KEY_Init();    //初始化按键
        LCD_Init();                                   //初始化LCD

        SPI_Flash_Init();
        mem_init();
        exfuns_init();                        //为fatfs相关变量申请内存  
  f_mount(fs[0],"0:",1);                 //挂载SD卡
        f_mount(fs[1],"1:",1);                 //挂载FLASH.
        piclib_init();                        //初始化画图
        POINT_COLOR=RED;//设置字体为红 {MOD}
       
        while(font_init())                                 //检查字库
        {            
                LCD_ShowString(30,50,200,16,16,"Font Error!");
                delay_ms(200);                                  
                LCD_Fill(30,50,240,66,WHITE);//清除显示             
        }           
        Show_Str(30,50,200,16,"精英STM32F1开发板",16,0);                                             
        Show_Str(30,70,200,16,"照相机实验",16,0);                                             
        Show_Str(30,90,200,16,"KEY0:拍照",16,0);                                             
        Show_Str(30,110,200,16,"正点原子@ALIENTEK",16,0);                                             
        Show_Str(30,130,200,16,"2017年11月1日",16,0);
        res=f_mkdir("0:/PHOTO");                //创建PHOTO文件夹
        if(res!=FR_EXIST&&res!=FR_OK)         //发生了错误
        {                    
                Show_Str(30,150,240,16,"SD卡错误!",16,0);
                delay_ms(200);                                  
                Show_Str(30,170,240,16,"拍照功能将不可用!",16,0);
                sd_ok=0;         
        }else
        {
                Show_Str(30,150,240,16,"SD卡正常!",16,0);
                delay_ms(200);                                  
                Show_Str(30,170,240,16,"KEY_UP:拍照",16,0);
                sd_ok=1;            
        }                                                                                                                                       
        pname=mymalloc(30);        //为带路径的文件名分配30个字节的内存                    
        while(pname==NULL)                        //内存分配出错
        {            
                Show_Str(30,190,240,16,"内存分配失败!",16,0);
                delay_ms(200);                                  
                LCD_Fill(30,190,240,146,WHITE);//清除显示             
                delay_ms(200);                                  
        }  

        while(1)//初始化OV7725
        {
                if(OV7725_Init()==0)
                {
                        sensor=OV7725;
                        LCD_ShowString(30,150,200,16,16,"OV7725 Init OK       ");                               
                        delay_ms(1500);
                        OV7725_Light_Mode(0);
                        OV7725_Color_Saturation(0);
                        OV7725_Brightness(0);
                        OV7725_Contrast(0);
                        OV7725_Special_Effects(0);
                        OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式输出
                        OV7725_CS=0;
                        break;
                }
                else
                {
                        LCD_ShowString(30,150,200,16,16,"OV7725_OV7670 Error!!");
                        delay_ms(200);
                        LCD_Fill(30,150,200,246,WHITE);
                        delay_ms(200);
                }
        }           
        TIM3_Int_Init(10000,7199);                        //TIM3,10Khz计数频率,1秒钟中断                                                                          
        EXTI15_Init();                                                //使能定时器捕获                                                  
        LCD_Clear(BACK_COLOR);
        while(1)
        {       
                key=KEY_Scan(0);//不支持连按
                if(key==KEY0_PRES)
                {
                        if(sd_ok)
                        {
                                LED1=0;        //点亮DS1,提示正在拍照
                                camera_new_pathname(pname);//得到文件名                    
                                if(bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0))//拍照有误
                                {
                                        Show_Str(40,130,240,12,"写入文件错误!",12,0);                 
                                }else
                                {
                                        Show_Str(40,130,240,12,"拍照成功!",12,0);
                                        Show_Str(40,150,240,12,"保存为:",12,0);
                                        Show_Str(40+42,150,240,12,pname,12,0);                    
                                        delay_ms(100);
                                 }
                        }else //提示SD卡错误
                        {                                            
                                Show_Str(40,130,240,12,"SD卡错误!",12,0);
                                Show_Str(40,150,240,12,"拍照功能不可用!",12,0);                            
                        }
                        LED1=1;//关闭DS1
                        delay_ms(1800);//等待1.8秒钟
                        LCD_Clear(BLACK);
                }else delay_ms(5);
               
                if(sensor==OV7725) camera_refresh();                //更新显示

                i++;
                if(i>=40)//DS0闪烁.
                {
                        i=0;
                        LED0=!LED0;
                }
        }                                                                                               
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
JzzzYy
1楼-- · 2019-07-21 07:32
本帖最后由 JzzzYy 于 2019-4-19 14:08 编辑

自己解决了 如果有需要的源码在下面

#include "sys.h"
#include "usart.h"               
#include "delay.h"        
#include "led.h"
#include "usmart.h"
#include "lcd.h"
#include "ov7670.h"
#include "ov7725.h"
#include "exti.h"
#include "timer.h"
#include "piclib.h"
#include "key.h"
#include "ff.h"
#include "exfuns.h"
#include "malloc.h"
#include "string.h"
#include "math.h"
#include "text.h"
#include "spi.h"
#include "flash.h"

//ALIENTEK Mini STM32开发板扩展实验9
//摄像头实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司  

//传感器名字定义
#define  OV7725 1
#define  OV7670 2

//由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
//注意:此宏定义只对OV7725有效
#define  OV7725_WINDOW_WIDTH                320 // <=320
#define  OV7725_WINDOW_HEIGHT                240 // <=240

extern u8 ov_sta;        //在exit.c里面定义
extern u8 ov_frame;        //在timer.c里面定义

FRESULT res_sd;//文件操作结果
FIL fnew; //文件对
UINT fnum; //文件成功读写数量


void camera_refresh(void)
{        
        u32 i,j;
         u16 color;

        //没有按键按下,刷新LCD
        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_CS=0;
                OV7725_RRST=0;                                //开始复位读指针
                OV7725_RCK=0;
                OV7725_RCK=1;
                OV7725_RCK=0;
                OV7725_RRST=1;                                //复位读指针结束
                OV7725_RCK=1;
               

                for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
                {
                        for(j=0;j<OV7725_WINDOW_WIDTH;j++)
                        {
                                GPIOB->CRL=0X88888888;
                                OV7725_RCK=0;
                                color=OV7725_DATA;        //读数据
                                OV7725_RCK=1;
                                color<<=8;  
                                OV7725_RCK=0;
                                color|=OV7725_DATA;        //读数据
                                OV7725_RCK=1;
                                GPIOB->CRL=0X33333333;
                                 //ER ZHI HUA
                                Gray=(color&0x07E0)>>5;
                                LCD_WR_DATA(color);

                        }
                }
    OV7725_CS=1;
                OV7725_RCK=0;
                OV7725_RCK=1;
                EXTI->R=1<<15;
                 ov_sta=0;                //清零帧中断标记
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
        }
}


void camera_new_pathname(u8 *pname)
{         
        u8 res;                                         
        u16 index=0;
        while(index<0XFFFF)
        {
                sprintf((char*)pname,"0HOTO/PIC%05d.bmp",index);
                res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
                if(res==FR_NO_FILE)break;                //该文件名不存在=正是我们需要的.
                index++;
        }
}

int main(void)
{        
        u8 sensor=0;
        u8 res;
        u8 i;        
        u8 *pname;
        u8 key;        
        u8 sd_ok=1;
         
        delay_init();                     //延时函数初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        uart_init(9600);
        usmart_dev.init(72);        //初始化USMART
         
        LED_Init();                 //初始化与LED连接的硬件接口
  KEY_Init();    //初始化按键
        LCD_Init();                                   //初始化LCD
  
        SPI_Flash_Init();
        mem_init();
        exfuns_init();                        //为fatfs相关变量申请内存  
  f_mount(fs[0],"0:",1);                 //挂载SD卡
         f_mount(fs[1],"1:",1);                 //挂载FLASH.
        piclib_init();                        //初始化画图
         POINT_COLOR=RED;//设置字体为红 {MOD}
        
         while(font_init())                                 //检查字库
        {            
                LCD_ShowString(30,50,200,16,16,"Font Error!");
                delay_ms(200);                                 
                LCD_Fill(30,50,240,66,WHITE);//清除显示            
        }           
         Show_Str(30,50,200,16,"精英STM32F1开发板",16,0);                                             
        Show_Str(30,70,200,16,"照相机实验",16,0);                                             
        Show_Str(30,90,200,16,"KEY0:拍照",16,0);                                             
        Show_Str(30,110,200,16,"正点原子@ALIENTEK",16,0);                                             
        Show_Str(30,130,200,16,"2017年11月1日",16,0);
        res=f_mkdir("0:/PHOTO");                //创建PHOTO文件夹
        if(res!=FR_EXIST&&res!=FR_OK)         //发生了错误
        {                    
                Show_Str(30,150,240,16,"SD卡错误!",16,0);
                delay_ms(200);                                 
                Show_Str(30,170,240,16,"拍照功能将不可用!",16,0);
                sd_ok=0;         
        }else
        {
                Show_Str(30,150,240,16,"SD卡正常!",16,0);
                delay_ms(200);                                 
                Show_Str(30,170,240,16,"KEY_UP:拍照",16,0);
                sd_ok=1;            
        }                                                                                                                                       
         pname=mymalloc(30);        //为带路径的文件名分配30个字节的内存                    
         while(pname==NULL)                        //内存分配出错
         {            
                Show_Str(30,190,240,16,"内存分配失败!",16,0);
                delay_ms(200);                                 
                LCD_Fill(30,190,240,146,WHITE);//清除显示            
                delay_ms(200);                                 
        }  

        while(1)//初始化OV7725
        {
                if(OV7725_Init()==0)
                {
                        sensor=OV7725;
                        LCD_ShowString(30,150,200,16,16,"OV7725 Init OK       ");                                
                        delay_ms(1500);
                        OV7725_Light_Mode(0);
                        OV7725_Color_Saturation(0);
                        OV7725_Brightness(0);
                        OV7725_Contrast(0);
                        OV7725_Special_Effects(0);
                        OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式输出
                        OV7725_CS=0;
                        break;
                }
                else
                {
                        LCD_ShowString(30,150,200,16,16,"OV7725_OV7670 Error!!");
                        delay_ms(200);
                        LCD_Fill(30,150,200,246,WHITE);
                        delay_ms(200);
                }
        }           
        TIM3_Int_Init(10000,7199);                        //TIM3,10Khz计数频率,1秒钟中断                                                                          
        EXTI15_Init();                                                //使能定时器捕获                                                  
         LCD_Clear(BACK_COLOR);
        while(1)
        {        
                key=KEY_Scan(1);//不支持连按
                if(key==KEY0_PRES)
                {
                        if(sd_ok)
                        {
                                LED1=0;        //点亮DS1,提示正在拍照
                                camera_new_pathname(pname);//得到文件名                    
                                if(bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0))//拍照有误
                                {
                                        Show_Str(40,130,240,12,"写入文件错误!",12,0);                 
                                }else
                                {
                                        Show_Str(40,130,240,12,"拍照成功!",12,0);
                                        Show_Str(40,150,240,12,"保存为:",12,0);
                                         Show_Str(40+42,150,240,12,pname,12,0);                    
                                        delay_ms(100);
                                 }
                        }else //提示SD卡错误
                        {                                            
                                Show_Str(40,130,240,12,"SD卡错误!",12,0);
                                 Show_Str(40,150,240,12,"拍照功能不可用!",12,0);                           
                         }
                        LED1=1;//关闭DS1
                        delay_ms(1800);//等待1.8秒钟
                        LCD_Clear(BLACK);
                }else delay_ms(5);
               
                if(sensor==OV7725) camera_refresh();                //更新显示

                i++;
                if(i>=40)//DS0闪烁.
                {
                        i=0;
                        LED0=!LED0;
                 }
        }                                                                                               
}

高山仰止
2楼-- · 2019-07-21 11:42
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 16:38
 精彩回答 2  元偷偷看……

一周热门 更多>