doggy.cpp@0:601fd83c75e0, 2010-12-29 (annotated)
- Committer:
- Midimetric
- Date:
- Wed Dec 29 09:53:24 2010 +0000
- Revision:
- 0:601fd83c75e0
- Child:
- 2:d6e572640dcc
Alpha version with (poke, wipe, inv, linev, lineh, frame, rect, xchar, xfont)
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:601fd83c75e0 | 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 | } |