Animation demo with MIP8F_SPI_Ver60
Dependencies: mbed MIP8F_SPI_Ver60 MIP8f_FRDM_LineBuffer_sample MIP8f_FRDM_TransferMode_sample
Introduction
Animation Demo. Some Goldfish swin in water, from left to right, from bottom to top. Color and monochrome version
Only for LPM027M128x (400x240) ,JDI DIsplay.
Other information , please refer to https://os.mbed.com/teams/JapanDisplayInc/code/MIP8f_FRDM_sample/
Usage
Copy Setting File and Image to micro SD-CARD. you can NOT use same sample color images of OTHER VERSION SAMPLE.
a) Download the following file corresponding to the target panel, and rename file identifier (.bin -> .zip), and unzip the file on micro SD Card's root directory.
LPM027M128x (400x240) :/media/uploads/JDI_Mbed_Team/goldfish_400x240.bin
b) Insert micro SD-CARD to FRDM-K64F. c) Upload binary file to FRDM-K64F.and push Reset Button.
Other information
refer to Usage on https://os.mbed.com/teams/JapanDisplayInc/code/MIP8f_FRDM_sample/
this Sample Code (.bin)
/media/uploads/JDI_Mbed_Team/mip8f_frdm_animation_sample.k64f.bin
Diff: main.cpp
- Revision:
- 14:9d58f49f326f
- Parent:
- 12:40156f03a763
- Child:
- 16:7c472f8a81a5
--- a/main.cpp Tue Nov 06 03:57:02 2018 +0000 +++ b/main.cpp Mon Nov 12 04:33:43 2018 +0000 @@ -1,14 +1,15 @@ /** * @file main.cpp -* @brief Ver4.0 Sample source code for MIP8 diplay. +* @brief Ver5.0 Sample source code for MIP8 diplay. * @details +* Ver5.0 Addtional function is checking the refresh display speed between 4bit and 3bit transfer mode * Ver4.0 Addtional function is Line buffer version.the Sample bitmap display color and monochrome by line buffer. * Ver3.0 Addtional function is font display. this demo code is the nunber is counted up like a meter panel * ver2.0 Addtional function is Monochome display by 1bit mode of SPI transfer. * * spi-transfer to Display has 3 mode. -* 4bit mode is color display, this bit arrange is R,G,B,x. R,G,B = R,G,B subpixel bit. a x bit is Dummy. -* No ues(3bit mode is color display, this bit arrange is R,G,B. R,G,B = R,G,B subpixel bit. No bit is Dummy.) +* 4bit mode is color display, this bit arrange is R,G,B,x. R,G,B = R,G,B subpixel bit. x bit is Dummy. +* 3bit mode is color display, this bit arrange is R,G,B. R,G,B = R,G,B subpixel bit. No bit is Dummy. * 1bit mode is monocrome display,high speed refresh mode. a only Green subpixel of bitmap data is transfered. * <License> * Copyright 2018 Japan Display Inc. @@ -39,11 +40,6 @@ #include "Arial42x42.h" #include "font_big.h" #include "Arial94x94.h" -//#include "Prototype29x28.h" -//#include "Prototype70x86.h" -//#include "HGP23x29.h" -//#include "HGP15x19.h" -//#include "symbol.h" #define ON 1 #define OFF 0 @@ -63,25 +59,17 @@ DigitalIn TexSW(SW3); //for debug -//Serial pc(USBTX, USBRX); // tx, rx +Serial pc(USBTX, USBRX); // tx, rx +void SDtex2BUF(char *filepath); //function prototype -#if FRAMEBUFF_MODE void SD2BUF(char *filepath); -void SDtex2BUF(char *filepath); -void ReadBmp(const char *fsrc, uint32_t FileNum); -#endif - -#if LINEBUFF_MODE -void SD2LINEBUF(char *filepath,int transfermode); -void ReadBmp2LineBuffer(const char *fsrc, uint32_t FileNum,int transfermode); -#endif - void ifOFFseq(void); void ifswPWM(void); void OffSequence(void); void DispAllDir(const char *fsrc); +void ReadBmp(const char *fsrc, uint32_t FileNum); uint32_t CntFile(const char *fsrc); //Grobal value int ifMargeTXT = 0; @@ -100,15 +88,16 @@ int main() { - uint32_t filenum=0; + //uint32_t filenum; char filepath[40]; - //char countup[3+1]; - //char KMPH[4+1]; - - + char countup[3+1]; + char KMPH[4+1]; + char Trans[13+1]; + sd.disk_initialize(); HaltSW.Enable(1); + FILE *fp = fopen("/sd/settings2.txt", "rb"); //read binary if(fp != NULL) { fscanf(fp, "%d",&width); //width read @@ -136,18 +125,10 @@ WD.setWH(width,height); //input -> width, height WD.background(Black); //background = black -#if FRAMEBUFF_MODE WD.clsBUF(); //data initialize WD.writeDISP(); //picture write(black) -#endif -#if LINEBUFF_MODE - WD.clsLINEBUF(); //data initialize - WD.writeDISPLinebuffer(); //picture write(black) -#endif WD.SwDisp(1); //disp on - //OffSW.fall(&OffSequence); // Renamed "OffSW" as "PWMorOFF" for BK PWM setting - //SW settings for PWM or OFF PWMorOFF.fall(&ifswPWM); // Backlight //sw2 fall edge PWMorOFF.rise(&ifOFFseq); // OFF Sequence //sw2 rise edge @@ -163,27 +144,228 @@ //DIR *d; + //filenum = CntFile(filepath); //file number read + ReadBmp(filepath,0); while(1) { //BITMAPS - filenum = CntFile(filepath); //file number read - for(uint32_t i=0; i<filenum; i++) + //for(uint32_t i=0; i<filenum; i++) { - for( int j = 0; j < 2; j++) + for( int j = 0; j < 3; j++) { - #if LINEBUFF_MODE - if( j%2 == 0 ) //&& bmp_bitcount != 8) - ReadBmp2LineBuffer(filepath,i,TrBIT4); - else - ReadBmp2LineBuffer(filepath,i,TrBIT1); - #endif - while(HaltSW.State()); + + while(HaltSW.State()); // VCOM invert when image is still HaltSW.Clear(); + //display bitmap + WD.foreground(0x0e); + WD.background(0x00); + WD.set_ActualFontWidth(); + WD.set_font((unsigned char*) Arial28x28); + //1bit trasfer mode = monochro diplay + if( j%3 == 0 ) + { + sprintf(Trans,"4bit transfer"); + WD.obliqueout(5,210,Trans); + WD.writeDISP(TrBIT4); + }else + if( j%3 == 1 ){ + sprintf(Trans,"3bit transfer"); + WD.obliqueout(5,210,Trans); + WD.writeDISP(TrBIT3); + }else{ + sprintf(Trans,"1bit transfer"); + WD.obliqueout(5,210,Trans); + WD.writeDISP(TrBIT1); + } + + // print KM + if( j%3 != 2 ) + { + // for color diaplay + WD.foreground(0x04);//Greeen + WD.background(0x00);//black + }else{ + // for monochrome diaplay + WD.foreground(0x0e);//white + WD.background(0x00);//black + } + sprintf(KMPH,"km/h"); + WD.set_ActualFontWidth(); + WD.set_font((unsigned char*) Arial28x28); + WD.obliqueout(70+200+35,100+20+49,KMPH); + + //print number + WD.set_font((unsigned char*) Arial94x94); + WD.set_FixedFontWidth(50); + for(int t=0;t<31;t++) + { + sprintf(countup,"%2d",t); + WD.obliqueout(70+35+48,100+20,countup); + + //transfer to display number + if( j%3 == 0 )//4bit and 3bit trasfer + { + // for color display + WD.writeDISP(100+20,190+20,TrBIT4); + }else + if( j%3 == 1 )//3bit and 3bit trasfer + { + // for color diaplay + WD.writeDISP(100+20,190+20,TrBIT3); + }else//1bit and 3bit trasfer + { + // for monochrome diaplay + WD.writeDISP(100+20,190+20,TrBIT1); + } + + //change charactor coloe + if(j%3 != 2 && t==10) + { + // 11 < t => 20 yellow char + WD.foreground(0x0C); + }else + if( j%3 != 2 && t==20) + { + // 21 < t => 30 red char + WD.foreground(0x08); + } + //wait(0.5); + } } } } } +/** +* @brief read a bitmap file in SD. 8color mode +*/ +void SD2BUF(char *filepath){ + char R8[1],G8[1],B8[1] ,DUMMY[1],bc[2]; + char RGB; + FILE *fp ; + + pc.printf("file=%s\n",filepath); + fp = fopen(filepath, "rb"); + if(fp != NULL) { + //for(int i=0; i< 54 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 54bytes + for(int i=0; i< 28 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 26bytes + fscanf(fp,"%c",&(bc[0]));// color bit size 2bytes + fscanf(fp,"%c",&(bc[1]));// color bit size 2bytes + for(int i=0; i< 24 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 26bytes + bmp_bitcount = bc[0]+bc[1]*256; + if( bmp_bitcount == 1 ) + { + for(int i=0; i< 8 ; i++) fscanf(fp,"%c",DUMMY); // Pallet Data + int x; + for(int y=height-1; y>=0; y--) { + for(x=0; x< width; x += 8) { //1bit monochrome + fscanf(fp, "%c",G8); + for(int i=0; i < 8 ; i++ ){ + RGB = 0; + if( (*G8 & 0x80) != 0) RGB = RGB|0x0e; + WD.pixel(x+i,y,RGB); + *G8 = *G8 << 1; + } + } + if( width%8 != 0 ) + { + fscanf(fp, "%c",G8); + int i; + for(i=0; i < (width%8) ; i++ ){ + RGB = 0; + if( (*G8 & 0x40) != 0) RGB = RGB|0x0e; + WD.pixel(x+i,y,RGB); + *G8 = *G8 << 1; + } + } + if( y!=0){ // The last data column doesn't need padding + int wbyte = width/8 + ( width%8 == 0 ? 0:1 ); + for(int x=(wbyte*3)%4; (x%4 !=0); x++) fscanf(fp, "%c",DUMMY);// 4byte boundery for every column(only windows bitmap format) + } + } + }else + if( bmp_bitcount == 24 ) + { + for(int y=height-1; y>=0; y--) { + for(int x=0; x< width; x++) { //24bit color B 8bit -> G 8bit -> R 8bit + fscanf(fp, "%c",B8); + fscanf(fp, "%c",G8); + fscanf(fp, "%c",R8); + + RGB = RGB8(*R8,*G8,*B8); //6bit(8bit) MIP MASK 0000 1110 + WD.pixel(x,y,RGB); + } + if( y!=0) // The last data column doesn't need padding + for(int x=(width*3)%4; (x%4 !=0); x++) fscanf(fp, "%c",DUMMY); // 4byte boundery for every column(only windows bitmap format) + } + } + } + fclose(fp); +} + +/** +* @brief read a text file in SD. +*/ +void SDtex2BUF(char *filepath){ + int x,y,font,color; + char text[40]; + int ifEOF; + FILE *fp ; + + fp = fopen(filepath, "r"); + if(fp != NULL) { + while(ifEOF != -1){ + ifEOF = fscanf(fp,"%d,%d,%d,%d,%[^,],",&x,&y,&font,&color,text); + WD.locate(x,y); + WD.foreground(color); + if (font ==1) WD.set_font((unsigned char*) Arial12x12); + else if (font ==2) WD.set_font((unsigned char*) Arial24x23); + else if (font ==3) WD.set_font((unsigned char*) Arial28x28); + else WD.set_font((unsigned char*) Neu42x35); + + WD.printf("%s",text); + } + } + fclose(fp); +} + +/* +void DispAllDir(const char *fsrc) +{ + DIR *d = opendir(fsrc); + struct dirent *p; + char filepath[40]; + + while ((p = readdir(d)) != NULL) { + sprintf(filepath, "%s/%s",fsrc,p->d_name); + SD2BUF(filepath); + WD.writeDISP(); + } + closedir(d); +} +*/ + +/** +* @brief read a bitmap file in SD by file number. +*/ +void ReadBmp(const char *fsrc, uint32_t FileNum) +{ + DIR *d = opendir(fsrc); + struct dirent *p; + char filepath[40]; + + for(uint32_t i=0; i< FileNum; i++) readdir(d); + if ((p = readdir(d)) != NULL) { + sprintf(filepath, "%s/%s",fsrc,p->d_name); + SD2BUF(filepath); + if(ifMargeTXT){ + sprintf(filepath, "%s_txt/%s.txt",fsrc,p->d_name); + SDtex2BUF(filepath); + } + } + closedir(d); +} + uint32_t CntFile(const char *fsrc) { DIR *d = opendir(fsrc); @@ -196,17 +378,10 @@ void OffSequence(void){ BK.write(0); //add 20160712 17:00 WD.background(Black); -#if LINEBUFF_MODE - WD.clsLINEBUF(); - WD.SwDisp(0); - WD.writeDISPLinebuffer(); -#endif -#if FRAMEBUFF_MODE WD.clsBUF(); WD.SwDisp(0); WD.writeDISP(); -#endif - WD.SwDisp(0); + WD.writeDISP(); bloff = 1; } @@ -242,139 +417,4 @@ OffSequence(); } } -#if FRAMEBUFF_MODE -/** -* @brief read a bitmap file in SD. 8color mode -*/ -void SD2BUF(char *filepath){ - char R8[1],G8[1],B8[1] ,DUMMY[1],bc[2]; - int RGB; - FILE *fp ; - //pc.printf("file=%s\n",filepath); - fp = fopen(filepath, "rb"); - if(fp != NULL) { - //for(int i=0; i< 54 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 54bytes - for(int i=0; i< 28 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 26bytes - fscanf(fp,"%c",&(bc[0]));fscanf(fp,"%c",&(bc[1]));// color bit size 2bytes - for(int i=0; i< 24 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 26bytes - bmp_bitcount = bc[0]+bc[1]*256; - - for(int y=height-1; y>=0; y--) { - for(int x=0; x< width; x++) { //24bit color B 8bit -> G 8bit -> R 8bit - fscanf(fp, "%c",B8); - fscanf(fp, "%c",G8); - fscanf(fp, "%c",R8); - - RGB = RGB8(*R8,*G8,*B8); //6bit(8bit) MIP MASK 0000 1110 - WD.pixel(x,y,RGB); - } - if( y!=0) // The last data column doesn't need padding - for(int x=(width*3)%4; (x%4 !=0); x++) fscanf(fp, "%c",DUMMY); // 4byte boundery for every column(only windows bitmap format) - } - } - fclose(fp); -} -/** -* @brief read a text file in SD. -*/ -void SDtex2BUF(char *filepath){ - int x,y,font,color; - char text[40]; - int ifEOF; - FILE *fp ; - - fp = fopen(filepath, "r"); - if(fp != NULL) { - while(ifEOF != -1){ - ifEOF = fscanf(fp,"%d,%d,%d,%d,%[^,],",&x,&y,&font,&color,text); - WD.locate(x,y); - WD.foreground(color); - if (font ==1) WD.set_font((unsigned char*) Arial12x12); - else if (font ==2) WD.set_font((unsigned char*) Arial24x23); - else if (font ==3) WD.set_font((unsigned char*) Arial28x28); - else WD.set_font((unsigned char*) Neu42x35); - - WD.printf("%s",text); - } - } - fclose(fp); -} -//** -/* @brief read a bitmap file in SD by file number. -*/ -void ReadBmp(const char *fsrc, uint32_t FileNum) -{ - DIR *d = opendir(fsrc); - struct dirent *p; - char filepath[40]; - - for(uint32_t i=0; i< FileNum; i++) readdir(d); - if ((p = readdir(d)) != NULL) { - sprintf(filepath, "%s/%s",fsrc,p->d_name); - pc.printf( "%s/%s[%u]\n",fsrc,p->d_name,p->d_type); - SD2BUF(filepath); - if(ifMargeTXT){ - sprintf(filepath, "%s_txt/%s.txt",fsrc,p->d_name); - //SDtex2BUF(filepath); - } - } - closedir(d); -} -#endif - -#if LINEBUFF_MODE -/** -* @brief read a bitmap file in SD. 8color mode -*/ -void SD2LINEBUF(char *filepath,int transfermode){ - char R8[1],G8[1],B8[1] ,DUMMY[1],bc[2]; - int RGB; - FILE *fp ; - - //pc.printf("file=%s\n",filepath); - fp = fopen(filepath, "rb"); - if(fp != NULL) { - //for(int i=0; i< 54 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 54bytes - for(int i=0; i< 28 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 26bytes - fscanf(fp,"%c",&(bc[0]));fscanf(fp,"%c",&(bc[1]));// color bit size 2bytes - for(int i=0; i< 24 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 26bytes - bmp_bitcount = bc[0]+bc[1]*256; - for(int y=height-1; y>=0; y--) { - for(int x=0; x< width; x++) { //24bit color B 8bit -> G 8bit -> R 8bit - fscanf(fp, "%c",B8); - fscanf(fp, "%c",G8); - fscanf(fp, "%c",R8); - - RGB = RGB8(*R8,*G8,*B8); //6bit(8bit) MIP MASK 0000 1110 - WD.pixel(x,RGB); - } - if( y!=0) // The last data column doesn't need padding - for(int x=(width*3)%4; (x%4 !=0); x++) fscanf(fp, "%c",DUMMY); // 4byte boundery for every column(only windows bitmap format) - - //Pixel Data Transfer by SPI - WD.writeDISP(y,transfermode); - } - - } - fclose(fp); -} - -//** -/* @brief read a bitmap file in SD by file number. -*/ -void ReadBmp2LineBuffer(const char *fsrc,uint32_t FileNum,int transfermode) -{ - DIR *d = opendir(fsrc); - struct dirent *p; - char filepath[40]; - - for(uint32_t i=0; i< FileNum; i++) readdir(d); - if ((p = readdir(d)) != NULL) { - sprintf(filepath, "%s/%s",fsrc,p->d_name); - //pc.printf( "%s/%s[%u]\n",fsrc,p->d_name,p->d_type); - SD2LINEBUF(filepath,transfermode); - } - closedir(d); -} -#endif