Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ADA326.cpp@0:091e1a699d64, 2019-01-07 (annotated)
- Committer:
- certvert
- Date:
- Mon Jan 07 10:58:16 2019 +0000
- Revision:
- 0:091e1a699d64
The final version of Polytech EISE3 industrial project ; ; Adafruit screen 128x64 - i2c programmed, finite state machine, etc.;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| certvert | 0:091e1a699d64 | 1 | #include "ADA326.h" |
| certvert | 0:091e1a699d64 | 2 | #include "LCDGraphics.h" |
| certvert | 0:091e1a699d64 | 3 | #include "mbed.h" |
| certvert | 0:091e1a699d64 | 4 | |
| certvert | 0:091e1a699d64 | 5 | |
| certvert | 0:091e1a699d64 | 6 | #define SSD1306_LCDHEIGHT 64 |
| certvert | 0:091e1a699d64 | 7 | #define SSD1306_LCDWIDTH 128 |
| certvert | 0:091e1a699d64 | 8 | |
| certvert | 0:091e1a699d64 | 9 | #define SSD1306_SETCONTRAST 0x81 |
| certvert | 0:091e1a699d64 | 10 | #define SSD1306_DISPLAYALLON_RESUME 0xA4 |
| certvert | 0:091e1a699d64 | 11 | #define SSD1306_DISPLAYALLON 0xA5 |
| certvert | 0:091e1a699d64 | 12 | #define SSD1306_NORMALDISPLAY 0xA6 |
| certvert | 0:091e1a699d64 | 13 | #define SSD1306_INVERTDISPLAY 0xA7 |
| certvert | 0:091e1a699d64 | 14 | #define SSD1306_DISPLAYOFF 0xAE |
| certvert | 0:091e1a699d64 | 15 | #define SSD1306_DISPLAYON 0xAF |
| certvert | 0:091e1a699d64 | 16 | |
| certvert | 0:091e1a699d64 | 17 | #define SSD1306_SETDISPLAYOFFSET 0xD3 |
| certvert | 0:091e1a699d64 | 18 | #define SSD1306_SETCOMPINS 0xDA |
| certvert | 0:091e1a699d64 | 19 | |
| certvert | 0:091e1a699d64 | 20 | #define SSD1306_SETVCOMDETECT 0xDB |
| certvert | 0:091e1a699d64 | 21 | |
| certvert | 0:091e1a699d64 | 22 | #define SSD1306_SETDISPLAYCLOCKDIV 0xD5 |
| certvert | 0:091e1a699d64 | 23 | #define SSD1306_SETPRECHARGE 0xD9 |
| certvert | 0:091e1a699d64 | 24 | |
| certvert | 0:091e1a699d64 | 25 | #define SSD1306_SETMULTIPLEX 0xA8 |
| certvert | 0:091e1a699d64 | 26 | |
| certvert | 0:091e1a699d64 | 27 | #define SSD1306_SETLOWCOLUMN 0x00 |
| certvert | 0:091e1a699d64 | 28 | #define SSD1306_SETHIGHCOLUMN 0x10 |
| certvert | 0:091e1a699d64 | 29 | |
| certvert | 0:091e1a699d64 | 30 | #define SSD1306_SETSTARTLINE 0x40 |
| certvert | 0:091e1a699d64 | 31 | |
| certvert | 0:091e1a699d64 | 32 | #define SSD1306_MEMORYMODE 0x20 |
| certvert | 0:091e1a699d64 | 33 | #define SSD1306_COLUMNADDR 0x21 |
| certvert | 0:091e1a699d64 | 34 | #define SSD1306_PAGEADDR 0x22 |
| certvert | 0:091e1a699d64 | 35 | |
| certvert | 0:091e1a699d64 | 36 | #define SSD1306_COMSCANINC 0xC0 |
| certvert | 0:091e1a699d64 | 37 | #define SSD1306_COMSCANDEC 0xC8 |
| certvert | 0:091e1a699d64 | 38 | |
| certvert | 0:091e1a699d64 | 39 | #define SSD1306_SEGREMAP 0xA0 |
| certvert | 0:091e1a699d64 | 40 | |
| certvert | 0:091e1a699d64 | 41 | #define SSD1306_CHARGEPUMP 0x8D |
| certvert | 0:091e1a699d64 | 42 | |
| certvert | 0:091e1a699d64 | 43 | #define SSD1306_EXTERNALVCC 0x1 |
| certvert | 0:091e1a699d64 | 44 | #define SSD1306_SWITCHCAPVCC 0x2 |
| certvert | 0:091e1a699d64 | 45 | |
| certvert | 0:091e1a699d64 | 46 | // Scrolling #defines |
| certvert | 0:091e1a699d64 | 47 | #define SSD1306_ACTIVATE_SCROLL 0x2F |
| certvert | 0:091e1a699d64 | 48 | #define SSD1306_DEACTIVATE_SCROLL 0x2E |
| certvert | 0:091e1a699d64 | 49 | #define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3 |
| certvert | 0:091e1a699d64 | 50 | #define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26 |
| certvert | 0:091e1a699d64 | 51 | #define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27 |
| certvert | 0:091e1a699d64 | 52 | #define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 |
| certvert | 0:091e1a699d64 | 53 | #define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A |
| certvert | 0:091e1a699d64 | 54 | |
| certvert | 0:091e1a699d64 | 55 | #define BLACK 0 |
| certvert | 0:091e1a699d64 | 56 | #define WHITE 1 |
| certvert | 0:091e1a699d64 | 57 | #define INVERSE 2 |
| certvert | 0:091e1a699d64 | 58 | |
| certvert | 0:091e1a699d64 | 59 | |
| certvert | 0:091e1a699d64 | 60 | |
| certvert | 0:091e1a699d64 | 61 | extern Serial pc; |
| certvert | 0:091e1a699d64 | 62 | DigitalOut reset(D3); |
| certvert | 0:091e1a699d64 | 63 | |
| certvert | 0:091e1a699d64 | 64 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 65 | #define I2C_ADDR (0x3D << 1) |
| certvert | 0:091e1a699d64 | 66 | extern I2C i2c; |
| certvert | 0:091e1a699d64 | 67 | #endif |
| certvert | 0:091e1a699d64 | 68 | Ada326::Ada326(): |
| certvert | 0:091e1a699d64 | 69 | LCDGraphics(SSD1306_LCDWIDTH,SSD1306_LCDHEIGHT, MAX_PAGE) |
| certvert | 0:091e1a699d64 | 70 | { |
| certvert | 0:091e1a699d64 | 71 | pc.baud(9600); |
| certvert | 0:091e1a699d64 | 72 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 73 | pc.printf("ADA326 : Initialize I2C\r\n"); |
| certvert | 0:091e1a699d64 | 74 | pc.printf("ADA326 : %d x %d\r\n", width, height); |
| certvert | 0:091e1a699d64 | 75 | i2c.frequency(400000); |
| certvert | 0:091e1a699d64 | 76 | #endif |
| certvert | 0:091e1a699d64 | 77 | } |
| certvert | 0:091e1a699d64 | 78 | void Ada326::display_on() |
| certvert | 0:091e1a699d64 | 79 | { |
| certvert | 0:091e1a699d64 | 80 | initialize(); |
| certvert | 0:091e1a699d64 | 81 | } |
| certvert | 0:091e1a699d64 | 82 | void Ada326::display_off() |
| certvert | 0:091e1a699d64 | 83 | { |
| certvert | 0:091e1a699d64 | 84 | |
| certvert | 0:091e1a699d64 | 85 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 86 | i2c.start(); |
| certvert | 0:091e1a699d64 | 87 | #endif |
| certvert | 0:091e1a699d64 | 88 | ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE |
| certvert | 0:091e1a699d64 | 89 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 90 | i2c.stop(); |
| certvert | 0:091e1a699d64 | 91 | #endif |
| certvert | 0:091e1a699d64 | 92 | } |
| certvert | 0:091e1a699d64 | 93 | void Ada326::initialize() |
| certvert | 0:091e1a699d64 | 94 | { |
| certvert | 0:091e1a699d64 | 95 | |
| certvert | 0:091e1a699d64 | 96 | // Setup reset pin direction (used by both SPI and I2C) |
| certvert | 0:091e1a699d64 | 97 | reset = 1; |
| certvert | 0:091e1a699d64 | 98 | // VDD (3.3V) goes high at start, lets just chill for a ms |
| certvert | 0:091e1a699d64 | 99 | wait_ms(1); |
| certvert | 0:091e1a699d64 | 100 | // bring reset low |
| certvert | 0:091e1a699d64 | 101 | reset = 0; |
| certvert | 0:091e1a699d64 | 102 | // wait 10ms |
| certvert | 0:091e1a699d64 | 103 | wait_ms(10); |
| certvert | 0:091e1a699d64 | 104 | // bring out of reset |
| certvert | 0:091e1a699d64 | 105 | reset = 1; |
| certvert | 0:091e1a699d64 | 106 | |
| certvert | 0:091e1a699d64 | 107 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 108 | i2c.start(); |
| certvert | 0:091e1a699d64 | 109 | #endif |
| certvert | 0:091e1a699d64 | 110 | ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE |
| certvert | 0:091e1a699d64 | 111 | ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5 |
| certvert | 0:091e1a699d64 | 112 | ssd1306_command(0x80); // the suggested ratio 0x80 |
| certvert | 0:091e1a699d64 | 113 | |
| certvert | 0:091e1a699d64 | 114 | ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D |
| certvert | 0:091e1a699d64 | 115 | ssd1306_command(0x14); |
| certvert | 0:091e1a699d64 | 116 | ssd1306_command(SSD1306_MEMORYMODE); // 0x20 |
| certvert | 0:091e1a699d64 | 117 | ssd1306_command(0x00); |
| certvert | 0:091e1a699d64 | 118 | ssd1306_command(SSD1306_COMSCANDEC); // Write Pixels Downward. |
| certvert | 0:091e1a699d64 | 119 | ssd1306_command(SSD1306_SEGREMAP|0x1); // Write Pixels Rightward. |
| certvert | 0:091e1a699d64 | 120 | |
| certvert | 0:091e1a699d64 | 121 | ssd1306_command(SSD1306_NORMALDISPLAY); |
| certvert | 0:091e1a699d64 | 122 | ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel |
| certvert | 0:091e1a699d64 | 123 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 124 | i2c.stop(); |
| certvert | 0:091e1a699d64 | 125 | #endif |
| certvert | 0:091e1a699d64 | 126 | } |
| certvert | 0:091e1a699d64 | 127 | // Send command through i2c communication |
| certvert | 0:091e1a699d64 | 128 | void Ada326::ssd1306_command(uint8_t cmd) |
| certvert | 0:091e1a699d64 | 129 | { |
| certvert | 0:091e1a699d64 | 130 | char data[] = {0x00, cmd}; |
| certvert | 0:091e1a699d64 | 131 | i2c.write(I2C_ADDR, data, 2); |
| certvert | 0:091e1a699d64 | 132 | wait_us(1); |
| certvert | 0:091e1a699d64 | 133 | } |
| certvert | 0:091e1a699d64 | 134 | // Wipe out all pixels (display pitch black) |
| certvert | 0:091e1a699d64 | 135 | void Ada326::clear(bool show) |
| certvert | 0:091e1a699d64 | 136 | { |
| certvert | 0:091e1a699d64 | 137 | for (uint16_t page = 0; page < MAX_PAGE; page++) |
| certvert | 0:091e1a699d64 | 138 | for (uint16_t seg=0; seg < width; seg++) |
| certvert | 0:091e1a699d64 | 139 | screen[seg][page] = 0x0; |
| certvert | 0:091e1a699d64 | 140 | if(show) |
| certvert | 0:091e1a699d64 | 141 | display(); |
| certvert | 0:091e1a699d64 | 142 | } |
| certvert | 0:091e1a699d64 | 143 | // Renew display |
| certvert | 0:091e1a699d64 | 144 | void Ada326::display() |
| certvert | 0:091e1a699d64 | 145 | { |
| certvert | 0:091e1a699d64 | 146 | |
| certvert | 0:091e1a699d64 | 147 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 148 | i2c.start(); |
| certvert | 0:091e1a699d64 | 149 | #endif |
| certvert | 0:091e1a699d64 | 150 | // Let screen know that the entire display is used. (128x64) |
| certvert | 0:091e1a699d64 | 151 | ssd1306_command(SSD1306_COLUMNADDR); |
| certvert | 0:091e1a699d64 | 152 | ssd1306_command(0); // Column start address (0 = reset) |
| certvert | 0:091e1a699d64 | 153 | ssd1306_command(SSD1306_LCDWIDTH-1); // Column end address (127 = reset) |
| certvert | 0:091e1a699d64 | 154 | |
| certvert | 0:091e1a699d64 | 155 | ssd1306_command(SSD1306_PAGEADDR); |
| certvert | 0:091e1a699d64 | 156 | ssd1306_command(0); // Page start address (0 = reset) |
| certvert | 0:091e1a699d64 | 157 | ssd1306_command(7); // Page end address (8th page) |
| certvert | 0:091e1a699d64 | 158 | |
| certvert | 0:091e1a699d64 | 159 | // Signal to write pixels on the screen. |
| certvert | 0:091e1a699d64 | 160 | i2c.write(I2C_ADDR); |
| certvert | 0:091e1a699d64 | 161 | i2c.write(0x40); |
| certvert | 0:091e1a699d64 | 162 | wait_us(10); |
| certvert | 0:091e1a699d64 | 163 | int error; |
| certvert | 0:091e1a699d64 | 164 | // Write in consecutive manner. |
| certvert | 0:091e1a699d64 | 165 | for (uint16_t page = 0; page < MAX_PAGE; page++) { |
| certvert | 0:091e1a699d64 | 166 | for (uint16_t seg=0; seg < width; seg++) { |
| certvert | 0:091e1a699d64 | 167 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 168 | error =i2c.write(screen[seg][page]); |
| certvert | 0:091e1a699d64 | 169 | #elif _ADA326_VER_SPI_ |
| certvert | 0:091e1a699d64 | 170 | #endif |
| certvert | 0:091e1a699d64 | 171 | if (error != 1) |
| certvert | 0:091e1a699d64 | 172 | pc.printf("Error occured.\r\n"); |
| certvert | 0:091e1a699d64 | 173 | } |
| certvert | 0:091e1a699d64 | 174 | } |
| certvert | 0:091e1a699d64 | 175 | #ifdef _ADA326_VER_I2C_ |
| certvert | 0:091e1a699d64 | 176 | i2c.stop(); |
| certvert | 0:091e1a699d64 | 177 | #endif |
| certvert | 0:091e1a699d64 | 178 | |
| certvert | 0:091e1a699d64 | 179 | } |
| certvert | 0:091e1a699d64 | 180 | uint16_t Ada326::getWidth() |
| certvert | 0:091e1a699d64 | 181 | { |
| certvert | 0:091e1a699d64 | 182 | return SSD1306_LCDWIDTH; |
| certvert | 0:091e1a699d64 | 183 | } |
| certvert | 0:091e1a699d64 | 184 | uint16_t Ada326::getHeight() |
| certvert | 0:091e1a699d64 | 185 | { |
| certvert | 0:091e1a699d64 | 186 | return SSD1306_LCDHEIGHT; |
| certvert | 0:091e1a699d64 | 187 | } |
| certvert | 0:091e1a699d64 | 188 | // Replicate screen on the pc terminal. (Debugging purpose) |
| certvert | 0:091e1a699d64 | 189 | void Ada326::serial_display() |
| certvert | 0:091e1a699d64 | 190 | { |
| certvert | 0:091e1a699d64 | 191 | for (uint16_t y = 0; y < height; y++) { |
| certvert | 0:091e1a699d64 | 192 | for (uint16_t x = 0; x < width; x++) { |
| certvert | 0:091e1a699d64 | 193 | pc.printf("%d", (screen[x][y / page] >> y % com_per_page) & 0x1); |
| certvert | 0:091e1a699d64 | 194 | } |
| certvert | 0:091e1a699d64 | 195 | pc.printf("\r\n"); |
| certvert | 0:091e1a699d64 | 196 | } |
| certvert | 0:091e1a699d64 | 197 | } |