Committer:
Midimetric
Date:
Thu Dec 30 16:49:46 2010 +0000
Revision:
2:d6e572640dcc
Parent:
0:601fd83c75e0
Child:
3:f5146bf55b5d
- Font structure: compacted size reduce overall bin by 8K
- Flush() overrides allows to update part of the screen only

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 0:601fd83c75e0 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 0:601fd83c75e0 24 a0_ = 0;
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 0:601fd83c75e0 29 DogMLCD::~DogMLCD()
Midimetric 0:601fd83c75e0 30 {
Midimetric 0:601fd83c75e0 31 free( b_ );
Midimetric 0:601fd83c75e0 32 }
Midimetric 0:601fd83c75e0 33
Midimetric 0:601fd83c75e0 34 #define FASTPOKE( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] |= DOGMLCD_on[ y & 7 ];
Midimetric 2:d6e572640dcc 35 #define FASTWIPE( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] &= DOGMLCD_off[ y & 7 ];
Midimetric 0:601fd83c75e0 36 #define FASTINV( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] ^= DOGMLCD_on[ y & 7 ];
Midimetric 0:601fd83c75e0 37
Midimetric 0:601fd83c75e0 38 void DogMLCD::Poke( int x, int y )
Midimetric 0:601fd83c75e0 39 {
Midimetric 0:601fd83c75e0 40 if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 )
Midimetric 0:601fd83c75e0 41 FASTPOKE( x, y )
Midimetric 0:601fd83c75e0 42 }
Midimetric 0:601fd83c75e0 43 void DogMLCD::Wipe( int x, int y )
Midimetric 0:601fd83c75e0 44 {
Midimetric 0:601fd83c75e0 45 if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 )
Midimetric 0:601fd83c75e0 46 FASTWIPE( x, y )
Midimetric 0:601fd83c75e0 47 }
Midimetric 0:601fd83c75e0 48 void DogMLCD::Inv( int x, int y )
Midimetric 0:601fd83c75e0 49 {
Midimetric 0:601fd83c75e0 50 if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 )
Midimetric 0:601fd83c75e0 51 FASTINV( x, y )
Midimetric 0:601fd83c75e0 52 }
Midimetric 0:601fd83c75e0 53 void DogMLCD::Clear()
Midimetric 0:601fd83c75e0 54 {
Midimetric 0:601fd83c75e0 55 int i = 1024;
Midimetric 0:601fd83c75e0 56 char* p = b_;
Midimetric 0:601fd83c75e0 57 while( i-- )
Midimetric 0:601fd83c75e0 58 *p++ = 0;
Midimetric 0:601fd83c75e0 59 }
Midimetric 0:601fd83c75e0 60 void DogMLCD::Flush()
Midimetric 0:601fd83c75e0 61 {
Midimetric 0:601fd83c75e0 62 char* p = b_;
Midimetric 0:601fd83c75e0 63 spi_.format( 8, 0 );
Midimetric 0:601fd83c75e0 64 spi_.frequency( DOGMLCD_MHZ );
Midimetric 0:601fd83c75e0 65 for( int page = 0xB0 ; page < 0xB8 ; page++ )
Midimetric 0:601fd83c75e0 66 {
Midimetric 0:601fd83c75e0 67 cs_ = 0;
Midimetric 0:601fd83c75e0 68 a0_ = 0;
Midimetric 0:601fd83c75e0 69 spi_.write( page ); spi_.write( 0x10 ); spi_.write( 0x00 );
Midimetric 0:601fd83c75e0 70
Midimetric 0:601fd83c75e0 71 a0_ = 1;
Midimetric 0:601fd83c75e0 72 int i = 128;
Midimetric 0:601fd83c75e0 73 while( i-- )
Midimetric 0:601fd83c75e0 74 spi_.write( *p++ );
Midimetric 0:601fd83c75e0 75 a0_ = 0;
Midimetric 0:601fd83c75e0 76 }
Midimetric 0:601fd83c75e0 77 cs_ = 1;
Midimetric 0:601fd83c75e0 78 }
Midimetric 2:d6e572640dcc 79 void DogMLCD::Flush( unsigned char page, int x0, int x1 )
Midimetric 2:d6e572640dcc 80 {
Midimetric 2:d6e572640dcc 81 page &= 7;
Midimetric 2:d6e572640dcc 82 BOUND( x0, 0, 127 );
Midimetric 2:d6e572640dcc 83 BOUND( x1, 0, 127 );
Midimetric 2:d6e572640dcc 84 ORDER( x0 , x1 )
Midimetric 2:d6e572640dcc 85 char* p = b_ + ( page << 7 ) + x0;
Midimetric 2:d6e572640dcc 86 spi_.format( 8, 0 );
Midimetric 2:d6e572640dcc 87 spi_.frequency( DOGMLCD_MHZ );
Midimetric 2:d6e572640dcc 88 cs_ = 0;
Midimetric 2:d6e572640dcc 89 a0_ = 0;
Midimetric 2:d6e572640dcc 90 spi_.write( 0xB0 + page ); spi_.write( 0x10 ); spi_.write( 0x00 );
Midimetric 2:d6e572640dcc 91
Midimetric 2:d6e572640dcc 92 a0_ = 1;
Midimetric 2:d6e572640dcc 93 int i = x1 - x0 + 1;
Midimetric 2:d6e572640dcc 94 while( i-- )
Midimetric 2:d6e572640dcc 95 spi_.write( *p++ );
Midimetric 2:d6e572640dcc 96 a0_ = 0;
Midimetric 2:d6e572640dcc 97 cs_ = 1;
Midimetric 2:d6e572640dcc 98 }
Midimetric 2:d6e572640dcc 99 void DogMLCD::Flush( unsigned char page0, unsigned char page1 )
Midimetric 2:d6e572640dcc 100 {
Midimetric 2:d6e572640dcc 101 page0 &= 7;
Midimetric 2:d6e572640dcc 102 page1 &= 7;
Midimetric 2:d6e572640dcc 103 ORDER( page0, page1 );
Midimetric 2:d6e572640dcc 104 char* p = b_ + ( page0 << 7 );
Midimetric 2:d6e572640dcc 105 spi_.format( 8, 0 );
Midimetric 2:d6e572640dcc 106 spi_.frequency( DOGMLCD_MHZ );
Midimetric 2:d6e572640dcc 107 for( int page = 0xB0 + page0 ; page <= ( 0xB0 + page1 ) ; page++ )
Midimetric 2:d6e572640dcc 108 {
Midimetric 2:d6e572640dcc 109 cs_ = 0;
Midimetric 2:d6e572640dcc 110 a0_ = 0;
Midimetric 2:d6e572640dcc 111 spi_.write( page ); spi_.write( 0x10 ); spi_.write( 0x00 );
Midimetric 2:d6e572640dcc 112
Midimetric 2:d6e572640dcc 113 a0_ = 1;
Midimetric 2:d6e572640dcc 114 int i = 128;
Midimetric 2:d6e572640dcc 115 while( i-- )
Midimetric 2:d6e572640dcc 116 spi_.write( *p++ );
Midimetric 2:d6e572640dcc 117 a0_ = 0;
Midimetric 2:d6e572640dcc 118 }
Midimetric 2:d6e572640dcc 119 cs_ = 1;
Midimetric 2:d6e572640dcc 120 }