Committer:
Midimetric
Date:
Sun Feb 06 13:30:28 2011 +0000
Revision:
5:1c78c0b4f513
Parent:
4:545e25d4c3d8

        

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