![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Versión de Firmware con funciones de RAM incorporadas.
Dependencies: mbed
Fork of VmRecorderV1dot1 by
Diff: Doggy/doggy.cpp
- Revision:
- 0:3d456b8ce449
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Doggy/doggy.cpp Mon Jun 15 15:34:27 2015 +0000 @@ -0,0 +1,152 @@ +#include "doggy.h" + +DogMLCD::DogMLCD( SPI& spi, PinName cs, PinName a0 ) : spi_(spi), cs_(cs), a0_(a0) +{ + //b_ = (char*)calloc( 1024, 1 ); + XFont = xfont_8; + b_ = w_; + Clear(); + const unsigned char c[] = { + 0x40, // display start line + 0-63 + 0xa1, // ADC set 0xA1 + 0 = normal (for reverse view) / +1 = reverse (for normal view) + 0xc0, // common output mode + 0 = normal / + 0xF reverse + 0xa6, // dispaly mode 0xA6 + 0 = normal / 1 = reverse + 0xa2, // set bias 0xa20 + 0 = 1/9 / +1 = 1/7 + 0x2f, // power control: 4 booster on + 2 regulator on + 1 follower on + 0xf8, 0x00, // set booster ratio , value 0=4x, 1=5x, 2=6x + 0x27, // set voltage regulator (0x20) to 7 + 0x81, 0x18, // set electronic volume , value + 0xac, 0x00, // static indicator set 0xAC +0 = off / +1 = on , 0 = flash mode + 0xaf // display 0xAE +0 = off / +1 = on + }; + + spi_.format( 8, 0 ); + spi_.frequency( 1000000 ); + cs_ = 0; + a0_ = 0; wait_us( DOGMLCD_TIME ); + for( int i = 0 ; i < sizeof( c ); i++ ) + spi_.write( c[i] ); + cs_ = 1; +} + +void DogMLCD::AttachScreen( char* screen ) +{ + b_ = screen; +} + +void DogMLCD::DetachScreen() +{ + b_ = w_; +} + +#define FASTPOKE( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] |= DOGMLCD_on[ y & 7 ]; +#define FASTWIPE( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] &= DOGMLCD_off[ y & 7 ]; +#define FASTINV( x, y ) b_[ ( ( y & 56 ) << 4 ) + ( x & 127 ) ] ^= DOGMLCD_on[ y & 7 ]; + + +void DogMLCD::Poke( int x, int y ) +{ + if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 ) + FASTPOKE( x, y ) +} +void DogMLCD::Wipe( int x, int y ) +{ + if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 ) + FASTWIPE( x, y ) +} +void DogMLCD::Inv( int x, int y ) +{ + if( ( x & 0xFF80 ) == 0 && ( y & 0xFFC0 ) == 0 ) + FASTINV( x, y ) +} + +void DogMLCD::InvRect( int x0, int y0, int x1, int y1 ) +{ + for(int i = y0; i < y1 + 1; i++){ + for(int j = x0; j < x1 + 1; j++){ + Inv(j,i); + } + } +} +void DogMLCD::Clear() +{ + int i = 1024; + char* p = b_; + while( i-- ) + *p++ = 0; +} +void DogMLCD::Flush() +{ + char* p = b_; + spi_.format( 8, 0 ); + spi_.frequency( DOGMLCD_MHZ ); + cs_ = 0; + for( int page = 0xB0 ; page < 0xB8 ; page++ ) + { + a0_ = 0; wait_us( DOGMLCD_TIME ); + spi_.write( page ); spi_.write( 0x10 ); spi_.write( 0x00 ); + + a0_ = 1; wait_us( DOGMLCD_TIME ); + int i = 128; + while( i-- ) + spi_.write( *p++ ); + } + cs_ = 1; +} +void DogMLCD::Flush( unsigned char page, int x0, int x1 ) +{ + page &= 7; + BOUND( x0, 0, 127 ); + BOUND( x1, 0, 127 ); + ORDER( x0 , x1 ) + char* p = b_ + ( page << 7 ) + x0; + spi_.format( 8, 0 ); + spi_.frequency( DOGMLCD_MHZ ); + cs_ = 0; + a0_ = 0; wait_us( DOGMLCD_TIME ); + spi_.write( 0xB0 + page ); spi_.write( 0x10 ); spi_.write( 0x00 ); + + a0_ = 1; wait_us( DOGMLCD_TIME ); + int i = x1 - x0 + 1; + while( i-- ) + spi_.write( *p++ ); + cs_ = 1; +} +void DogMLCD::Page( unsigned char page0, unsigned char page1 ) +{ + page0 &= 7; + if( page1 == 0 ) page1 = page0; + else + { + page1 &= 7; + ORDER( page0, page1 ); + } + char* p = b_ + ( page0 << 7 ); + spi_.format( 8, 0 ); + spi_.frequency( DOGMLCD_MHZ ); + cs_ = 0; + for( int page = 0xB0 + page0 ; page <= ( 0xB0 + page1 ) ; page++ ) + { + a0_ = 0; wait_us( DOGMLCD_TIME ); + spi_.write( page ); spi_.write( 0x10 ); spi_.write( 0x00 ); + + a0_ = 1; wait_us( DOGMLCD_TIME ); + int i = 128; + while( i-- ) + spi_.write( *p++ ); + } + cs_ = 1; +} +void DogMLCD::Paste( char* screen, doggy_op op ) +{ + int i = 1024; + char* p = b_; + char* q = screen; + + if( op == poke ) while( i-- ) *p++ |= *q++; + else if( op == wipe ) while( i-- ) *p++ &= ~(*q++); + else while( i-- ) *p++ ^= *q++; +} + + +