A test example using the OLED display on the Embedded Artists Xpresso baseboard

Dependencies:   mbed

EAOLED.cpp

Committer:
simon
Date:
2010-02-28
Revision:
0:f42b25503fd1

File content as of revision 0:f42b25503fd1:

// test library for Embedded Artists OLED used on Xpresso Baseboard

#include "EAOLED.h"
#include "mbed.h"

EAOLED::EAOLED(PinName mosi, PinName dnc, PinName sclk, PinName cs, PinName power) 
    : _spi(mosi, NC, sclk), _data(dnc), _cs(cs), _power(power) {
    reset();    
}
      
void EAOLED::command(int value) {
    _data = 0;
    _cs = 0;
    _spi.write(value);
    _cs = 1;
}

void EAOLED::data(int value) {
    _data = 1;
    _cs = 0;
    _spi.write(value);
    _cs = 1;
}

void EAOLED::reset() {
    _power = 0;
    _cs = 1;

    // Startup sequence recommended by embedded artists baseboard reference code
    command(0x02); // set low column address
    command(0x12); // set high column address
    command(0x40); // display start set
    command(0x2e); // stop horzontal scroll
    command(0x81); // set contrast control register
    command(0x32); //
    command(0x82); // brightness for color banks
    command(0x80); // display on
    command(0xa1); // set segment re-map
    command(0xa6); // set normal/inverse display
    command(0xa8); // set multiplex ratio
    command(0x3F); //
    command(0xd3); // set display offset
    command(0x40); //
    command(0xad); // set dc-dc on/off
    command(0x8E); //
    command(0xc8); // set com output scan direction
    command(0xd5); // set display clock divide ratio/oscillator/frequency
    command(0xf0); //
    command(0xd8); // set area color mode on/off & low power display mode 
    command(0x05); //
    command(0xd9); // set pre-charge period
    command(0xF1); //
    command(0xda); // set com pins hardware configuration
    command(0x12); //
    command(0xdb); // set vcom deselect level
    command(0x34); //
    command(0x91); // set look up table for area color 
    command(0x3f); //
    command(0x3f); //
    command(0x3f); //
    command(0x3f); //
    command(0xaf); // display on
    command(0xa4); // display on

    wait_us(10);

    _power = 1;
}

#define OLED_DISPLAY_WIDTH  96
#define OLED_DISPLAY_HEIGHT 64

void EAOLED::pixel(int x, int y, int colour) {
    int page = y >> 3;
    int address = 18 + x;
    
    int lo = (address >> 0) & 0x0F;
    int hi =  (address >> 4) | 0x10;
    int mask = 1 << (y & 0x7);
    int byte = page * OLED_DISPLAY_WIDTH + x;
    
    if(colour) {
        framebuffer[byte] |= mask;
    } else {
        framebuffer[byte] &= ~mask;
    }

    command(0xB0 + page);
    command(lo);
    command(hi);
    data(framebuffer[byte]);
}

/*void EAOLED::cls() {
    for(int y=0; y<64; y++) {
        for (int x=0; x<96; x++) {
            pixel(x, y, 0xFFFFFF);
        }
    }
}*/