e-paper whereabouts board program
Dependencies: SDFileSystem mbed
eink.cpp
- Committer:
- kohacraft
- Date:
- 2017-05-23
- Revision:
- 2:9150515ecd68
- Parent:
- 1:cb28911c7ba5
File content as of revision 2:9150515ecd68:
/* EDP control program */ #include "mbed.h" #include "extdio.h" #include "eink.h" int clPulseCount = 0; //for CL pluse count //Initialize the port void initPort() { setCL( 0 ); setContBus( LE , 0); setContBus( OE , 0); setContBus( NC10 , 1); setContBus( SPH , 1); setContBus( GMODE , 0); setContBus( SPV , 1); setContBus( CKV , 0); setContBus( EN , 0); setDataBus( 0b00000001 ); setDataBus( 0b00000000 ); return; } //page start sequence void pageStart() { setContBus( GMODE , 1 ); setContBus( CKV , 1 ); wait_us(11); setContBus( SPV , 0 ); wait_us(11); setContBus( CKV , 0 ); wait_us(10); setContBus( CKV , 1 ); wait_us(10); setContBus( SPV , 1 ); wait_us(12); setContBus( CKV , 0 ); wait_us(10); setContBus( CKV , 1 ); wait_us(22); setContBus( CKV , 0 ); wait_us(10); setContBus( CKV , 1 ); wait_us(22); setContBus( CKV , 0 ); wait_us(10); setContBus( CKV , 1 ); wait_us(1); return; } //line startsequence void lineStart() { setContBus( LE , 0 ); setContBus( OE , 1 ); setContBus( SPH , 0 ); clPulseCount = 0; return; } //center of line sequence void changeSPH() { setContBus( SPH , 1 ); setContBus( NC10 , 0 ); return; } //4bit draw sequence void setDrawData( char data ) { setDataBus( data ); setCL( 1 ); setCL( 0 ); //SPH change when CL puls is 200 clPulseCount++; if( clPulseCount == EDP_WIDTH/8 ) { changeSPH(); } return; } //end line sequence void lineEnd() { setContBus( NC10 , 1 ); setContBus( CKV , 0 ); wait_us(10); setContBus( OE , 0 ); setContBus( LE , 1 ); setContBus( CKV , 1 ); wait_us(1); } //end page sequence void pageEnd() { setContBus( LE , 0 ); setContBus( OE , 1 ); for( int i=0 ; i<EDP_WIDTH/4 ; i++ ) { setCL( 1 ); setCL( 0 ); } setContBus( CKV , 0 ); wait_us(10); setContBus( OE , 0 ); wait_us(330); setContBus( GMODE , 0 ); wait_us(130); } //trun off EDP void powerOff() { setDataBus( 0b00000000 ); setCL( 0 ); setContBus( LE , 0); setContBus( OE , 0); setContBus( NC10 , 0); setContBus( SPH , 0); setContBus( GMODE , 0); setContBus( SPV , 0); setContBus( CKV , 0); setContBus( EN , 1); return; } //turn on EDP void powerOn() { setContBus( EN , 0); wait_us(100); return; } //fill color //drawMode EDP_WHITE:white EDP_BLACK:black void clrDisp( char drawMode ) { char data; if( drawMode == EDP_WHITE) data = 0b01010101; //all pixels white else data = 0b10101010; //all pixels black pageStart(); for( int j=0 ; j<EDP_HEIGHT ; j++) { lineStart(); for( int i=0 ; i<EDP_WIDTH ; i+=4 ) { setDrawData( data ); } lineEnd(); } pageEnd(); return; } //draw 8pixels bmp data // data: (MSB)b0A b0B b1A b1B b2A b2B b3A bB3(LSB) // b0 b1 b2 b4:pixels // AB: 10:black 01:white 00:transparent // drawMode: EDP_BLACK draw black at black pixel and draw transparent at white pixel // EDP_WHITE draw white at white pixel and draw transparent at black pixel // EDP_BLACK_WHITE draw black at black pixel and draw white at white pixel void drowPixels( char data , char drawMode ) { char _data = 0; switch( drawMode ) { case EDP_BLACK : _data = 0; _data |= ((data&0x10)==0)<<7; _data |= ((data&0x20)==0)<<5; _data |= ((data&0x40)==0)<<3; _data |= ((data&0x80)==0)<<1; setDrawData( _data ); _data = 0; _data |= ((data&0x01)==0)<<7; _data |= ((data&0x02)==0)<<5; _data |= ((data&0x04)==0)<<3; _data |= ((data&0x08)==0)<<1; setDrawData( _data ); break; case EDP_WHITE : _data = 0; _data |= ((data&0x10)!=0)<<6; _data |= ((data&0x20)!=0)<<4; _data |= ((data&0x40)!=0)<<2; _data |= ((data&0x80)!=0); setDrawData( _data ); _data = 0; _data |= ((data&0x01)!=0)<<6; _data |= ((data&0x02)!=0)<<4; _data |= ((data&0x04)!=0)<<2; _data |= ((data&0x08)!=0); setDrawData( _data ); break; default : _data = 0; _data |= ((data&0x10)==0)<<7; _data |= ((data&0x10)!=0)<<6; _data |= ((data&0x20)==0)<<5; _data |= ((data&0x20)!=0)<<4; _data |= ((data&0x40)==0)<<3; _data |= ((data&0x40)!=0)<<2; _data |= ((data&0x80)==0)<<1; _data |= ((data&0x80)!=0); setDrawData( _data ); _data = 0; _data |= ((data&0x01)==0)<<7; _data |= ((data&0x01)!=0)<<6; _data |= ((data&0x02)==0)<<5; _data |= ((data&0x02)!=0)<<4; _data |= ((data&0x04)==0)<<3; _data |= ((data&0x04)!=0)<<2; _data |= ((data&0x08)==0)<<1; _data |= ((data&0x08)!=0); setDrawData( _data ); break; } return; } //display the bmp image to EDP // drawMode: EDP_BLACK draw black at black pixel and draw transparent at white pixel // EDP_WHITE draw white at white pixel and draw transparent at black pixel // EDP_BLACK_WHITE draw black at black pixel and draw white at white pixel void dispBmp(FILE *fp , char drawMode ) { bool paletteWhite = 0; //white palette number char bmpdata[EDP_WIDTH/8]; //data buffer for one line //confirm the filepointer is available if( fp == NULL ) { fclose(fp); free(fp); //unavailable clrDisp(EDP_WHITE); //fill white clrDisp(EDP_BLACK); //fill black clrDisp(EDP_WHITE); //fill white clrDisp(EDP_BLACK); //fill black return; } //get image wight anf height unsigned int bmpWidth , bmpHeight; fseek(fp, 18 , SEEK_SET);//to xsize fread( &bmpWidth , sizeof(unsigned int) , 1 , fp); fread( &bmpHeight , sizeof(unsigned int) , 1 , fp); if( bmpWidth != EDP_WIDTH || bmpHeight != EDP_HEIGHT ) { fclose(fp); free(fp); //not match size with EDP clrDisp(EDP_WHITE); //fill white clrDisp(EDP_BLACK); //fill black clrDisp(EDP_WHITE); //fill white return; } //get palette data unsigned char paletteTemp[8]; fseek(fp, 54 , SEEK_SET);//bitmap headder throw fread( paletteTemp , sizeof(char) , 8 , fp); int palette0 = (int)paletteTemp[0]+(int)paletteTemp[1]+(int)paletteTemp[2]; int palette1 = (int)paletteTemp[4]+(int)paletteTemp[5]+(int)paletteTemp[6]; if( palette0 > palette1 ) //select white palette number,witch the braightest palette paletteWhite = 0; // else paletteWhite = 1; // //skip to image data unsigned int dataOffset; fseek(fp, 10 , SEEK_SET); fread( &dataOffset , sizeof(unsigned int) , 1 , fp); fseek(fp, dataOffset , SEEK_SET); //dwar bmp data to EDP pageStart(); for( int j=0 ; j<EDP_HEIGHT ; j++) { //read for one line and chage to bit for white is 1 and black is 0 fread( &bmpdata , sizeof(char) , EDP_WIDTH/8 , fp); if( paletteWhite == 0 ) { for( int i=0 ; i<EDP_WIDTH/8 ; i++ ) bmpdata[i] = ~bmpdata[i]; } lineStart(); for( int i=0 ; i<EDP_WIDTH ; i+=8 ) { drowPixels(bmpdata[i/8],drawMode); } lineEnd(); } pageEnd(); return; }