Committer:
Midimetric
Date:
Sat Jan 08 16:27:12 2011 +0000
Revision:
4:545e25d4c3d8
Parent:
3:f5146bf55b5d
Child:
5:1c78c0b4f513
(1) corrected SPI com by adding a very small wait (8 us) after changing state of A0 pin. Redef DOGMLCD_TIME if you need to change value.
(2) Added off screen managment with methods AttachScreen, DetachScreen and Paste.
- Attach your screen buffer (char [1024] )
- Use Doggys\ drawing functions to prepare it
- Detach screen
- Anytime, use Paste to combine with work screen by raster commands poke,wipe or inv.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Midimetric 0:601fd83c75e0 1 #include "doggy.h"
Midimetric 0:601fd83c75e0 2
Midimetric 0:601fd83c75e0 3 DogMLCD::DogMLCD( SPI& spi, PinName cs, PinName a0 ) : spi_(spi), cs_(cs), a0_(a0)
Midimetric 0:601fd83c75e0 4 {
Midimetric 4:545e25d4c3d8 5 //b_ = (char*)calloc( 1024, 1 );
Midimetric 0:601fd83c75e0 6 XFont = xfont_8;
Midimetric 0:601fd83c75e0 7
Midimetric 0:601fd83c75e0 8 const unsigned char c[] = {
Midimetric 0:601fd83c75e0 9 0x40, // display start line + 0-63
Midimetric 0:601fd83c75e0 10 0xa1, // ADC set 0xA1 + 0 = normal (for reverse view) / +1 = reverse (for normal view)
Midimetric 0:601fd83c75e0 11 0xc0, // common output mode + 0 = normal / + 0xF reverse
Midimetric 0:601fd83c75e0 12 0xa6, // dispaly mode 0xA6 + 0 = normal / 1 = reverse
Midimetric 0:601fd83c75e0 13 0xa2, // set bias 0xa20 + 0 = 1/9 / +1 = 1/7
Midimetric 0:601fd83c75e0 14 0x2f, // power control: 4 booster on + 2 regulator on + 1 follower on
Midimetric 0:601fd83c75e0 15 0xf8, 0x00, // set booster ratio , value 0=4x, 1=5x, 2=6x
Midimetric 0:601fd83c75e0 16 0x27, // set voltage regulator (0x20) to 7
Midimetric 0:601fd83c75e0 17 0x81, 0x14, // set electronic volume , value
Midimetric 0:601fd83c75e0 18 0xac, 0x00, // static indicator set 0xAC +0 = off / +1 = on , 0 = flash mode
Midimetric 0:601fd83c75e0 19 0xaf // display 0xAE +0 = off / +1 = on
Midimetric 0:601fd83c75e0 20 };
Midimetric 0:601fd83c75e0 21 spi_.format( 8, 0 );
Midimetric 0:601fd83c75e0 22 spi_.frequency( 1000000 );
Midimetric 0:601fd83c75e0 23 cs_ = 0;
Midimetric 4:545e25d4c3d8 24 a0_ = 0; wait_us( DOGMLCD_TIME );
Midimetric 0:601fd83c75e0 25 for( int i = 0 ; i < sizeof( c ); i++ )
Midimetric 0:601fd83c75e0 26 spi_.write( c[i] );
Midimetric 0:601fd83c75e0 27 cs_ = 1;
Midimetric 0:601fd83c75e0 28 }
Midimetric 4:545e25d4c3d8 29
Midimetric 4:545e25d4c3d8 30 void DogMLCD::AttachScreen( char* screen )
Midimetric 0:601fd83c75e0 31 {
Midimetric 4:545e25d4c3d8 32 b_ = screen;
Midimetric 4:545e25d4c3d8 33 }
Midimetric 4:545e25d4c3d8 34
Midimetric 4:545e25d4c3d8 35 void DogMLCD::DetachScreen()
Midimetric 4:545e25d4c3d8 36 {
Midimetric 4:545e25d4c3d8 37 b_ = w_;
Midimetric 0:601fd83c75e0 38 }
Midimetric 0:601fd83c75e0 39
Midimetric 0:601fd83c75e0 40 #define FASTPOKE( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] |= DOGMLCD_on[ y & 7 ];
Midimetric 2:d6e572640dcc 41 #define FASTWIPE( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] &= DOGMLCD_off[ y & 7 ];
Midimetric 0:601fd83c75e0 42 #define FASTINV( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] ^= DOGMLCD_on[ y & 7 ];
Midimetric 0:601fd83c75e0 43
Midimetric 4:545e25d4c3d8 44
Midimetric 0:601fd83c75e0 45 void DogMLCD::Poke( int x, int y )
Midimetric 0:601fd83c75e0 46 {
Midimetric 0:601fd83c75e0 47 if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 )
Midimetric 0:601fd83c75e0 48 FASTPOKE( x, y )
Midimetric 0:601fd83c75e0 49 }
Midimetric 0:601fd83c75e0 50 void DogMLCD::Wipe( int x, int y )
Midimetric 0:601fd83c75e0 51 {
Midimetric 0:601fd83c75e0 52 if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 )
Midimetric 0:601fd83c75e0 53 FASTWIPE( x, y )
Midimetric 0:601fd83c75e0 54 }
Midimetric 0:601fd83c75e0 55 void DogMLCD::Inv( int x, int y )
Midimetric 0:601fd83c75e0 56 {
Midimetric 0:601fd83c75e0 57 if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 )
Midimetric 0:601fd83c75e0 58 FASTINV( x, y )
Midimetric 0:601fd83c75e0 59 }
Midimetric 0:601fd83c75e0 60 void DogMLCD::Clear()
Midimetric 0:601fd83c75e0 61 {
Midimetric 0:601fd83c75e0 62 int i = 1024;
Midimetric 0:601fd83c75e0 63 char* p = b_;
Midimetric 0:601fd83c75e0 64 while( i-- )
Midimetric 0:601fd83c75e0 65 *p++ = 0;
Midimetric 0:601fd83c75e0 66 }
Midimetric 0:601fd83c75e0 67 void DogMLCD::Flush()
Midimetric 0:601fd83c75e0 68 {
Midimetric 0:601fd83c75e0 69 char* p = b_;
Midimetric 0:601fd83c75e0 70 spi_.format( 8, 0 );
Midimetric 0:601fd83c75e0 71 spi_.frequency( DOGMLCD_MHZ );
Midimetric 4:545e25d4c3d8 72 cs_ = 0;
Midimetric 0:601fd83c75e0 73 for( int page = 0xB0 ; page < 0xB8 ; page++ )
Midimetric 0:601fd83c75e0 74 {
Midimetric 4:545e25d4c3d8 75 a0_ = 0; wait_us( DOGMLCD_TIME );
Midimetric 0:601fd83c75e0 76 spi_.write( page ); spi_.write( 0x10 ); spi_.write( 0x00 );
Midimetric 0:601fd83c75e0 77
Midimetric 4:545e25d4c3d8 78 a0_ = 1; wait_us( DOGMLCD_TIME );
Midimetric 0:601fd83c75e0 79 int i = 128;
Midimetric 0:601fd83c75e0 80 while( i-- )
Midimetric 0:601fd83c75e0 81 spi_.write( *p++ );
Midimetric 0:601fd83c75e0 82 }
Midimetric 0:601fd83c75e0 83 cs_ = 1;
Midimetric 0:601fd83c75e0 84 }
Midimetric 2:d6e572640dcc 85 void DogMLCD::Flush( unsigned char page, int x0, int x1 )
Midimetric 2:d6e572640dcc 86 {
Midimetric 2:d6e572640dcc 87 page &= 7;
Midimetric 2:d6e572640dcc 88 BOUND( x0, 0, 127 );
Midimetric 2:d6e572640dcc 89 BOUND( x1, 0, 127 );
Midimetric 2:d6e572640dcc 90 ORDER( x0 , x1 )
Midimetric 2:d6e572640dcc 91 char* p = b_ + ( page << 7 ) + x0;
Midimetric 2:d6e572640dcc 92 spi_.format( 8, 0 );
Midimetric 2:d6e572640dcc 93 spi_.frequency( DOGMLCD_MHZ );
Midimetric 2:d6e572640dcc 94 cs_ = 0;
Midimetric 4:545e25d4c3d8 95 a0_ = 0; wait_us( DOGMLCD_TIME );
Midimetric 2:d6e572640dcc 96 spi_.write( 0xB0 + page ); spi_.write( 0x10 ); spi_.write( 0x00 );
Midimetric 2:d6e572640dcc 97
Midimetric 4:545e25d4c3d8 98 a0_ = 1; wait_us( DOGMLCD_TIME );
Midimetric 2:d6e572640dcc 99 int i = x1 - x0 + 1;
Midimetric 2:d6e572640dcc 100 while( i-- )
Midimetric 2:d6e572640dcc 101 spi_.write( *p++ );
Midimetric 2:d6e572640dcc 102 cs_ = 1;
Midimetric 2:d6e572640dcc 103 }
Midimetric 3:f5146bf55b5d 104 void DogMLCD::Page( unsigned char page0, unsigned char page1 )
Midimetric 2:d6e572640dcc 105 {
Midimetric 2:d6e572640dcc 106 page0 &= 7;
Midimetric 3:f5146bf55b5d 107 if( page1 == 0 ) page1 = page0;
Midimetric 3:f5146bf55b5d 108 else
Midimetric 3:f5146bf55b5d 109 {
Midimetric 3:f5146bf55b5d 110 page1 &= 7;
Midimetric 3:f5146bf55b5d 111 ORDER( page0, page1 );
Midimetric 3:f5146bf55b5d 112 }
Midimetric 2:d6e572640dcc 113 char* p = b_ + ( page0 << 7 );
Midimetric 2:d6e572640dcc 114 spi_.format( 8, 0 );
Midimetric 2:d6e572640dcc 115 spi_.frequency( DOGMLCD_MHZ );
Midimetric 4:545e25d4c3d8 116 cs_ = 0;
Midimetric 2:d6e572640dcc 117 for( int page = 0xB0 + page0 ; page <= ( 0xB0 + page1 ) ; page++ )
Midimetric 2:d6e572640dcc 118 {
Midimetric 4:545e25d4c3d8 119 a0_ = 0; wait_us( DOGMLCD_TIME );
Midimetric 2:d6e572640dcc 120 spi_.write( page ); spi_.write( 0x10 ); spi_.write( 0x00 );
Midimetric 2:d6e572640dcc 121
Midimetric 4:545e25d4c3d8 122 a0_ = 1; wait_us( DOGMLCD_TIME );
Midimetric 2:d6e572640dcc 123 int i = 128;
Midimetric 2:d6e572640dcc 124 while( i-- )
Midimetric 2:d6e572640dcc 125 spi_.write( *p++ );
Midimetric 2:d6e572640dcc 126 }
Midimetric 2:d6e572640dcc 127 cs_ = 1;
Midimetric 2:d6e572640dcc 128 }
Midimetric 4:545e25d4c3d8 129 void DogMLCD::Paste( char* screen, doggy_op op )
Midimetric 4:545e25d4c3d8 130 {
Midimetric 4:545e25d4c3d8 131 int i = 1024;
Midimetric 4:545e25d4c3d8 132 char* p = b_;
Midimetric 4:545e25d4c3d8 133 char* q = screen;
Midimetric 4:545e25d4c3d8 134
Midimetric 4:545e25d4c3d8 135 if( op == poke ) while( i-- ) *p++ |= *q++;
Midimetric 4:545e25d4c3d8 136 else if( op == wipe ) while( i-- ) *p++ &= ~(*q++);
Midimetric 4:545e25d4c3d8 137 else while( i-- ) *p++ ^= *q++;
Midimetric 4:545e25d4c3d8 138 }
Midimetric 4:545e25d4c3d8 139
Midimetric 4:545e25d4c3d8 140
Midimetric 4:545e25d4c3d8 141