電子ペーパーで所在を表示しておくプレートのプログラムです
Dependencies: SDFileSystem mbed
eink.cpp
- Committer:
- kohacraft
- Date:
- 2016-04-21
- Revision:
- 0:eca549a6e38d
- Child:
- 1:bd1c3875fb64
File content as of revision 0:eca549a6e38d:
#include "mbed.h" #include "extdio.h" #include "eink.h" //ポートの初期化 void initPort() { setCL( 0 ); setContBas( LE , 0); setContBas( OE , 0); setContBas( NC10 , 1); setContBas( SPH , 1); setContBas( GMODE , 0); setContBas( SPV , 1); setContBas( CKV , 0); setContBas( EN , 0); setDataBas( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ); } //pageStart void pageStart() { setContBas( GMODE , 1 ); setContBas( CKV , 1 ); wait_us(11); setContBas( SPV , 0 ); wait_us(11); setContBas( CKV , 0 ); wait_us(10); setContBas( CKV , 1 ); wait_us(10); setContBas( SPV , 1 ); wait_us(12); setContBas( CKV , 0 ); wait_us(10); setContBas( CKV , 1 ); wait_us(22); setContBas( CKV , 0 ); wait_us(10); setContBas( CKV , 1 ); wait_us(22); setContBas( CKV , 0 ); wait_us(10); setContBas( CKV , 1 ); wait_us(1); } //lineStart void lineStart() { setCL( 1 ); setCL( 0 ); setContBas( LE , 0 ); wait_us(1); setCL( 1 ); setCL( 0 ); wait_us(1); setCL( 1 ); setCL( 0 ); wait_us(1); setCL( 1 ); setCL( 0 ); setContBas( OE , 1 ); wait_us(1); setCL( 1 ); setCL( 0 ); setContBas( SPH , 0 ); } //点を描画 void drowPixelsRaw( bool d7 , bool d6 , bool d5 , bool d4 , bool d3 , bool d2 , bool d1 , bool d0 ) { setDataBas( d7 , d6 , d5 , d4 , d3 , d2 , d1 , d0 ); setCL( 1 ); setCL( 0 ); } //lineEnd void lineEnd() { setContBas( NC10 , 1 ); setContBas( CKV , 0 ); setCL( 1 ); setCL( 0 ); wait_us(10); setContBas( OE , 0 ); setContBas( LE , 1 ); setContBas( CKV , 1 ); wait_us(1); } //pageEnd void pageEnd() { setCL( 1 ); setCL( 0 ); setContBas( LE , 0 ); setCL( 1 ); setCL( 0 ); setCL( 1 ); setCL( 0 ); setCL( 1 ); setCL( 0 ); setContBas( OE , 1 ); setCL( 1 ); setCL( 0 ); for( int i=0 ; i<200 ; i++ ) { setCL( 1 ); setCL( 0 ); } setContBas( CKV , 0 ); setCL( 1 ); setCL( 0 ); wait_us(10); setContBas( OE , 0 ); wait_us(330); setContBas( GMODE , 0 ); wait_us(130); } //SPHを交代する void changeSPH() { setContBas( SPH , 1 ); setContBas( NC10 , 0 ); } //電子ペーパーの回路の電源を切る void powerOff() { setDataBas( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ); setCL( 0 ); setContBas( LE , 0); setContBas( OE , 0); setContBas( NC10 , 0); setContBas( SPH , 0); setContBas( GMODE , 0); setContBas( SPV , 0); setContBas( CKV , 0); setContBas( EN , 1); } //電子ペーパーの回路の電源を入れる void powerOn() { setContBas( EN , 0); } //画面をクリアする 0:黒 1:白 void clrdisp( bool color ) { pageStart(); for( int j=0 ; j<600 ; j++) { lineStart(); for( int i=0 ; i<100 ; i++ ) { if( color == 1) drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //白でクリアする else drowPixelsRaw( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 ); //黒でクリアする } changeSPH(); for( int i=100 ; i<200 ; i++ ) { if( color == 1) drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //白でクリアする else drowPixelsRaw( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 ); //黒でクリアする } lineEnd(); } pageEnd(); } //1Byte分の8ドットを描画 paletteWhite:0の部分を白で描画 1の部分を白で描画 void drowPixels( char data , bool paletteWhite ) { if( paletteWhite == 0 ) { drowPixelsRaw( (data&0x10)!=0 , 1 , (data&0x20)!=0 , 1 , (data&0x40)!=0 , 1 , (data&0x80)!=0 , 1 ); drowPixelsRaw( (data&0x01)!=0 , 1 , (data&0x02)!=0 , 1 , (data&0x04)!=0 , 1 , (data&0x08)!=0 , 1 ); //drowPixelsRaw( (data&0x10)!=0 , (data&0x10)==0 , (data&0x20)!=0 , (data&0x20)==0 , (data&0x40)!=0 , (data&0x40)==0 , (data&0x80)!=0 , (data&0x80)==0 ); //drowPixelsRaw( (data&0x01)!=0 , (data&0x01)==0 , (data&0x02)!=0 , (data&0x02)==0 , (data&0x04)!=0 , (data&0x04)==0 , (data&0x08)!=0 , (data&0x08)==0 ); } else { drowPixelsRaw( (data&0x10)==0 , 1 , (data&0x20)==0 , 1 , (data&0x40)==0 , 1 , (data&0x80)==0 , 1 ); drowPixelsRaw( (data&0x01)==0 , 1 , (data&0x02)==0 , 1 , (data&0x04)==0 , 1 , (data&0x08)==0 , 1 ); //drowPixelsRaw( (data&0x10)==0 , (data&0x10)!=0 , (data&0x20)==0 , (data&0x20)!=0 , (data&0x40)==0 , (data&0x40)!=0 , (data&0x80)==0 , (data&0x80)!=0 ); //drowPixelsRaw( (data&0x01)==0 , (data&0x01)!=0 , (data&0x02)==0 , (data&0x02)!=0 , (data&0x04)==0 , (data&0x04)!=0 , (data&0x08)==0 , (data&0x08)!=0 ); } } //fpのbmpを0,0の座標に描画する BMPのピクセルサイズは8の倍数必須 void dispbmp(FILE *fp ) { dispbmp( fp , 0 , 0 ); } //fpのbmpを指定したの座標に描画する //BMPのピクセルサイズは8の倍数必須 //座標は8の倍数で指定 void dispbmp(FILE *fp , int xpos , int ypos) { char bmpdata; int size; //ファイルポインタが正しいか確認 if( fp == NULL ) { fclose(fp); free(fp); //ファイルポインタが正しくない clrdisp(1); //白でクリア clrdisp(0); //黒でクリア clrdisp(1); //白でクリア clrdisp(0); //黒でクリア return; } //画像のサイズ取得 unsigned int xsize , ysize; fseek(fp, 18 , SEEK_SET);//to xsize size = fread( &xsize , sizeof(unsigned int) , 1 , fp); size = fread( &ysize , sizeof(unsigned int) , 1 , fp); //パレットデータの先頭まで移動 unsigned char palettetemp[8]; fseek(fp, 54 , SEEK_SET);//bitmap headder throw size = fread( palettetemp , sizeof(char) , 8 , fp); int palette0 = (int)palettetemp[0]+(int)palettetemp[1]+(int)palettetemp[2]; //パレット0のRGBの合計 int palette1 = (int)palettetemp[4]+(int)palettetemp[5]+(int)palettetemp[6]; //パレット1のRGBの合計 bool paletteWhite = 0; if( palette0 > palette1 ) //輝度が明るいパレットを白にする { paletteWhite = 0; //パレット0が白 } else { paletteWhite = 1; //パレット1が白 } //bmp画像データの先頭まで移動 unsigned int dataOffset; fseek(fp, 10 , SEEK_SET); size = fread( &dataOffset , sizeof(unsigned int) , 1 , fp); fseek(fp, dataOffset , SEEK_SET); pageStart(); //y座標の位置までスキップする for( int j=0 ; j<ypos ; j++) { lineStart(); for( int i=0 ; i<100 ; i++ ) drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); changeSPH(); for( int i=0 ; i<100 ; i++ ) drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); lineEnd(); } for( int j=ypos ; j<ysize+ypos ; j++) { lineStart(); for( int i=0 ; i<100 ; i+=2 ) { if( i>=(xpos/4) && i<((xsize+xpos)/4) ) { size = fread( &bmpdata , sizeof(char) , 1 , fp); if( size != 1 ) { drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //読み込めない場合は白にする drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); } else { drowPixels(bmpdata,paletteWhite); } } else { drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //範囲以外なら変化なし drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); } } changeSPH(); for( int i=100 ; i<200 ; i+=2 ) { if( i>=(xpos/4) && i<((xsize+xpos)/4) ) // { size = fread( &bmpdata , sizeof(char) , 1 , fp); if( size != 1 ) { drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); //読み込めない場合は白にする drowPixelsRaw( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ); } else { drowPixels(bmpdata,paletteWhite); } } else { drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //範囲以外なら変化なし drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); } } //横800画素を超えた分のデータをパスする if( (xsize+xpos)>800 ) { int dataPass = ((xsize+xpos)-800)/8; fseek(fp, dataPass , SEEK_CUR); } lineEnd(); } //yの残りをスキップする for( int j=ypos+ysize ; j<600 ; j++) { lineStart(); for( int i=0 ; i<100 ; i++ ) drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //範囲以外なら変化なし changeSPH(); for( int i=0 ; i<100 ; i++ ) drowPixelsRaw( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ); //範囲以外なら変化なし lineEnd(); } pageEnd(); }