新手入门
- 积分
- 19
- 金钱
- 19
- 注册时间
- 2018-1-3
- 在线时间
- 6 小时
|
14金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "malloc.h"
#include "sdio_sdcard.h"
#include "w25qxx.h"
#include "ff.h"
#include "exfuns.h"
#include "text.h"
#include "piclib.h"
#include "string.h"
#include "math.h"
#include "ov7670.h"
#include "beep.h"
#include "timer.h"
#include "exti.h"
#include "atk_ncr.h"
long chartolong( char * string, int length )
{
long number;
if (length <= 4)
{
memset( &number, 0x00, sizeof(long) );
memcpy( &number, string, length );
}
return number;
}
typedef struct
{
char cfType[2];
char cfSize[4];
char cfReserved[4];
char cfoffBits[4];
}__attribute__((packed)) BITMAPFILEHEADER1;
/* ???????40byte */
typedef struct
{
char ciSize[4];
char ciWidth[4];
char ciHeight[4];
char ciPlanes[2];
char ciBitCount[2];
char ciCompress[4];
char ciSizeImage[4];
char ciXPelsPerMeter[4];
char ciYPelsPerMeter[4];
char ciClrUsed[4];
char ciClrImportant[4];
}__attribute__((packed)) BITMAPINFOHEADER1;
typedef struct PIXINFO
{
u8 r;
u8 g;
u8 b;
}PIX;
//得到路径下的目标文件总数
u16 pic_get_tnum(u8 *path)
{
u8 res;
u16 rval=0;
DIR tdir; //临时目录
FILINFO tfileinfo; //临时文件信息
u8 *fn;
res=f_opendir(&tdir,(const TCHAR*)path); //打开目录
tfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize);//为长文件缓存区分配内存
if(res==FR_OK&&tfileinfo.lfname!=NULL)
{
while(1)//查询有效文件总数
{
res=f_readdir(&tdir,&tfileinfo); //读取目录下的一个文件
if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了退出
fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X50)//取高四位看是否是图片文件
{
rval++;//有效文件数+1
}
}
}
return rval;
}
//灰度算法
unsigned int rgbtogray(unsigned int camera)
{
unsigned char graydata;
unsigned char red,green,blue;
unsigned int temp;
red=(unsigned char)((camera&0xf800)>>8);
green=(unsigned char)((camera&0x07e0)>>3);
blue=(unsigned char)((camera&0x001f)<<3);
graydata=(30*red+59*green+11*blue+50)/100;
red=graydata;
green=graydata;
blue=graydata;
temp=((((unsigned int)(red))<<8)&0xf800)+((((unsigned int)(green))<<3)&0x07e0)+((red>>3)&0x001f);
if (temp<0x8000) return 0x00;
else return 0xffff;
}
extern u8 ov_sta;
extern u8 ov_frame;
//更新LCD显示
void camera_refresh(void)
{
u32 j;
u16 color;
if(ov_sta)//óDÖ¡ÖD¶Ï¸üD£¿
{
LCD_Scan_Dir(U2D_L2R); //′óéÏμ½ÏÂ,′ó×óμ½óò
if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//½«ÏÔê¾ÇøóòéèÖÃμ½ÆáÄ»ÖDÑë
else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//½«ÏÔê¾ÇøóòéèÖÃμ½ÆáÄ»ÖDÑë
LCD_WriteRAM_Prepare(); //¿aê¼D′èëGRAM
OV7670_RRST=0; //¿a꼸′λ¶áÖ¸Õë
OV7670_RCK_L;
OV7670_RCK_H;
OV7670_RCK_L;
OV7670_RRST=1; //¸′λ¶áÖ¸Õë½áêø
OV7670_RCK_H;
for(j=0;j<76800;j++)
{
OV7670_RCK_L;
color=GPIOC->IDR&0XFF; //¶áêy¾Y
OV7670_RCK_H;
color<<=8;
OV7670_RCK_L;
color|=GPIOC->IDR&0XFF; //¶áêy¾Y
OV7670_RCK_H;
LCD->LCD_RAM=rgbtogray(color);
}
ov_sta=0; //ÇåáãÖ¡ÖD¶Ï±ê¼Ç
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //»Ö¸′ĬèÏé¨Ãè·½Ïò
}
}
//ÎļtÃû×ÔÔö£¨±üÃa¸2¸Ç£©
//×éoÏ3é Îèç"0 HOTO/PIC13141.bmp"μÄÎļtÃû
void camera_new_pathname(u8 *pname)
{
u8 res;
u16 index=0;
while(index<0XFFFF)
{
sprintf((char*)pname,"0 HOTO/PIC%05d.bmp",index);
res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//3¢êÔ′ò¿aÕa¸öÎļt
if(res==FR_NO_FILE)break; //¸ÃÎļtÃû2»′æÔú=ÕyêÇÎòÃÇDèòaμÄ.
index++;
}
}
int main(void)
{
u8 *pname; //′øÂ·¾¶μÄÎļtÃû
u8 key; //¼üÖμ
u8 i;
u8 sd_ok=1; //0,sd¿¨2»Õy3£;1,SD¿¨Õy3£.
u8 res;
DIR picdir; //í¼Æ¬Ä¿Â¼
FILINFO picfileinfo;//ÎļtDÅÏ¢
u8 *fn; //3¤ÎļtÃû
u16 totpicnum; //í¼Æ¬Îļt×üêy
u16 curindex; //í¼Æ¬μ±Ç°Ë÷òy
u8 t;
u16 temp;
u16 *picindextbl; //í¼Æ¬Ë÷òy±í
BITMAPFILEHEADER1 FileHead;
BITMAPINFOHEADER1 InfoHead;
FIL myfp;
atk_ncr_point READ_BUF[200];
u16 pcnt=0;
u8 resa[10];
int num=0;
u8 *bmpfile=pname;
u8 *mybw;
u32 addr,myres;
PIX pix;
int ciBitCount,ciWidth,ciHeight;
u16 addrcolor[320][240];//′æ′¢ÑÕé«êy×é
u8 lcdcolor[4];
u16 dispcolor=0;
u8 buf[256];
u16 bnum=0;
u16 j=0;
u32 offset=0;
loop: delay_init(); //Ñóê±oˉêy3õê¼»ˉ
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
uart_init(115200); //′®¿ú3õê¼»ˉÎa115200
usmart_dev.init(72); //3õê¼»ˉUSMART
LED_Init(); //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
KEY_Init(); //3õê¼»ˉ°′¼ü
LCD_Init(); //3õê¼»ˉLCD
BEEP_Init(); //·äÃùÆ÷3õê¼»ˉ
W25QXX_Init(); //3õê¼»ˉW25Q128
my_mem_init(SRAMIN); //3õê¼»ˉÄú2¿Äú′æ3Ø
exfuns_init(); //ÎafatfsÏà1رäá¿éêÇëÄú′æ
f_mount(fs[0],"0:",1); //1òÔØSD¿¨
f_mount(fs[1],"1:",1); //1òÔØFLASH.
POINT_COLOR=RED;
while(font_init()) //¼ì2é×Ö¿a
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//Çå3yÏÔê¾
}
Show_Str(30,50,200,16,"Õ½½¢STM32F1¿a·¢°å",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,"zzy",16,0);
Show_Str(30,130,200,16,"2018Äê1ÔÂ3èÕ",16,0);
res=f_mkdir("0:/PHOTO"); //′′½¨PHOTOÎļt¼D
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,"ÅÄÕÕ1|Äü½«2»¿éóÃ!",16,0);
sd_ok=0;
}else
{
Show_Str(30,150,240,16,"SD¿¨Õy3£!",16,0);
delay_ms(200);
Show_Str(30,170,240,16,"KEY0:ÅÄÕÕ",16,0);
sd_ok=1;
}
pname=mymalloc(SRAMIN,30); //Îa′øÂ·¾¶μÄÎļtÃû·ÖÅä30¸ö×Ö½úμÄÄú′æ
while(pname==NULL) //Äú′æ·ÖÅä3ö′í
{
Show_Str(30,190,240,16,"Äú′æ·ÖÅäê§°ü!",16,0);
delay_ms(200);
LCD_Fill(30,190,240,146,WHITE);//Çå3yÏÔê¾
delay_ms(200);
}
while(OV7670_Init())//3õê¼»ˉOV7670
{
Show_Str(30,190,240,16,"OV7670 ′íÎó!",16,0);
delay_ms(200);
LCD_Fill(30,190,239,206,WHITE);
delay_ms(200);
}
Show_Str(30,190,200,16,"OV7670 Õy3£",16,0);
delay_ms(1500);
TIM6_Int_Init(10000,7199); //10Khz¼ÆêyÆμÂê,1ÃëÖóÖD¶Ï
EXTI8_Init(); //ê1Äü¶¨ê±Æ÷2¶»ñ
OV7670_Window_Set(12,176,240,320); //éèÖÃ′°¿ú
OV7670_CS=0;
LCD_Clear(BLACK);
while(1)
{
key=KEY_Scan(0);//2»Ö§3Öᬰ′
switch(key)
{
case KEY0_PRES:
//if(key==KEY0_PRES)
{
if(sd_ok)
{
LED1=0; //μãááDS1,ìáê¾ÕyÔúÅÄÕÕ
camera_new_pathname(pname);//μÃμ½ÎļtÃû
if(bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0))//ÅÄÕÕóDÎó
{
Show_Str(40,130,240,12,"D′èëÎļt′íÎó!",12,0);
}else
{
Show_Str(40,130,240,12,"ÅÄÕÕ3é1|!",12,0);
Show_Str(40,150,240,12,"±£′æÎa:",12,0);
Show_Str(40+42,150,240,12,pname,12,0);
BEEP=1; //·äÃùÆ÷¶ì½D£¬ìáê¾ÅÄÕÕíê3é
delay_ms(60000);
}
}else //ìáê¾SD¿¨′íÎó
{
Show_Str(40,130,240,12,"SD¿¨′íÎó!",12,0);
Show_Str(40,150,240,12,"ÅÄÕÕ1|Äü2»¿éóÃ!",12,0);
}
BEEP=0;//1رշäÃùÆ÷
LED1=1;//1رÕDS1
delay_ms(18000);//μè′y1.8ÃëÖó
LCD_Clear(BLACK);
break;
}
case KEY1_PRES://ÇD»»μ½2é¿′ÕÕÆ¬mode
{
delay_init(); //Ñóê±oˉêy3õê¼»ˉ
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
uart_init(115200); //′®¿ú3õê¼»ˉÎa115200
usmart_dev.init(72); //3õê¼»ˉUSMART
LED_Init(); //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
KEY_Init(); //3õê¼»ˉ°′¼ü
LCD_Init(); //3õê¼»ˉLCD
W25QXX_Init(); //3õê¼»ˉW25Q128
my_mem_init(SRAMIN); //3õê¼»ˉÄú2¿Äú′æ3Ø
exfuns_init(); //ÎafatfsÏà1رäá¿éêÇëÄú′æ
f_mount(fs[0],"0:",1); //1òÔØSD¿¨
f_mount(fs[1],"1:",1); //1òÔØFLASH.
alientek_ncr_init(); //3õê¼»ˉêÖD′ê¶±e
POINT_COLOR=RED;
while(font_init()) //¼ì2é×Ö¿a
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//Çå3yÏÔê¾
delay_ms(200);
}
Show_Str(30,50,200,16,"WarShip STM32F1¿a·¢°å",16,0);
Show_Str(30,70,200,16,"í¼Æ¬ÏÔê¾3ìDò",16,0);
Show_Str(30,90,200,16,"KEY0:NEXT KEY2 REV",16,0);
Show_Str(30,110,200,16,"KEY_UP AUSE",16,0);
Show_Str(30,130,200,16,"ÕÅ×óòY",16,0);
Show_Str(30,150,200,16,"2018Äê1ÔÂ3èÕ",16,0);
while(f_opendir(&picdir,"0:/PHOTO"))//′ò¿aí¼Æ¬Îļt¼D
{
Show_Str(30,170,240,16," HOTOÎļt¼D′íÎó!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//Çå3yÏÔê¾
delay_ms(200);
}
totpicnum=pic_get_tnum("0:/PHOTO"); //μÃμ½×üóDD§Îļtêy
while(totpicnum==NULL)//í¼Æ¬ÎļtÎa0
{
Show_Str(30,170,240,16,"ûóDí¼Æ¬Îļt!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//Çå3yÏÔê¾
delay_ms(200);
}
picfileinfo.lfsize=_MAX_LFN*2+1; //3¤ÎļtÃû×î′ó3¤¶è
picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize); //Îa3¤Îļt»o′æÇø·ÖÅäÄú′æ
pname=mymalloc(SRAMIN,picfileinfo.lfsize); //Îa′øÂ·¾¶μÄÎļtÃû·ÖÅäÄú′æ
picindextbl=mymalloc(SRAMIN,2*totpicnum); //éêÇë2*totpicnum¸ö×Ö½úμÄÄú′æ,óÃóú′æ·Åí¼Æ¬Ë÷òy
while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//Äú′æ·ÖÅä3ö′í
{
Show_Str(30,170,240,16,"Äú′æ·ÖÅäê§°ü!",16,0);
delay_ms(200);
LCD_Fill(30,170,240,186,WHITE);//Çå3yÏÔê¾
delay_ms(200);
}
//¼Ç¼Ë÷òy
res=f_opendir(&picdir,"0:/PHOTO"); //′ò¿aĿ¼
if(res==FR_OK)
{
curindex=0;//μ±Ç°Ë÷òyÎa0
while(1)//è«2¿2éÑˉò»±é
{
temp=picdir.index; //¼Ç¼μ±Ç°index
res=f_readdir(&picdir,&picfileinfo); //¶áè¡Ä¿Â¼ÏÂμÄò»¸öÎļt
if(res!=FR_OK||picfileinfo.fname[0]==0)break; //′íÎóáË/μ½Ä©Î2áË,íË3ö
fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X50)//衸ßËÄλ,¿′¿′êÇ2»êÇí¼Æ¬Îļt
{
picindextbl[curindex]=temp;//¼Ç¼Ë÷òy
curindex++;
}
}
}
Show_Str(30,170,240,16,"¿aê¼ÏÔê¾...",16,0);
delay_ms(1500);
picture:
piclib_init(); //3õê¼»ˉ»-í¼
curindex=0; //′ó0¿aê¼ÏÔê¾
res=f_opendir(&picdir,(const TCHAR*)"0:/PHOTO"); //′ò¿aĿ¼
while(res==FR_OK)//′ò¿a3é1|
{
dir_sdi(&picdir,picindextbl[curindex]); //¸Ä±äμ±Ç°Ä¿Â¼Ë÷òy
res=f_readdir(&picdir,&picfileinfo); //¶áè¡Ä¿Â¼ÏÂμÄò»¸öÎļt
if(res!=FR_OK||picfileinfo.fname[0]==0)break; //′íÎóáË/μ½Ä©Î2áË,íË3ö
fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);
strcpy((char*)pname,"0:/PHOTO/"); //¸′ÖÆÂ·¾¶(Ŀ¼)
strcat((char*)pname,(const char*)fn); //½«ÎļtÃû½óÔúoóÃæ
LCD_Clear(BLACK);
ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//ÏÔê¾í¼Æ¬
Show_Str(2,2,240,16,pname,16,1); //ÏÔê¾í¼Æ¬Ãû×Ö
t=0;
while(1)
{
key=KEY_Scan(0); //é¨Ãè°′¼ü
if(t>250)key=1; //Ä£Äaò»′ΰ′ÏÂKEY0
if((t%20)==0)LED0=!LED0;//LED0éá˸,ìáê¾3ìDòÕyÔúÔËDD.
if(key==KEY2_PRES) //éÏò»ÕÅ
{
if(curindex)curindex--;
else curindex=totpicnum-1;
break;
}else if(key==KEY0_PRES)//ÏÂò»ÕÅ
{
curindex++;
if(curindex>=totpicnum)curindex=0;//μ½Ä©Î2μÄê±oò,×Ô¶ˉ′óí·¿aê¼
break;
}
else if(key==WKUP_PRES)
{
//***********************识别区*********************
myres=f_open(&myfp,bmpfile,FA_OPEN_EXISTING|FA_READ); //?????????????
if (myres != FR_OK)
{
return -1;
}
myres=f_read(&myfp,&FileHead,sizeof(BITMAPFILEHEADER1),(UINT*)&mybw);
if ( myres != FR_OK)
{
f_close(&myfp);
return -2;
}
if (memcmp(FileHead.cfType, "BM", 2) != 0) //????
{
f_close(&myfp);
return -3;
}
myres=f_read(&myfp,(char *)&InfoHead,sizeof(BITMAPINFOHEADER1),(UINT*)&mybw);
if ( myres != FR_OK)
{
f_close(&myfp);
return -4;
}
ciBitCount = (int) chartolong( InfoHead.ciBitCount, 4 );//??????
ciWidth = (int) chartolong( InfoHead.ciWidth , 4 );
ciHeight = (int) chartolong( InfoHead.ciHeight, 4 );
for(bnum=0;bnum<(ciWidth*ciHeight*2+4095)/4096;bnum++)
{
W25QXX_Erase_Sector(addr+bnum*4096);
}
bnum=0;
offset=(int)chartolong(FileHead.cfoffBits,4);
for(j=0;j<ciHeight;j++)
{
f_lseek(&myfp,offset+(ciHeight-j-1)*ciWidth*ciBitCount/8);
for(i=0;i<ciWidth;i++)
{
myres=f_read(&myfp,(char *)&lcdcolor,ciBitCount/8,(UINT*)&mybw);
if(ciBitCount==16)
{
dispcolor=(lcdcolor[0]<<0)|(lcdcolor[1]<<8); //1111 1111 1111 1111
addrcolor[j][i]=dispcolor;//ÑÕé«êy¾Y′æ′¢¼°×ø±ê£¨i.j£©
if((int)chartolong(InfoHead.ciCompress,4)==0) //RGB555
{
pix.r=((dispcolor&0x7C00)>>10);
pix.g=(((dispcolor&0x03E0)<<1)>>5); // RGB555 ???RGB565 G=G*64/32
pix.b=(dispcolor&0x1F);
}
else //RGB565
{
pix.r=((dispcolor&0xF800)>>11);
pix.g=(((dispcolor&0x07E0))>>5); // RGB555 ???RGB565 G=G*64/32
pix.b=(dispcolor&0x1F);
}
}
dispcolor=((pix.r)<<11)|((pix.g)<<5)|(pix.b);
// GUI_DrawPixel(i,j,dispcolor);
buf[bnum++]=(u8)(dispcolor>>8);
buf[bnum++]=(u8)(dispcolor&0xFF);
if(bnum==256)
{
W25QXX_Write_Page(buf,addr,256);
addr+=256;
bnum=0;
}
}
}
W25QXX_Write_Page(buf,addr,bnum);
addr+=bnum;
f_close(&myfp);
//***************************以上是图片编码,以下是识别过程**********************************
for(j=1;j<ciHeight;j++)
for(i=1;i<ciWidth;i++)
{
if(addrcolor[j][i]==0x00)
if(addrcolor[j-1][i]==0xFF||addrcolor[j+1][i]==0xFF||addrcolor[j][i-1]==0xFF||addrcolor[j][i+1]==0xFF)
{READ_BUF[pcnt].x=i;READ_BUF[pcnt++].y=j;}
}
if(pcnt)//óDóDD§μÄêäèë
{
alientek_ncr(READ_BUF,pcnt,6,4,(char*)resa);
Show_Str(30,90,200,16,"ê¶±e½á1û:",16,0);
LCD_ShowString(30+72,90,200,16,16,resa);
}
if(key==KEY2_PRES)
goto picture;
else if(key==KEY1_PRES)
goto loop;
//*****************************************************
}
else if(key==KEY1_PRES)
goto loop;
}
res=0;
}
myfree(SRAMIN,picfileinfo.lfname); //êí·ÅÄú′æ
myfree(SRAMIN,pname); //êí·ÅÄú′æ
myfree(SRAMIN,picindextbl); //êí·ÅÄú′æ
}
default:
delay_ms(3);
camera_refresh();//¸üDÂÏÔê¾
i++;
if(i==40)//DS0éá˸.
{
i=0;
LED0=!LED0;
}
}
}
}
|
|