اطلاعیه

Collapse
No announcement yet.

دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

    سلام به همگی.

    در این تاپیک میخواهیم به کمک دوستان چند تا از فرمت های تصویری رو دیکد و روی LCD 3.2 نشون بدیم.
    از هدر برد LPC1768 و ماژول LCD 3.2 استفاده میکنیم.
    از دوستانی که قبلا کار کردن و یا علاقه به کار کردن در این زمینه دارند تقاضای همکاری میشه.
    قبل از هر چیز دوستان باید Flash-FS رو راه انداخته باشن.
    اگه راه ننداختین اینجا توضیحات خیلی مختصری در این مورد هست در حد راه اندازی.
    هدف اینه که با نوشتن نام یک عکس،عکس از MMC خوانده شود و روی LCD نمایش دهیم.
    از پست بعد با دیکد BMP شروع میکنیم.

    [hr]
    نتیجه دیکد BMP در این پست.
    نتیجه دیکد JPG در این پست.
    تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

    #2
    پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

    سلام

    یکسری توضیحات در مورد ساختار عکس های BMP در لینک زیر داده شده که بسیار مفید هستند.
    http://en.wikipedia.org/wiki/BMP_fil...MP_file_format
    اون چیزی که برای کار ما نیازه این جدوله که باید این پارامتر ها رو از فایل بخونیم و براساس اون عمل کنیم.

    پارامتر هایی که تو عکس مشخص کردم حداقل معلومات برای دیکد کردن عکس هست.که:
    Bitmap offset آفست آدرس شروع پیکسل های عکس.
    Height و Width هم که طول و عرض عکس هستند برحسب پیکسل.
    Bits per pixel مشخص کننده تعداد بیتهای رنگ یه پیکسل از عکس.
    همون طور که میبینید تعداد بایت های هر پارامتر هم جلوی اونها نوشته شده و این پارامتر ها به ترتیب از ابتدای فایل شروع میشن پس اگه یه عکس با فرمت BMP رو با winhex باز کنید میتونید این اطلاعات رو ببینید:

    خب اطلاعاتی که تو تصویر بالا دیدید مربوط میشه به یه عکس 240 *320 که رنگهاش 16 بیتیه و آفست آدرس شروع رنگهاش هم 0x46 هست.
    با داشتن این اطلاعات دیگه نمایش عکس کاری نداره.
    دوستان همت کنند که کدش هم آماده بشه.
    من فعلا lcd ندارم.

    تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

    دیدگاه


      #3
      پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

      سلام
      من قبلا این کار رو توی چندتا از پروژه هام انجام دادم
      عکسها باید به صورت 24 بیت ذخیره شده باشند
      من قبلا با فایل سیستم خود کیل کار می کردم اما الان مدتی هست که به جای اون از FatFs
      http://elm-chan.org/fsw/ff/00index_e.html
      استفاده می کنم البته داخل کد توابع مربوط به فایل سیستم کیل کامنت شده و شما می تونید به راحتی کد رو تغییر بدهید.
      این تابع تقریبا با سایز عکس مشکی نداره اما بعضی از عکسهای کوچیک رو بد نشون می ده .


      کد:
       typedef struct BMIH { //declares BitMap Info Header structure
      	uint32_t biSize;      //Length of bitmap information header (40 bytes for Windows V3 bitmaps)
      	uint32_t biWidth;      //Width (pixels)
      	uint32_t biHeight;     //Height (pixels)
      	uint16_t biPlanes;     //Color planes, always 1
      	uint16_t biBitCount;    //Color bits per pixel (1, 4, 8, 16, 24 and 32)
      	uint32_t biCompression;   //Compression method, we only read uncompressed (type 0)
      	uint32_t biSizeImage;    //Image data length
      	uint32_t biXPelsPerMeter;  //Horizontal resolution (pixels per meter)
      	uint32_t biYPelsPerMeter;  //Vertical resolution (pixel per meter)
      	uint32_t biClrUsed;     //Number of colors, ignored.
      	uint32_t biClrImportant;  //Number of important colors, ignored.                 
      }BMP_INFO;
      
      typedef struct BMFH { //declares BitMap File Header structure
      	//uint16_t bfType;      //Always 0x42 0x4D (hex for BM <-- indicating a bitmap)
      	uint32_t bfSize;      //File size (bytes)
        uint16_t bfReserved1;   //Reserved, ignored
        uint16_t bfReserved2;   //Reserved, ignored
        uint32_t bfOffBits;    //Location in file of the first bitmap data        
      }BMP_HEADER;
      
      
      void LCDOutDat2(unsigned char dath,unsigned char datl) //write data to LCD
       {
      		//			int tt;
      		unsigned short dat;
      		dat=dath;
      		dat=dat*256;
      		dat=dat+datl;
      
      		LPC_GPIO1->FIODIRH=0xFFFF;																			
      
      		LPC_GPIO1->FIOCLRH=0xFFFF;
      
      		LPC_GPIO0->FIOSET=(1<<20);//set rs
      		LPC_GPIO0->FIOSET=(1<<22);//set rd
      		LPC_GPIO0->FIOCLR=(1<<21); //reset wr
      
      		LPC_GPIO1->FIOSETH = dat ;
      
      		LPC_GPIO0->FIOCLR=(1<<19);//reset cs
      		LPC_GPIO0->FIOCLR=(1<<19);//reset cs for delay
      
      		LPC_GPIO0->FIOSET=(1<<19);//set cs
      		LPC_GPIO0->FIOSET=(1<<21);//set wr
      
      		LPC_GPIO1->FIODIRH=0x0000;
      }
      
      unsigned short RGB(unsigned char B, unsigned char G, unsigned char R)
        {
          B = B >> 3; 
          G = G >> 2;
          R = R >> 3;
          LCDOutDat2((R << 3) | (G >> 3), (G << 5) | B );
      	}
      		
      unsigned char lcd_showBMP(unsigned int sx, unsigned int sy, char* fname)  // support BMP 24 bit True color only
          {
      	int i,len;
      	BMP_HEADER BMPHeader;
      	BMP_INFO BMPInfo;
      				
      	FIL fsrc;     /* file objects */
      // 		FILE *f;	
      	FRESULT res;
      	UINT br;
      					
          unsigned int x,y;
          unsigned int ex,ey;
          unsigned char buffer[3];
      					
          
      		f_mount(0,&Fatfs[0]);
      					
      
      		//f = fopen(fname,"r");
      		res = f_open( &fsrc , fname , FA_READ|FA_OPEN_EXISTING);
      		//fread(&BMPHeader,1,2,f);
      		res = f_read(&fsrc, &BMPHeader, 2, &br);
      		//fread(&BMPHeader,1,sizeof(BMPHeader),f);
      		res = f_read(&fsrc, &BMPHeader, sizeof(BMPHeader), &br);
      
      // 	if (BMPHeader.bfType != 0x4d42 )                return 3; // type is 'BM'
      //		fread(&BMPInfo,1, sizeof(BMPInfo), f);    					// read bmp info
      		res = f_read(&fsrc, &BMPInfo, sizeof(BMPInfo), &br);
      		
      		
      //   if (BMPInfo.biSize    != 40)                return 5; //unknown header format/length
      //   if (BMPInfo.biPlanes   !=  1)                return 6; //this should be 1
      //   if (BMPInfo.biWidth    > 240)                return 7; //image over size
      //   if (BMPInfo.biHeight   > 320)                return 8; //image over size
      //   if (BMPInfo.biCompression !=  0)                return 9; //0=no compression
      
       		bmpWidth = BMPInfo.biWidth;
       		bmpHeight = BMPInfo.biHeight;
           
          ex = sx + bmpWidth-1;
          ey = sy + bmpHeight-1;
          if (sx < LCD_margin_xl)sx = LCD_margin_xl;
          if (ex > LCD_margin_xr)ex = LCD_margin_xr;
          if (sy < LCD_margin_yu)sy = LCD_margin_yu;
          if (ey > LCD_margin_yl)ey = LCD_margin_yl;
      
          
          LCDOutIns(LCD_INS_ENTRY_MOD);
          LCDOutDat(0x38);
                  
          LCDOutIns(LCD_INS_START_ADX);
          LCDOutDat(sx);
          LCDOutIns(LCD_INS_END_ADX);
          LCDOutDat(ex);
          LCDOutIns(LCD_INS_GRAM_ADX);
          LCDOutDat(sx);
          x = (ex - sx + 1);
      
      #ifndef LCD_ORN_PORTRAIT
          sy = LCD_SIZE_Y - 1 - sy;
          ey = LCD_SIZE_Y - 1 - ey;
          LCDOutIns(LCD_INS_START_ADY);
          LCDOutDat(ey);
          LCDOutIns(LCD_INS_END_ADY);
          LCDOutDat(sy);
          LCDOutIns(LCD_INS_GRAM_ADY);
          LCDOutDat(sy); 
          y = sy - ey + 1;
      #else
          LCDOutIns(LCD_INS_START_ADY);
          LCDOutDat(sy);
          LCDOutIns(LCD_INS_END_ADY);
          LCDOutDat(ey);
          LCDOutIns(LCD_INS_GRAM_ADY);
          LCDOutDat(sy);
          y = ey - sy;    
      #endif 
          LCDOutIns(LCD_INS_RW_GRAM);
      					
      //    	fseek(f,BMPHeader.bfOffBits,SEEK_CUR);
      
          f_lseek(&fsrc,BMPHeader.bfOffBits);		
      		len=bmpWidth*bmpHeight;
          for (i=0;i<len;i++)           
          {
      // 		  br =fread(&buffer[0],1,3,f);
      //			if(!br)break;
      			res = f_read(&fsrc,buffer,3,&br);
      			if(br==3)RGB(buffer[2],buffer[1],buffer[0]);
      			else break;									  
              
      		}
      			
          LCDOutIns(LCD_INS_ENTRY_MOD);
          LCDOutDat(LCD_VAL_ENTRY_MOD);
      	  f_close(&fsrc);
      // 		fclose (f);		
          return res;      
          }

      دیدگاه


        #4
        پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

        ممنون بابت کدی که قرار دادید.
        کلی کار ما رو راحت کردید.
        در ادامه رو همین کد کار میکنیم تا انواع مختلف BMP رو ساپورت کنه.
        ممنون.
        تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

        دیدگاه


          #5
          پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

          سلام
          دوستان من هنوز جریان این دیکد کردن نفهمیدم که چیه؟ فرق این کاری که دارید می کنید با زمانی که یک عکس با فرمت bitmap را با نرم افزارهایی به هگز تبدیل می کنیم وسپس روی lcd نشان می دهیم چیه؟
          داخل بعضی هدرها تابع هایی برای نشان دادن مستقیم عکس BMPاست فرقشان با این روش چیه؟ :eek:
          I'm Very Question and I have more Question,Please Answer All of my Questions


          [img width=156 height=100]http://uploadtak.com/images/u3536_555_Timer_as_Astable.gif[/img]

          دیدگاه


            #6
            پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

            نوشته اصلی توسط very question
            سلام
            دوستان من هنوز جریان این دیکد کردن نفهمیدم که چیه؟ فرق این کاری که دارید می کنید با زمانی که یک عکس با فرمت bitmap را با نرم افزارهایی به هگز تبدیل می کنیم وسپس روی lcd نشان می دهیم چیه؟
            داخل بعضی هدرها تابع هایی برای نشان دادن مستقیم عکس BMPاست فرقشان با این روش چیه؟ :eek:
            سلام.
            خب فرقشو که خودت گفتی.دیگه نیازی نیست تصاویر رو با نرم افزار تبدیل کنی.خود میکرو این کار رو میکنه.
            وشما فقط تصاویر رو میریزی رو مموری و نشون میدی.

            اون توابعی هم که شما اشاره کردید فقط فرمتهای خاصی از BMP رو ساپورت میکنه.
            هدف اینه که انواع مختلف BMP رو دیکد کنیم.
            lcd دستم برسه کد رو امتحان میکنم و واستون میزارم.
            تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

            دیدگاه


              #7
              پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

              نوشته اصلی توسط lordofnaz

              من قبلا با فایل سیستم خود کیل کار می کردم اما الان مدتی هست که به جای اون از FatFs
              http://elm-chan.org/fsw/ff/00index_e.html
              ببخشید یه کم خارج از بحثه ولی میشه بگید چرا از fs خود کیل استفاده نمیکنید ؟
              چون من با تابع format این کتابخونه مشکل دارم . میخام بدونم اگر این سورس قویتره از این استفاده کنم.
              از جمله ی رفتگان این راه دراز
              باز آمده ای کو که به ما گوید راز
              هان بر سر این دو راهه از روی نیاز
              چیزی نگذاری که نمی آیی باز

              دیدگاه


                #8
                پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                نوشته اصلی توسط mori64
                ببخشید یه کم خارج از بحثه ولی میشه بگید چرا از fs خود کیل استفاده نمیکنید ؟
                چون من با تابع format این کتابخونه مشکل دارم . میخام بدونم اگر این سورس قویتره از این استفاده کنم.
                با سلام
                به چند دلیل :
                1-شرکتهای زیادی از جمله NXP از اون در مثالهای خودشون استفاده کردن
                2- سورسش در دسترس و بازه
                3-بنده از کامپایلرهای مختلف و با میکرو های مختلفی استفاده میکنم و استفاده این کتابخونه باعث می شه کارم یکسان و آسان بشه , مثلا همین نشون دادن عکس , من این کد رو هم با AVR کار کردم هم انواع مختلف ARM از جمله LPC1768 , LPC2368 , LPC2378 .
                4- حتی کدویژن هم از این کتابخانه استفاده می کنه
                5-به نظر من توابع قوی تری داره و کارکردن با اونم راحتتره
                6-یادمه تویه یکی از ورژنهای کیل کلا روش استفاده و توابع تغییر کردن و کلی بدبختی کشیدم تا دوباره کدم راه افتاد و کامپایل شد.
                البته اگه قراره از RL-ARM خود کیل استفاده بکنین مثل RTX , USB , CAN , NETWORK استفاده از FatFs رو توصیه نمیکنم. چون فایل سیستم خودش با اونا راحت تر کار می کنه.

                دیدگاه


                  #9
                  پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                  نوشته اصلی توسط very question
                  سلام
                  دوستان من هنوز جریان این دیکد کردن نفهمیدم که چیه؟ فرق این کاری که دارید می کنید با زمانی که یک عکس با فرمت bitmap را با نرم افزارهایی به هگز تبدیل می کنیم وسپس روی lcd نشان می دهیم چیه؟
                  داخل بعضی هدرها تابع هایی برای نشان دادن مستقیم عکس BMPاست فرقشان با این روش چیه؟ :eek:
                  با سلام
                  علاوه بر دلایلی که دوستان فرمومند دقت بفرمایید که ما فضای حافظه کمی در دسترس داریم و حتی روی حافظه 512 کیلو بایتی نمیشه بیش از دو سه تا عکس 320 در 240 رنگی قرار داد و این موضوع در پروژه های بزرگ به خوبی خودشو نشون می ده و ما رو دچار دردسر می کنه.

                  دیدگاه


                    #10
                    پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                    نوشته اصلی توسط lordofnaz
                    با سلام
                    علاوه بر دلایلی که دوستان فرمومند دقت بفرمایید که ما فضای حافظه کمی در دسترس داریم و حتی روی حافظه 512 کیلو بایتی نمیشه بیش از دو سه تا عکس 320 در 240 رنگی قرار داد و این موضوع در پروژه های بزرگ به خوبی خودشو نشون می ده و ما رو دچار دردسر می کنه.
                    این طور که من از سخنان دوستان برداشت کرده بودم ما می خواهیم با این روش دیکد کردن مستقیم یک فایل BMP را نمایش دهیم و قبلش عکس را با نرم افزاری تبدیل نکنیم ولی این طور که شما می گویید با عث کاهش حجم هم می شود ، می شود یکمی بیشتر توضیح دهید حجم عکس ها مگر ثابت نیست؟
                    I'm Very Question and I have more Question,Please Answer All of my Questions


                    [img width=156 height=100]http://uploadtak.com/images/u3536_555_Timer_as_Astable.gif[/img]

                    دیدگاه


                      #11
                      پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                      نوشته اصلی توسط very question
                      این طور که من از سخنان دوستان برداشت کرده بودم ما می خواهیم با این روش دیکد کردن مستقیم یک فایل BMP را نمایش دهیم و قبلش عکس را با نرم افزاری تبدیل نکنیم ولی این طور که شما می گویید با عث کاهش حجم هم می شود ، می شود یکمی بیشتر توضیح دهید حجم عکس ها مگر ثابت نیست؟
                      با سلام
                      نکته اینجاست که ما می توانیم هر تعداد عکس BMP که داریم رو بریزیم داخل کارت حافظه(SD) و با تابعی که معرفی شد به طور مستقیم روی LCD نشون بدیم.
                      اما قبلا , اول باید عکس رو با یه نرم افزار مخصوص به یک آرایه تبدیل می کردیم و بعدا اونو کپی میکردیم داخل کدمون و با یک تابعی عکسو روی LCD نشون می دادیم.
                      چون در این روش اطلاعات عکس داخل کد قرار میگیره به طبع حجم کد زیاد می شه مثلا برای یک عکس 320 در 240 پیکسلی محاسباتش اینطوری می شه:
                      320*240*2=153600
                      اون 2 که در تعداد پیکسلها ضرب شده به خاطر ارتباط 16 بیتی با LCD هستش (RGB565) یعنی رنگ هر پیکسل با 16 بیت مشخص می شه.
                      همون طور که میبینید ما برای یک عکس حدودا به 153 کیلو بایت حافظه نیاز داریم , حالا این حجمو مقاسه کنید با 32 کیلو بایت حافظه ی ATMEGA32.
                      یا مثلا LPC1768 که 512 کیلو بایت حافظه داره حدودا سه تا عکس روش جا می شه.

                      دیدگاه


                        #12
                        پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                        سلام
                        استفاده از حافظه جانبی مانند MMC در دیکد کردن تصویر ضروریه ولی این رو هم در نظر داشته باشیم که هدف از پروژه دیکد کردن تصویر اینه که عکس bmp رو داخل MMC قرار داده و توسط میکرو اون رو کدگشایی کنیم و در LCD نشان دهیم نه این که با نرم افزاری تصویر رو به یک آرایه تبدیل کنیم و به MMC ریخته و اون آرایه رو بخونیم.

                        دیدگاه


                          #13
                          پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                          با سلام دوباره
                          من برای کمک به دوستان در ارتباط با پست قبلی یک پروژه ای رو به طور نمونه کار کردم که توضیحاتش رو به همراه فایل کامل پروژه براتون میزارم.
                          1- این پروژه با برد آموزشی LPC1768 شرکت ECA انجام شده است.
                          2- در این پروژه از کتابخانه FlashFS استفاده شده است.
                          3- این پروژه تکممیل شده مثال SD_File می باشد.
                          4- مثال SD_File برای خواندن و نوشتن در MMC می باشد که توسط شرکت keil ارائه شده است. که من هم خواندن تصویر bmp رو به این مثال اضافه کردم.
                          5- کسانی که از برد آموزشی استفاده نمی کنند برای گاهی از سخت افزار می توانند به شماتیک برد آموزشی که در سایت قرار داده شده است مراجعه کنند.
                          6-به طور خلاصه توسط این برنامه می تونید تصاویر bmp 24-bit موجود در MMC متصل به برد رو دیکد کرده و در lcd نشان دهید.فقط کافیست که توسط نرم افزار هایپر ترمینال115200-8-N-1 ویندوز دستور مقابل رو وارد کرده و کلید Enter رو بزنید. SHOWPIC fname.bmp
                          **fname همان نام تصویر bmp می باشد.
                          7-کسانی که قبلاً مثال SD_File رو راه اندازی کردند می تونند راحت تر این پروژه رو اجرا کنند.
                          8- می تونید با تکمیل این پروژه ، پروژه دیکد تصویر bmp رو به اتمام برسونید.
                          فایل های پیوست شده

                          دیدگاه


                            #14
                            پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                            نوشته اصلی توسط یوسف خداپرست
                            6-به طور خلاصه توسط این برنامه می تونید تصاویر bmp 24-bit موجود در MMC متصل به برد رو دیکد کرده و در lcd نشان دهید.فقط کافیست که توسط نرم افزار هایپر ترمینال115200-8-N-1 ویندوز دستور مقابل رو وارد کرده و کلید Enter رو بزنید. SHOWPIC fname.bmp
                            سلام خیلی ممنون ازشما :nice:
                            ببخشید این قسمت 6 یعنی اینکه باید ارتباط سریال هم راه اندازی کنیم؟
                            I'm Very Question and I have more Question,Please Answer All of my Questions


                            [img width=156 height=100]http://uploadtak.com/images/u3536_555_Timer_as_Astable.gif[/img]

                            دیدگاه


                              #15
                              پاسخ : دیکد فرمت های تصویری و نمایش روی LCD 3.2 با LPC1768

                              بله باید با کابل سریال پورت com کامپیوتر رو به UART0 میکروکنترلر وصل کرده و دستور نمایش تصویر رو از طریق پورت سریال و نرم افزار هایپر ترمینال به میکروکنترلر بفرستید.
                              البته این فقط یک مثال قابل توسعه برای دیکد کردن تصویره و به راحتی می تونیم دستور نمایش عکس رو توسط کلیدها یا لمس صفحه نمایش انجام دهیم .البته این نکته رو هم بگم که این مثال فقط تصاویر 240*320 رو نمایش می دهد.انتظار من از دوستان اینه که همکاری کرده تا هم این پروژه تکمیل شده باشد و هم یه کار گروهی انجام داده باشیم.

                              دیدگاه

                              لطفا صبر کنید...
                              X