OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3871|回复: 3

关于OV7670模块的字符识别程序,前面两个模块,照相和查看照片的功能均可用,请各位大佬帮忙调试一下

[复制链接]

4

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-1-3
在线时间
6 小时
发表于 2018-1-10 10:50:02 | 显示全部楼层 |阅读模式
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&#214;&#161;&#214;D&#182;&#207;&#184;üD&#194;£&#191;
        {
                LCD_Scan_Dir(U2D_L2R);                //′óé&#207;μ&#189;&#207;&#194;,′ó×óμ&#189;óò  
                if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//&#189;&#171;&#207;&#212;ê&#190;&#199;&#248;óòéè&#214;&#195;μ&#189;&#198;á&#196;&#187;&#214;D&#209;&#235;
                else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//&#189;&#171;&#207;&#212;ê&#190;&#199;&#248;óòéè&#214;&#195;μ&#189;&#198;á&#196;&#187;&#214;D&#209;&#235;
                LCD_WriteRAM_Prepare();     //&#191;aê&#188;D′è&#235;GRAM       
                OV7670_RRST=0;                                //&#191;aê&#188;&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;
                OV7670_RCK_L;
                OV7670_RCK_H;
                OV7670_RCK_L;
                OV7670_RRST=1;                                //&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;&#189;áê&#248;
                OV7670_RCK_H;
                for(j=0;j<76800;j++)
                {
                        OV7670_RCK_L;
                        color=GPIOC->IDR&0XFF;        //&#182;áêy&#190;Y
                        OV7670_RCK_H;
                        color<<=8;  
                        OV7670_RCK_L;
                        color|=GPIOC->IDR&0XFF;        //&#182;áêy&#190;Y
                        OV7670_RCK_H;
                        LCD->LCD_RAM=rgbtogray(color);   
                }                
                ov_sta=0;                                        //&#199;&#229;á&#227;&#214;&#161;&#214;D&#182;&#207;±ê&#188;&#199;
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);        //&#187;&#214;&#184;′&#196;&#172;è&#207;é¨&#195;è·&#189;&#207;ò
        }
}          
//&#206;&#196;&#188;t&#195;&#251;×&#212;&#212;&#246;£¨±ü&#195;a&#184;2&#184;&#199;£&#169;
//×éo&#207;3é&#206;è&#231;"0HOTO/PIC13141.bmp"μ&#196;&#206;&#196;&#188;t&#195;&#251;
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);//3¢ê&#212;′ò&#191;a&#213;a&#184;&#246;&#206;&#196;&#188;t
                if(res==FR_NO_FILE)break;                //&#184;&#195;&#206;&#196;&#188;t&#195;&#251;2&#187;′&#230;&#212;ú=&#213;yê&#199;&#206;ò&#195;&#199;Dèòaμ&#196;.
                index++;
        }
}


int main(void)
{         
         
        u8 *pname;                                //′&#248;&#194;·&#190;&#182;μ&#196;&#206;&#196;&#188;t&#195;&#251;
        u8 key;                                        //&#188;ü&#214;μ                  
        u8 i;                                                 
        u8 sd_ok=1;                                //0,sd&#191;¨2&#187;&#213;y3£;1,SD&#191;¨&#213;y3£.
u8 res;
        DIR picdir;                         //í&#188;&#198;&#172;&#196;&#191;&#194;&#188;
        FILINFO picfileinfo;//&#206;&#196;&#188;tD&#197;&#207;¢
        u8 *fn;                           //3¤&#206;&#196;&#188;t&#195;&#251;
        u16 totpicnum;                 //í&#188;&#198;&#172;&#206;&#196;&#188;t×üêy
        u16 curindex;                //í&#188;&#198;&#172;μ±&#199;°&#203;÷òy
        u8 t;
        u16 temp;
        u16 *picindextbl;        //í&#188;&#198;&#172;&#203;÷ò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];//′&#230;′¢&#209;&#213;é&#171;êy×é
        u8 lcdcolor[4];
        u16 dispcolor=0;
        u8 buf[256];
        u16 bnum=0;
        u16 j=0;
        u32 offset=0;
         
         loop:        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é&#206;a×é2£o2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
        uart_init(115200);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
        usmart_dev.init(72);                //3&#245;ê&#188;&#187;ˉUSMART               
        LED_Init();                                          //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
        KEY_Init();                                        //3&#245;ê&#188;&#187;ˉ°′&#188;ü
        LCD_Init();                                           //3&#245;ê&#188;&#187;ˉLCD  
        BEEP_Init();                        //·&#228;&#195;ù&#198;÷3&#245;ê&#188;&#187;ˉ         
        W25QXX_Init();                                //3&#245;ê&#188;&#187;ˉW25Q128
        my_mem_init(SRAMIN);                //3&#245;ê&#188;&#187;ˉ&#196;ú2&#191;&#196;ú′&#230;3&#216;
        exfuns_init();                                //&#206;afatfs&#207;à1&#216;±&#228;á&#191;éê&#199;&#235;&#196;ú′&#230;  
        f_mount(fs[0],"0:",1);                 //1ò&#212;&#216;SD&#191;¨
        f_mount(fs[1],"1:",1);                 //1ò&#212;&#216;FLASH.
        POINT_COLOR=RED;      
        while(font_init())                                 //&#188;ì2é×&#214;&#191;a
        {            
                LCD_ShowString(30,50,200,16,16,"Font Error!");
                delay_ms(200);                                  
                LCD_Fill(30,50,240,66,WHITE);//&#199;&#229;3y&#207;&#212;ê&#190;             
        }           
        Show_Str(30,50,200,16,"&#213;&#189;&#189;¢STM32F1&#191;a·¢°&#229;",16,0);                                             
        Show_Str(30,70,200,16,"&#213;&#213;&#207;à&#187;úêμ&#209;é",16,0);                                             
        Show_Str(30,90,200,16,"KEY0:&#197;&#196;&#213;&#213;",16,0);                                             
        Show_Str(30,110,200,16,"zzy",16,0);                                             
        Show_Str(30,130,200,16,"2018&#196;ê1&#212;&#194;3è&#213;",16,0);
        res=f_mkdir("0:/PHOTO");                //′′&#189;¨PHOTO&#206;&#196;&#188;t&#188;D
        if(res!=FR_EXIST&&res!=FR_OK)         //·¢éúá&#203;′í&#206;ó
        {                    
                Show_Str(30,150,240,16,"SD&#191;¨′í&#206;ó!",16,0);
                delay_ms(200);                                  
                Show_Str(30,170,240,16,"&#197;&#196;&#213;&#213;1|&#196;ü&#189;&#171;2&#187;&#191;éó&#195;!",16,0);
                sd_ok=0;         
        }else
        {
                Show_Str(30,150,240,16,"SD&#191;¨&#213;y3£!",16,0);
                delay_ms(200);                                  
                Show_Str(30,170,240,16,"KEY0:&#197;&#196;&#213;&#213;",16,0);
                sd_ok=1;            
        }                                                                                                                                       
        pname=mymalloc(SRAMIN,30);        //&#206;a′&#248;&#194;·&#190;&#182;μ&#196;&#206;&#196;&#188;t&#195;&#251;·&#214;&#197;&#228;30&#184;&#246;×&#214;&#189;úμ&#196;&#196;ú′&#230;                    
        while(pname==NULL)                        //&#196;ú′&#230;·&#214;&#197;&#228;3&#246;′í
        {            
                Show_Str(30,190,240,16,"&#196;ú′&#230;·&#214;&#197;&#228;ê§°ü!",16,0);
                delay_ms(200);                                  
                LCD_Fill(30,190,240,146,WHITE);//&#199;&#229;3y&#207;&#212;ê&#190;             
                delay_ms(200);                                  
        }                                                                                             
        while(OV7670_Init())//3&#245;ê&#188;&#187;ˉOV7670
        {
                Show_Str(30,190,240,16,"OV7670 ′í&#206;ó!",16,0);
                delay_ms(200);
            LCD_Fill(30,190,239,206,WHITE);
                delay_ms(200);
        }
        Show_Str(30,190,200,16,"OV7670 &#213;y3£",16,0);
        delay_ms(1500);                          
        TIM6_Int_Init(10000,7199);                        //10Khz&#188;&#198;êy&#198;μ&#194;ê,1&#195;&#235;&#214;ó&#214;D&#182;&#207;                                                                          
        EXTI8_Init();                                                //ê1&#196;ü&#182;¨ê±&#198;÷2&#182;&#187;&#241;
        OV7670_Window_Set(12,176,240,320);        //éè&#214;&#195;′°&#191;ú          
          OV7670_CS=0;       
        LCD_Clear(BLACK);
        while(1)
        {       
                key=KEY_Scan(0);//2&#187;&#214;§3&#214;á&#172;°′
                switch(key)
                {
                        case KEY0_PRES:
                //if(key==KEY0_PRES)
                {
                        if(sd_ok)
                        {
                                LED1=0;        //μ&#227;ááDS1,ìáê&#190;&#213;y&#212;ú&#197;&#196;&#213;&#213;
                                camera_new_pathname(pname);//μ&#195;μ&#189;&#206;&#196;&#188;t&#195;&#251;                    
                                if(bmp_encode(pname,(lcddev.width-240)/2,(lcddev.height-320)/2,240,320,0))//&#197;&#196;&#213;&#213;óD&#206;ó
                                {
                                        Show_Str(40,130,240,12,"D′è&#235;&#206;&#196;&#188;t′í&#206;ó!",12,0);                 
                                }else
                                {
                                        Show_Str(40,130,240,12,"&#197;&#196;&#213;&#213;3é1|!",12,0);
                                        Show_Str(40,150,240,12,"±£′&#230;&#206;a:",12,0);
                                        Show_Str(40+42,150,240,12,pname,12,0);                    
                                        BEEP=1;        //·&#228;&#195;ù&#198;÷&#182;ì&#189;D£&#172;ìáê&#190;&#197;&#196;&#213;&#213;íê3é
                                        delay_ms(60000);
                                 }
                        }else //ìáê&#190;SD&#191;¨′í&#206;ó
                        {                                            
                                Show_Str(40,130,240,12,"SD&#191;¨′í&#206;ó!",12,0);
                                Show_Str(40,150,240,12,"&#197;&#196;&#213;&#213;1|&#196;ü2&#187;&#191;éó&#195;!",12,0);                            
                        }
                         BEEP=0;//1&#216;±&#213;·&#228;&#195;ù&#198;÷
                        LED1=1;//1&#216;±&#213;DS1
                        delay_ms(18000);//μè′y1.8&#195;&#235;&#214;ó
                        LCD_Clear(BLACK);
                        break;
                }
                        case KEY1_PRES://&#199;D&#187;&#187;μ&#189;2é&#191;′&#213;&#213;&#198;&#172;mode
                {
                       
                       
         
        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é&#206;a×é2£o2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
        uart_init(115200);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
        usmart_dev.init(72);                //3&#245;ê&#188;&#187;ˉUSMART               
        LED_Init();                                          //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
        KEY_Init();                                        //3&#245;ê&#188;&#187;ˉ°′&#188;ü
        LCD_Init();                                           //3&#245;ê&#188;&#187;ˉLCD   
        W25QXX_Init();                                //3&#245;ê&#188;&#187;ˉW25Q128
        my_mem_init(SRAMIN);                //3&#245;ê&#188;&#187;ˉ&#196;ú2&#191;&#196;ú′&#230;3&#216;
        exfuns_init();                                //&#206;afatfs&#207;à1&#216;±&#228;á&#191;éê&#199;&#235;&#196;ú′&#230;  
        f_mount(fs[0],"0:",1);                 //1ò&#212;&#216;SD&#191;¨
        f_mount(fs[1],"1:",1);                 //1ò&#212;&#216;FLASH.
                                                alientek_ncr_init();                //3&#245;ê&#188;&#187;ˉê&#214;D′ê&#182;±e
POINT_COLOR=RED;      
        while(font_init())                 //&#188;ì2é×&#214;&#191;a
        {            
                LCD_ShowString(30,50,200,16,16,"Font Error!");
                delay_ms(200);                                  
                LCD_Fill(30,50,240,66,WHITE);//&#199;&#229;3y&#207;&#212;ê&#190;             
                delay_ms(200);                                  
        }           
        Show_Str(30,50,200,16,"WarShip STM32F1&#191;a·¢°&#229;",16,0);                                             
        Show_Str(30,70,200,16,"í&#188;&#198;&#172;&#207;&#212;ê&#190;3ìDò",16,0);                                             
        Show_Str(30,90,200,16,"KEY0:NEXT KEY2REV",16,0);                                             
        Show_Str(30,110,200,16,"KEY_UPAUSE",16,0);                                             
        Show_Str(30,130,200,16,"&#213;&#197;×óòY",16,0);                                             
        Show_Str(30,150,200,16,"2018&#196;ê1&#212;&#194;3è&#213;",16,0);
        while(f_opendir(&picdir,"0:/PHOTO"))//′ò&#191;aí&#188;&#198;&#172;&#206;&#196;&#188;t&#188;D
        {            
                Show_Str(30,170,240,16,"HOTO&#206;&#196;&#188;t&#188;D′í&#206;ó!",16,0);
                delay_ms(200);                                  
                LCD_Fill(30,170,240,186,WHITE);//&#199;&#229;3y&#207;&#212;ê&#190;             
                delay_ms(200);                                  
        }  
        totpicnum=pic_get_tnum("0:/PHOTO"); //μ&#195;μ&#189;×üóDD§&#206;&#196;&#188;têy
          while(totpicnum==NULL)//í&#188;&#198;&#172;&#206;&#196;&#188;t&#206;a0               
        {            
                Show_Str(30,170,240,16,"&#195;&#187;óDí&#188;&#198;&#172;&#206;&#196;&#188;t!",16,0);
                delay_ms(200);                                  
                LCD_Fill(30,170,240,186,WHITE);//&#199;&#229;3y&#207;&#212;ê&#190;             
                delay_ms(200);                                  
        }
          picfileinfo.lfsize=_MAX_LFN*2+1;                                                //3¤&#206;&#196;&#188;t&#195;&#251;×&#238;′ó3¤&#182;è
        picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize);        //&#206;a3¤&#206;&#196;&#188;t&#187;o′&#230;&#199;&#248;·&#214;&#197;&#228;&#196;ú′&#230;
        pname=mymalloc(SRAMIN,picfileinfo.lfsize);                                //&#206;a′&#248;&#194;·&#190;&#182;μ&#196;&#206;&#196;&#188;t&#195;&#251;·&#214;&#197;&#228;&#196;ú′&#230;
        picindextbl=mymalloc(SRAMIN,2*totpicnum);                                //éê&#199;&#235;2*totpicnum&#184;&#246;×&#214;&#189;úμ&#196;&#196;ú′&#230;,ó&#195;óú′&#230;·&#197;í&#188;&#198;&#172;&#203;÷òy
        while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//&#196;ú′&#230;·&#214;&#197;&#228;3&#246;′í
        {            
                Show_Str(30,170,240,16,"&#196;ú′&#230;·&#214;&#197;&#228;ê§°ü!",16,0);
                delay_ms(200);                                  
                LCD_Fill(30,170,240,186,WHITE);//&#199;&#229;3y&#207;&#212;ê&#190;             
                delay_ms(200);                                  
        }         
        //&#188;&#199;&#194;&#188;&#203;÷òy
    res=f_opendir(&picdir,"0:/PHOTO"); //′ò&#191;a&#196;&#191;&#194;&#188;
        if(res==FR_OK)
        {
                curindex=0;//μ±&#199;°&#203;÷òy&#206;a0
                while(1)//è&#171;2&#191;2é&#209;ˉò&#187;±é
                {
                        temp=picdir.index;                                                                //&#188;&#199;&#194;&#188;μ±&#199;°index
                res=f_readdir(&picdir,&picfileinfo);                       //&#182;áè&#161;&#196;&#191;&#194;&#188;&#207;&#194;μ&#196;ò&#187;&#184;&#246;&#206;&#196;&#188;t
                if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //′í&#206;óá&#203;/μ&#189;&#196;&#169;&#206;2á&#203;,í&#203;3&#246;                  
                     fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                         
                        res=f_typetell(fn);       
                        if((res&0XF0)==0X50)//è&#161;&#184;&#223;&#203;&#196;&#206;&#187;,&#191;′&#191;′ê&#199;2&#187;ê&#199;í&#188;&#198;&#172;&#206;&#196;&#188;t       
                        {
                                picindextbl[curindex]=temp;//&#188;&#199;&#194;&#188;&#203;÷òy
                                curindex++;
                        }            
                }
        }   
        Show_Str(30,170,240,16,"&#191;aê&#188;&#207;&#212;ê&#190;...",16,0);
        delay_ms(1500);
        picture:
        piclib_init();                                                                                //3&#245;ê&#188;&#187;ˉ&#187;-í&#188;                     
        curindex=0;                                                                                        //′ó0&#191;aê&#188;&#207;&#212;ê&#190;
           res=f_opendir(&picdir,(const TCHAR*)"0:/PHOTO");         //′ò&#191;a&#196;&#191;&#194;&#188;
        while(res==FR_OK)//′ò&#191;a3é1|
        {       
                dir_sdi(&picdir,picindextbl[curindex]);                        //&#184;&#196;±&#228;μ±&#199;°&#196;&#191;&#194;&#188;&#203;÷òy          
        res=f_readdir(&picdir,&picfileinfo);                       //&#182;áè&#161;&#196;&#191;&#194;&#188;&#207;&#194;μ&#196;ò&#187;&#184;&#246;&#206;&#196;&#188;t
        if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //′í&#206;óá&#203;/μ&#189;&#196;&#169;&#206;2á&#203;,í&#203;3&#246;
             fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                         
                strcpy((char*)pname,"0:/PHOTO/");                                //&#184;′&#214;&#198;&#194;·&#190;&#182;(&#196;&#191;&#194;&#188;)
                strcat((char*)pname,(const char*)fn);                          //&#189;&#171;&#206;&#196;&#188;t&#195;&#251;&#189;ó&#212;úoó&#195;&#230;
                LCD_Clear(BLACK);
                ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//&#207;&#212;ê&#190;í&#188;&#198;&#172;   
                Show_Str(2,2,240,16,pname,16,1);                                 //&#207;&#212;ê&#190;í&#188;&#198;&#172;&#195;&#251;×&#214;
                t=0;
                while(1)
                {
                        key=KEY_Scan(0);                //é¨&#195;è°′&#188;ü
                        if(t>250)key=1;                        //&#196;£&#196;aò&#187;′&#206;°′&#207;&#194;KEY0   
                        if((t%20)==0)LED0=!LED0;//LED0éá&#203;&#184;,ìáê&#190;3ìDò&#213;y&#212;ú&#212;&#203;DD.
                        if(key==KEY2_PRES)                //é&#207;ò&#187;&#213;&#197;
                        {
                                if(curindex)curindex--;
                                else curindex=totpicnum-1;
                                break;
                        }else if(key==KEY0_PRES)//&#207;&#194;ò&#187;&#213;&#197;
                        {
                                curindex++;                          
                                if(curindex>=totpicnum)curindex=0;//μ&#189;&#196;&#169;&#206;2μ&#196;ê±oò,×&#212;&#182;ˉ′óí·&#191;aê&#188;
                                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;//&#209;&#213;é&#171;êy&#190;Y′&#230;′¢&#188;°×&#248;±ê£¨i.j£&#169;
                                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§μ&#196;ê&#228;è&#235;                 
                                {
                                        alientek_ncr(READ_BUF,pcnt,6,4,(char*)resa);       
                                                        Show_Str(30,90,200,16,"ê&#182;±e&#189;á1&#251;:",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);        //êí·&#197;&#196;ú′&#230;                            
        myfree(SRAMIN,pname);                                //êí·&#197;&#196;ú′&#230;                            
        myfree(SRAMIN,picindextbl);                        //êí·&#197;&#196;ú′&#230;               






                        }
                        default:
                delay_ms(3);
                camera_refresh();//&#184;üD&#194;&#207;&#212;ê&#190;
                i++;
                if(i==40)//DS0éá&#203;&#184;.
                {
                        i=0;
                        LED0=!LED0;
                }
        }                                                                                               
}
}
















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-11 01:05:52 | 显示全部楼层
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-8-10
在线时间
9 小时
发表于 2019-8-12 21:11:37 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-8-17
在线时间
9 小时
发表于 2019-8-18 13:12:00 | 显示全部楼层
没注释看不懂啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 02:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表