本人利用UCOS和stemwin做了一个界面,界面中有一个拍照按钮。现在的问题是按下按钮启动拍照功能后,照片拍摄结束后,无法返回主界面,LCD屏上一直显示的是我刚刚拍摄的照片。按下按钮后,程序进入camera_play()这个函数,然后好像就出不去了,我的想法是在camera_play()这个函数结束后,重回绘制主界面,加上这两句GUI_EndDialog(pMsg->hWin, 0);
GUI_CreateDialogBox(_aDialogCreate1, GUI_COUNTOF(_aDialogCreate1),_cbDialog1, WM_HBKWIN, 0, 0);
可是LCD屏依旧卡死了,楼主刚刚入坑,很多地方不太懂,望大神解惑。
下面是我的camera_play()函数具体代码:
void camera_play(void)
{
u8 res;
u8 key;
u8 sd_ok=1; //0,sd卡不正常;1,SD卡正常.
u8 scale=1; //默认是全尺寸缩放
u8 msgbuf[15]; //消息缓存区
u8 *pname; //带路径的文件名
u8 photo_ok=1; //拍照是否完成标志 1:未完成拍照 0:完成拍照
extern OS_TCB EmwindemoTaskTCB;
extern OS_ERR err;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
TFTLCD_Init(); //初始化LCD
W25QXX_Init(); //初始化W25Q128
FSMC_SRAM_Init(); //初始化外部SRAM.
mem_init(SRAMIN); //初始化内部内存池
mem_init(SRAMEX); //初始化内部内存池
mem_init(SRAMCCM); //初始化CCM内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
res=f_mkdir("0:/PHOTO"); //创建PHOTO文件夹
if(res!=FR_EXIST&&res!=FR_OK) //发生了错误
{
Show_Str(200,290,210,16,"SD 卡错误!",16,0);
delay_ms(200);
Show_Str(200,290,210,16,"拍照功能将不可用!",16,0);
}
jpeg_buf0=mymalloc(SRAMIN,jpeg_dma_bufsize*4); //为jpeg dma接收申请内存
jpeg_buf1=mymalloc(SRAMIN,jpeg_dma_bufsize*4); //为jpeg dma接收申请内存
jpeg_data_buf=mymalloc(SRAMEX,300*1024); //为jpeg文件申请内存(最大300KB)
pname=mymalloc(SRAMIN,30);//为带路径的文件名分配30个字节的内存
while(pname==NULL||!jpeg_buf0||!jpeg_buf1||!jpeg_data_buf) //内存分配出错
{
Show_Str(200,290,240,16,"内存分配失败!",16,0);
delay_ms(200);
LCD_Fill(200,290,240,146,WHITE);//清除显示
delay_ms(200);
}
while(OV2640_Init())//初始化OV2640
{
Show_Str(200,290,240,16,"OV2640 错误!",16,0);
delay_ms(200);
LCD_Fill(200,290,239,206,WHITE);
delay_ms(200);
}
Show_Str(200,290,200,16,"OV2640 正常",16,0);
delay_ms(2000);
OV2640_RGB565_Mode(); //JPEG模式
My_DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&TFTLCD->LCD_RAM,0,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置
OV2640_OutSize_Set(lcddev.width,lcddev.height);
DCMI_Start(); //启动传输
while(photo_ok==1)
{
key=KEY_Scan(0);//不支持连按
if(key)
{
DCMI_Stop(); //停止显示
if(key==WKUP_PRES)
{
scale=!scale;
if(scale==0)
{
OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸
OV2640_OutSize_Set(lcddev.width,lcddev.height);
sprintf((char*)msgbuf,"Full Size 1:1");
}else
{
OV2640_ImageWin_Set(0,0,1600,1200); //全尺寸缩放
OV2640_OutSize_Set(lcddev.width,lcddev.height);
sprintf((char*)msgbuf,"Scale");
}
LCD_ShowString(30,50,210,16,16,msgbuf);//显示提示内容
delay_ms(800);
}else if(sd_ok)//SD卡正常才可以拍照
{
sw_sdcard_mode(); //切换为SD卡模式
if(key==KEY1_PRES)//JPG拍照
{
camera_new_pathname(pname,1);//得到文件名
res=ov2640_jpg_photo(pname);
if(scale==0)
{
OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸
OV2640_OutSize_Set(lcddev.width,lcddev.height);
}else
{
OV2640_ImageWin_Set(0,0,1600,1200); //全尺寸缩放
}
OV2640_OutSize_Set(lcddev.width,lcddev.height);
}
sw_ov2640_mode(); //切换为OV2640模式
if(res)//拍照有误
{
Show_Str(30,130,240,16,"写入文件错误!",16,0);
}
else
{
Show_Str(30,130,240,16,"拍照成功!",16,0);
Show_Str(30,150,240,16,"保存为:",16,0);
Show_Str(30+42,150,240,16,pname,16,0);
delay_ms(100);
photo_ok=0;
}
}
}
}
sw_sdcard_mode(); //切换为SD卡模式
delay_ms(200);
OSTaskSuspend((OS_TCB* )&EmwindemoTaskTCB,&err); //挂起emwin_task
GUI_Init(); //STemWin初始化
OSTaskResume((OS_TCB* )&EmwindemoTaskTCB,&err); //挂起emwin_task
}
|