Chris Styles
/
EA_OLED_Joystick
This example uses the OLED display and the joystick on the Embedded Artists bseboard
EAOLED.cpp@0:6a7d6162034d, 2010-03-02 (annotated)
- Committer:
- chris
- Date:
- Tue Mar 02 07:23:59 2010 +0000
- Revision:
- 0:6a7d6162034d
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chris | 0:6a7d6162034d | 1 | // test library for Embedded Artists OLED used on Xpresso Baseboard |
chris | 0:6a7d6162034d | 2 | |
chris | 0:6a7d6162034d | 3 | #include "EAOLED.h" |
chris | 0:6a7d6162034d | 4 | #include "mbed.h" |
chris | 0:6a7d6162034d | 5 | |
chris | 0:6a7d6162034d | 6 | EAOLED::EAOLED(PinName mosi, PinName dnc, PinName sclk, PinName cs, PinName power) |
chris | 0:6a7d6162034d | 7 | : _spi(mosi, NC, sclk), _data(dnc), _cs(cs), _power(power) { |
chris | 0:6a7d6162034d | 8 | reset(); |
chris | 0:6a7d6162034d | 9 | } |
chris | 0:6a7d6162034d | 10 | |
chris | 0:6a7d6162034d | 11 | void EAOLED::command(int value) { |
chris | 0:6a7d6162034d | 12 | _data = 0; |
chris | 0:6a7d6162034d | 13 | _cs = 0; |
chris | 0:6a7d6162034d | 14 | _spi.write(value); |
chris | 0:6a7d6162034d | 15 | _cs = 1; |
chris | 0:6a7d6162034d | 16 | } |
chris | 0:6a7d6162034d | 17 | |
chris | 0:6a7d6162034d | 18 | void EAOLED::data(int value) { |
chris | 0:6a7d6162034d | 19 | _data = 1; |
chris | 0:6a7d6162034d | 20 | _cs = 0; |
chris | 0:6a7d6162034d | 21 | _spi.write(value); |
chris | 0:6a7d6162034d | 22 | _cs = 1; |
chris | 0:6a7d6162034d | 23 | } |
chris | 0:6a7d6162034d | 24 | |
chris | 0:6a7d6162034d | 25 | void EAOLED::reset() { |
chris | 0:6a7d6162034d | 26 | _power = 0; |
chris | 0:6a7d6162034d | 27 | _cs = 1; |
chris | 0:6a7d6162034d | 28 | |
chris | 0:6a7d6162034d | 29 | // Startup sequence recommended by embedded artists baseboard reference code |
chris | 0:6a7d6162034d | 30 | command(0x02); // set low column address |
chris | 0:6a7d6162034d | 31 | command(0x12); // set high column address |
chris | 0:6a7d6162034d | 32 | command(0x40); // display start set |
chris | 0:6a7d6162034d | 33 | command(0x2e); // stop horzontal scroll |
chris | 0:6a7d6162034d | 34 | command(0x81); // set contrast control register |
chris | 0:6a7d6162034d | 35 | command(0x32); // |
chris | 0:6a7d6162034d | 36 | command(0x82); // brightness for color banks |
chris | 0:6a7d6162034d | 37 | command(0x80); // display on |
chris | 0:6a7d6162034d | 38 | command(0xa1); // set segment re-map |
chris | 0:6a7d6162034d | 39 | command(0xa6); // set normal/inverse display |
chris | 0:6a7d6162034d | 40 | command(0xa8); // set multiplex ratio |
chris | 0:6a7d6162034d | 41 | command(0x3F); // |
chris | 0:6a7d6162034d | 42 | command(0xd3); // set display offset |
chris | 0:6a7d6162034d | 43 | command(0x40); // |
chris | 0:6a7d6162034d | 44 | command(0xad); // set dc-dc on/off |
chris | 0:6a7d6162034d | 45 | command(0x8E); // |
chris | 0:6a7d6162034d | 46 | command(0xc8); // set com output scan direction |
chris | 0:6a7d6162034d | 47 | command(0xd5); // set display clock divide ratio/oscillator/frequency |
chris | 0:6a7d6162034d | 48 | command(0xf0); // |
chris | 0:6a7d6162034d | 49 | command(0xd8); // set area color mode on/off & low power display mode |
chris | 0:6a7d6162034d | 50 | command(0x05); // |
chris | 0:6a7d6162034d | 51 | command(0xd9); // set pre-charge period |
chris | 0:6a7d6162034d | 52 | command(0xF1); // |
chris | 0:6a7d6162034d | 53 | command(0xda); // set com pins hardware configuration |
chris | 0:6a7d6162034d | 54 | command(0x12); // |
chris | 0:6a7d6162034d | 55 | command(0xdb); // set vcom deselect level |
chris | 0:6a7d6162034d | 56 | command(0x34); // |
chris | 0:6a7d6162034d | 57 | command(0x91); // set look up table for area color |
chris | 0:6a7d6162034d | 58 | command(0x3f); // |
chris | 0:6a7d6162034d | 59 | command(0x3f); // |
chris | 0:6a7d6162034d | 60 | command(0x3f); // |
chris | 0:6a7d6162034d | 61 | command(0x3f); // |
chris | 0:6a7d6162034d | 62 | command(0xaf); // display on |
chris | 0:6a7d6162034d | 63 | command(0xa4); // display on |
chris | 0:6a7d6162034d | 64 | |
chris | 0:6a7d6162034d | 65 | wait_us(10); |
chris | 0:6a7d6162034d | 66 | |
chris | 0:6a7d6162034d | 67 | _power = 1; |
chris | 0:6a7d6162034d | 68 | } |
chris | 0:6a7d6162034d | 69 | |
chris | 0:6a7d6162034d | 70 | #define OLED_DISPLAY_WIDTH 96 |
chris | 0:6a7d6162034d | 71 | #define OLED_DISPLAY_HEIGHT 64 |
chris | 0:6a7d6162034d | 72 | |
chris | 0:6a7d6162034d | 73 | void EAOLED::pixel(int x, int y, int colour) { |
chris | 0:6a7d6162034d | 74 | int page = y >> 3; |
chris | 0:6a7d6162034d | 75 | int address = 18 + x; |
chris | 0:6a7d6162034d | 76 | |
chris | 0:6a7d6162034d | 77 | int lo = (address >> 0) & 0x0F; |
chris | 0:6a7d6162034d | 78 | int hi = (address >> 4) | 0x10; |
chris | 0:6a7d6162034d | 79 | int mask = 1 << (y & 0x7); |
chris | 0:6a7d6162034d | 80 | int byte = page * OLED_DISPLAY_WIDTH + x; |
chris | 0:6a7d6162034d | 81 | |
chris | 0:6a7d6162034d | 82 | if(colour) { |
chris | 0:6a7d6162034d | 83 | framebuffer[byte] |= mask; |
chris | 0:6a7d6162034d | 84 | } else { |
chris | 0:6a7d6162034d | 85 | framebuffer[byte] &= ~mask; |
chris | 0:6a7d6162034d | 86 | } |
chris | 0:6a7d6162034d | 87 | |
chris | 0:6a7d6162034d | 88 | command(0xB0 + page); |
chris | 0:6a7d6162034d | 89 | command(lo); |
chris | 0:6a7d6162034d | 90 | command(hi); |
chris | 0:6a7d6162034d | 91 | data(framebuffer[byte]); |
chris | 0:6a7d6162034d | 92 | } |
chris | 0:6a7d6162034d | 93 | |
chris | 0:6a7d6162034d | 94 | /*void EAOLED::cls() { |
chris | 0:6a7d6162034d | 95 | for(int y=0; y<64; y++) { |
chris | 0:6a7d6162034d | 96 | for (int x=0; x<96; x++) { |
chris | 0:6a7d6162034d | 97 | pixel(x, y, 0xFFFFFF); |
chris | 0:6a7d6162034d | 98 | } |
chris | 0:6a7d6162034d | 99 | } |
chris | 0:6a7d6162034d | 100 | }*/ |
chris | 0:6a7d6162034d | 101 |