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.
main.cpp@3:ffbd1961115d, 2018-10-08 (annotated)
- Committer:
- dallegre
- Date:
- Mon Oct 08 16:16:09 2018 +0000
- Revision:
- 3:ffbd1961115d
- Parent:
- 2:b558c2d645b2
Driver and bitmap loading for an SSD1306 graphic display using the STM32 F401.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dallegre | 0:deb92489beec | 1 | #include "mbed.h" |
dallegre | 0:deb92489beec | 2 | #include "ssd1306.h" |
dallegre | 0:deb92489beec | 3 | #include "FontPack.h" |
dallegre | 0:deb92489beec | 4 | #include "icons.h" |
dallegre | 0:deb92489beec | 5 | #include "CourierNew5x7.h" |
dallegre | 0:deb92489beec | 6 | #include "CourierNew_14x15.h" //whatever. |
dallegre | 0:deb92489beec | 7 | |
dallegre | 0:deb92489beec | 8 | DigitalOut dc(D9); //D/C |
dallegre | 0:deb92489beec | 9 | DigitalOut rs(D8); //RES (keep high) |
dallegre | 0:deb92489beec | 10 | DigitalOut cs(D7); //CS (active low) |
dallegre | 0:deb92489beec | 11 | |
dallegre | 2:b558c2d645b2 | 12 | SPI spi(SPI_MOSI,SPI_MISO,SPI_SCK); //spi1 is the i2s |
dallegre | 2:b558c2d645b2 | 13 | SPI spi2(PB_15,PB_14,PB_13); //spi2 is the display |
dallegre | 0:deb92489beec | 14 | |
dallegre | 0:deb92489beec | 15 | int main() { |
dallegre | 0:deb92489beec | 16 | |
dallegre | 2:b558c2d645b2 | 17 | spi2.frequency(8e6); //8MHz spi22. This is fast enough for 88KHz 16 bit sampling. |
dallegre | 2:b558c2d645b2 | 18 | spi2.format(8,0); //16 bit. clock polarity 0, phase 0. |
dallegre | 0:deb92489beec | 19 | wait(.1); |
dallegre | 0:deb92489beec | 20 | |
dallegre | 0:deb92489beec | 21 | rs.write(1); |
dallegre | 0:deb92489beec | 22 | wait(.1); |
dallegre | 0:deb92489beec | 23 | |
dallegre | 0:deb92489beec | 24 | SSD1306Init(); |
dallegre | 0:deb92489beec | 25 | clearScreen(); |
dallegre | 3:ffbd1961115d | 26 | //Set_Inverse_Display(1); |
dallegre | 0:deb92489beec | 27 | |
dallegre | 3:ffbd1961115d | 28 | /* |
dallegre | 1:414748809a35 | 29 | while(1) { |
dallegre | 1:414748809a35 | 30 | wait(.1); |
dallegre | 1:414748809a35 | 31 | clearScreen(); |
dallegre | 1:414748809a35 | 32 | imageDraw(aphex7, 2, 40); |
dallegre | 1:414748809a35 | 33 | wait(.1); |
dallegre | 1:414748809a35 | 34 | clearScreen(); |
dallegre | 1:414748809a35 | 35 | imageDraw(aphex5, 2, 40); |
dallegre | 1:414748809a35 | 36 | wait(.1); |
dallegre | 1:414748809a35 | 37 | clearScreen(); |
dallegre | 1:414748809a35 | 38 | imageDraw(aphex4, 2, 40); |
dallegre | 1:414748809a35 | 39 | wait(.1); |
dallegre | 1:414748809a35 | 40 | clearScreen(); |
dallegre | 1:414748809a35 | 41 | imageDraw(aphex3, 2, 40); |
dallegre | 1:414748809a35 | 42 | wait(.1); |
dallegre | 1:414748809a35 | 43 | clearScreen(); |
dallegre | 1:414748809a35 | 44 | imageDraw(aphex2, 2, 40); |
dallegre | 1:414748809a35 | 45 | wait(.1); |
dallegre | 1:414748809a35 | 46 | clearScreen(); |
dallegre | 1:414748809a35 | 47 | imageDraw(aphex, 2, 40); |
dallegre | 1:414748809a35 | 48 | wait(.1); |
dallegre | 1:414748809a35 | 49 | clearScreen(); |
dallegre | 1:414748809a35 | 50 | imageDraw(aphex2, 2, 40); |
dallegre | 1:414748809a35 | 51 | wait(.1); |
dallegre | 1:414748809a35 | 52 | clearScreen(); |
dallegre | 1:414748809a35 | 53 | imageDraw(aphex3, 2, 40); |
dallegre | 1:414748809a35 | 54 | wait(.1); |
dallegre | 1:414748809a35 | 55 | clearScreen(); |
dallegre | 1:414748809a35 | 56 | imageDraw(aphex4, 2, 40); |
dallegre | 1:414748809a35 | 57 | wait(.1); |
dallegre | 1:414748809a35 | 58 | clearScreen(); |
dallegre | 1:414748809a35 | 59 | imageDraw(aphex5, 2, 40); |
dallegre | 1:414748809a35 | 60 | wait(.1); |
dallegre | 1:414748809a35 | 61 | clearScreen(); |
dallegre | 1:414748809a35 | 62 | imageDraw(aphex6, 2, 40); |
dallegre | 3:ffbd1961115d | 63 | }*/ |
dallegre | 3:ffbd1961115d | 64 | |
dallegre | 3:ffbd1961115d | 65 | imageDraw(cassette,1,23); |
dallegre | 0:deb92489beec | 66 | |
dallegre | 1:414748809a35 | 67 | //circleDraw(20,40,10); |
dallegre | 1:414748809a35 | 68 | //circleDraw(40,20,30); |
dallegre | 1:414748809a35 | 69 | //stringDraw(2, 40, "D A N"); |
dallegre | 1:414748809a35 | 70 | //stringDraw(4, 40, "mad scientist"); |
dallegre | 0:deb92489beec | 71 | } |
dallegre | 0:deb92489beec | 72 | |
dallegre | 0:deb92489beec | 73 | |
dallegre | 0:deb92489beec | 74 | |
dallegre | 0:deb92489beec | 75 | |
dallegre | 0:deb92489beec | 76 | |
dallegre | 0:deb92489beec | 77 | |
dallegre | 0:deb92489beec | 78 | //bunch of shit below.. |
dallegre | 0:deb92489beec | 79 | |
dallegre | 0:deb92489beec | 80 | char SSD1306_init[] = { |
dallegre | 0:deb92489beec | 81 | SSD1306_DISPLAYOFF, |
dallegre | 0:deb92489beec | 82 | SSD1306_SETLOWCOLUMN, |
dallegre | 0:deb92489beec | 83 | SSD1306_SETHIGHCOLUMN, |
dallegre | 0:deb92489beec | 84 | SSD1306_SETSTARTLINE, |
dallegre | 0:deb92489beec | 85 | SSD1306_SETCONTRAST, |
dallegre | 0:deb92489beec | 86 | 0xcf, |
dallegre | 0:deb92489beec | 87 | SSD1306_SEGREMAP, |
dallegre | 0:deb92489beec | 88 | SSD1306_NORMALDISPLAY, |
dallegre | 0:deb92489beec | 89 | SSD1306_SETMULTIPLEX, |
dallegre | 0:deb92489beec | 90 | 0x3f, |
dallegre | 0:deb92489beec | 91 | SSD1306_SETDISPLAYOFFSET, |
dallegre | 0:deb92489beec | 92 | 0x00, |
dallegre | 0:deb92489beec | 93 | SSD1306_SETDISPLAYCLOCKDIV, |
dallegre | 0:deb92489beec | 94 | 0x80, |
dallegre | 0:deb92489beec | 95 | SSD1306_SETPRECHARGE, |
dallegre | 0:deb92489beec | 96 | 0xf1, |
dallegre | 0:deb92489beec | 97 | SSD1306_SETCOMPINS, |
dallegre | 0:deb92489beec | 98 | 0x12, |
dallegre | 0:deb92489beec | 99 | SSD1306_SETVCOMDETECT, |
dallegre | 0:deb92489beec | 100 | 0x40, |
dallegre | 0:deb92489beec | 101 | SSD1306_CHARGEPUMP, |
dallegre | 0:deb92489beec | 102 | 0x14, |
dallegre | 0:deb92489beec | 103 | SSD1306_DISPLAYON |
dallegre | 0:deb92489beec | 104 | }; |
dallegre | 0:deb92489beec | 105 | |
dallegre | 0:deb92489beec | 106 | void SSD1306Init(void){ |
dallegre | 0:deb92489beec | 107 | cs.write(1); |
dallegre | 0:deb92489beec | 108 | dc.write(0); |
dallegre | 0:deb92489beec | 109 | rs.write(0); |
dallegre | 0:deb92489beec | 110 | rs.write(1); |
dallegre | 0:deb92489beec | 111 | SSD1306SendCommand(SSD1306_init, sizeof SSD1306_init); |
dallegre | 0:deb92489beec | 112 | } |
dallegre | 0:deb92489beec | 113 | |
dallegre | 0:deb92489beec | 114 | void SSD1306SendCommand(char *data, int i){ |
dallegre | 0:deb92489beec | 115 | cs.write(1); |
dallegre | 0:deb92489beec | 116 | dc.write(0); //data/command low for command. |
dallegre | 0:deb92489beec | 117 | cs.write(0); |
dallegre | 0:deb92489beec | 118 | while(i){ |
dallegre | 2:b558c2d645b2 | 119 | spi2.write(*data); |
dallegre | 0:deb92489beec | 120 | data++; |
dallegre | 0:deb92489beec | 121 | i--; |
dallegre | 0:deb92489beec | 122 | } |
dallegre | 0:deb92489beec | 123 | cs.write(1); |
dallegre | 0:deb92489beec | 124 | } |
dallegre | 0:deb92489beec | 125 | |
dallegre | 0:deb92489beec | 126 | void SSD1306SendData(char *data, int i){ |
dallegre | 0:deb92489beec | 127 | cs.write(1); |
dallegre | 0:deb92489beec | 128 | dc.write(1); //data/command high for data. |
dallegre | 0:deb92489beec | 129 | cs.write(0); |
dallegre | 0:deb92489beec | 130 | while(i){ |
dallegre | 2:b558c2d645b2 | 131 | spi2.write(*data); |
dallegre | 0:deb92489beec | 132 | data++; |
dallegre | 0:deb92489beec | 133 | i--; |
dallegre | 0:deb92489beec | 134 | } |
dallegre | 0:deb92489beec | 135 | cs.write(1); |
dallegre | 0:deb92489beec | 136 | } |
dallegre | 0:deb92489beec | 137 | |
dallegre | 0:deb92489beec | 138 | void setAddress( char page, char column ) |
dallegre | 0:deb92489beec | 139 | { |
dallegre | 0:deb92489beec | 140 | |
dallegre | 0:deb92489beec | 141 | char pageAddress[] = {SSD1306_PAGE_START_ADDRESS}; |
dallegre | 0:deb92489beec | 142 | char columnAddress[] = { SSD1306_COLUMNADDRESS, SSD1306_COLUMNADDRESS_MSB, SSD1306_COLUMNADDRESS_LSB }; |
dallegre | 0:deb92489beec | 143 | |
dallegre | 0:deb92489beec | 144 | if (page > SSD1306_MAXROWS) |
dallegre | 0:deb92489beec | 145 | { |
dallegre | 0:deb92489beec | 146 | page = SSD1306_MAXROWS; |
dallegre | 0:deb92489beec | 147 | } |
dallegre | 0:deb92489beec | 148 | |
dallegre | 0:deb92489beec | 149 | if (column > SSD1306_LCDWIDTH) |
dallegre | 0:deb92489beec | 150 | { |
dallegre | 0:deb92489beec | 151 | column = SSD1306_LCDWIDTH; |
dallegre | 0:deb92489beec | 152 | } |
dallegre | 0:deb92489beec | 153 | |
dallegre | 0:deb92489beec | 154 | pageAddress[0] = SSD1306_PAGE_START_ADDRESS | (SSD1306_MAXROWS - page); |
dallegre | 0:deb92489beec | 155 | |
dallegre | 0:deb92489beec | 156 | columnAddress[0] = SSD1306_COLUMNADDRESS; |
dallegre | 0:deb92489beec | 157 | columnAddress[1] = SSD1306_COLUMNADDRESS_MSB | column; |
dallegre | 0:deb92489beec | 158 | columnAddress[2] = SSD1306_COLUMNADDRESS_LSB; |
dallegre | 0:deb92489beec | 159 | |
dallegre | 0:deb92489beec | 160 | //__no_operation(); |
dallegre | 0:deb92489beec | 161 | |
dallegre | 0:deb92489beec | 162 | SSD1306SendCommand(pageAddress, 1); |
dallegre | 0:deb92489beec | 163 | SSD1306SendCommand(columnAddress, 3); |
dallegre | 0:deb92489beec | 164 | |
dallegre | 0:deb92489beec | 165 | } |
dallegre | 0:deb92489beec | 166 | |
dallegre | 0:deb92489beec | 167 | void clearScreen(void) |
dallegre | 0:deb92489beec | 168 | { |
dallegre | 0:deb92489beec | 169 | char ramData[] = {0x00}; |
dallegre | 0:deb92489beec | 170 | |
dallegre | 0:deb92489beec | 171 | char i,j; |
dallegre | 0:deb92489beec | 172 | |
dallegre | 0:deb92489beec | 173 | for(i=0; i < 8 ;i++) |
dallegre | 0:deb92489beec | 174 | { |
dallegre | 0:deb92489beec | 175 | setAddress(i,0); |
dallegre | 0:deb92489beec | 176 | |
dallegre | 0:deb92489beec | 177 | for(j=0; j < SSD1306_LCDWIDTH; j++) |
dallegre | 0:deb92489beec | 178 | { |
dallegre | 0:deb92489beec | 179 | SSD1306SendData(ramData, 1); |
dallegre | 0:deb92489beec | 180 | } |
dallegre | 0:deb92489beec | 181 | } |
dallegre | 0:deb92489beec | 182 | } |
dallegre | 0:deb92489beec | 183 | |
dallegre | 0:deb92489beec | 184 | void charDraw(char row, char column, int data) |
dallegre | 0:deb92489beec | 185 | { |
dallegre | 0:deb92489beec | 186 | int h; |
dallegre | 0:deb92489beec | 187 | |
dallegre | 0:deb92489beec | 188 | if (row > SSD1306_MAXROWS) |
dallegre | 0:deb92489beec | 189 | { |
dallegre | 0:deb92489beec | 190 | row = SSD1306_MAXROWS; |
dallegre | 0:deb92489beec | 191 | } |
dallegre | 0:deb92489beec | 192 | |
dallegre | 0:deb92489beec | 193 | if (column > SSD1306_LCDWIDTH) |
dallegre | 0:deb92489beec | 194 | { |
dallegre | 0:deb92489beec | 195 | column = SSD1306_LCDWIDTH; |
dallegre | 0:deb92489beec | 196 | } |
dallegre | 0:deb92489beec | 197 | |
dallegre | 0:deb92489beec | 198 | if ( data < 32 || data > 129 ) |
dallegre | 0:deb92489beec | 199 | { |
dallegre | 0:deb92489beec | 200 | data = '.'; |
dallegre | 0:deb92489beec | 201 | } |
dallegre | 0:deb92489beec | 202 | |
dallegre | 0:deb92489beec | 203 | h = (data - 32) * 6; |
dallegre | 0:deb92489beec | 204 | |
dallegre | 0:deb92489beec | 205 | setAddress(row, column); |
dallegre | 0:deb92489beec | 206 | SSD1306SendData( (char *)FONT6x8 + h, 6 ); |
dallegre | 0:deb92489beec | 207 | |
dallegre | 0:deb92489beec | 208 | } |
dallegre | 0:deb92489beec | 209 | |
dallegre | 0:deb92489beec | 210 | void stringDraw( char row, char column, char *word) |
dallegre | 0:deb92489beec | 211 | { |
dallegre | 0:deb92489beec | 212 | char a = 0; |
dallegre | 0:deb92489beec | 213 | |
dallegre | 0:deb92489beec | 214 | if (row > SSD1306_MAXROWS) |
dallegre | 0:deb92489beec | 215 | { |
dallegre | 0:deb92489beec | 216 | row = SSD1306_MAXROWS; |
dallegre | 0:deb92489beec | 217 | } |
dallegre | 0:deb92489beec | 218 | |
dallegre | 0:deb92489beec | 219 | if (column > SSD1306_LCDWIDTH) |
dallegre | 0:deb92489beec | 220 | { |
dallegre | 0:deb92489beec | 221 | column = SSD1306_LCDWIDTH; |
dallegre | 0:deb92489beec | 222 | } |
dallegre | 0:deb92489beec | 223 | |
dallegre | 0:deb92489beec | 224 | while (word[a] != 0) |
dallegre | 0:deb92489beec | 225 | { |
dallegre | 0:deb92489beec | 226 | if (word[a] != 0x0A) |
dallegre | 0:deb92489beec | 227 | { |
dallegre | 0:deb92489beec | 228 | if (word[a] != 0x0D) |
dallegre | 0:deb92489beec | 229 | { |
dallegre | 0:deb92489beec | 230 | charDraw(row, column, word[a]); |
dallegre | 0:deb92489beec | 231 | |
dallegre | 0:deb92489beec | 232 | //__no_operation(); |
dallegre | 0:deb92489beec | 233 | |
dallegre | 0:deb92489beec | 234 | column += 6; |
dallegre | 0:deb92489beec | 235 | |
dallegre | 0:deb92489beec | 236 | if (column >= (SSD1306_LCDWIDTH - 6 )) |
dallegre | 0:deb92489beec | 237 | { |
dallegre | 0:deb92489beec | 238 | column = 0; |
dallegre | 0:deb92489beec | 239 | if ( row < SSD1306_MAXROWS ) |
dallegre | 0:deb92489beec | 240 | row++; |
dallegre | 0:deb92489beec | 241 | else |
dallegre | 0:deb92489beec | 242 | row = 0; |
dallegre | 0:deb92489beec | 243 | } |
dallegre | 0:deb92489beec | 244 | |
dallegre | 0:deb92489beec | 245 | } |
dallegre | 0:deb92489beec | 246 | else |
dallegre | 0:deb92489beec | 247 | { |
dallegre | 0:deb92489beec | 248 | if ( row < SSD1306_MAXROWS ) |
dallegre | 0:deb92489beec | 249 | row++; |
dallegre | 0:deb92489beec | 250 | else |
dallegre | 0:deb92489beec | 251 | row = 0; |
dallegre | 0:deb92489beec | 252 | column = 0; |
dallegre | 0:deb92489beec | 253 | } |
dallegre | 0:deb92489beec | 254 | a++; |
dallegre | 0:deb92489beec | 255 | } |
dallegre | 0:deb92489beec | 256 | } |
dallegre | 0:deb92489beec | 257 | } |
dallegre | 0:deb92489beec | 258 | |
dallegre | 0:deb92489beec | 259 | void pixelDraw(char x, char y) |
dallegre | 0:deb92489beec | 260 | { |
dallegre | 0:deb92489beec | 261 | char page, temp; |
dallegre | 0:deb92489beec | 262 | char coordinate[] = {0x00}; |
dallegre | 0:deb92489beec | 263 | |
dallegre | 0:deb92489beec | 264 | if (x > SSD1306_LCDWIDTH - 1) |
dallegre | 0:deb92489beec | 265 | { |
dallegre | 0:deb92489beec | 266 | x = SSD1306_LCDWIDTH - 1; |
dallegre | 0:deb92489beec | 267 | } |
dallegre | 0:deb92489beec | 268 | |
dallegre | 0:deb92489beec | 269 | if (y > SSD1306_LCDHEIGHT - 1) |
dallegre | 0:deb92489beec | 270 | { |
dallegre | 0:deb92489beec | 271 | y = SSD1306_LCDHEIGHT - 1; |
dallegre | 0:deb92489beec | 272 | } |
dallegre | 0:deb92489beec | 273 | |
dallegre | 0:deb92489beec | 274 | page = y / 8; |
dallegre | 0:deb92489beec | 275 | temp = 0x80 >> (y % 8); |
dallegre | 0:deb92489beec | 276 | coordinate[0] = temp; |
dallegre | 0:deb92489beec | 277 | |
dallegre | 0:deb92489beec | 278 | setAddress(page,x); |
dallegre | 0:deb92489beec | 279 | SSD1306SendData(coordinate, 1); |
dallegre | 0:deb92489beec | 280 | |
dallegre | 0:deb92489beec | 281 | } |
dallegre | 0:deb92489beec | 282 | |
dallegre | 0:deb92489beec | 283 | |
dallegre | 0:deb92489beec | 284 | void horizontalLine(char xStart, char xStop, char y) |
dallegre | 0:deb92489beec | 285 | { |
dallegre | 0:deb92489beec | 286 | char temp = 0; |
dallegre | 0:deb92489beec | 287 | char page, a; |
dallegre | 0:deb92489beec | 288 | char ramData[] = { 0x00 }; |
dallegre | 0:deb92489beec | 289 | |
dallegre | 0:deb92489beec | 290 | if (xStart > SSD1306_LCDWIDTH - 1) |
dallegre | 0:deb92489beec | 291 | { |
dallegre | 0:deb92489beec | 292 | xStart = SSD1306_LCDWIDTH - 1; |
dallegre | 0:deb92489beec | 293 | } |
dallegre | 0:deb92489beec | 294 | |
dallegre | 0:deb92489beec | 295 | if (xStop > SSD1306_LCDWIDTH - 1) |
dallegre | 0:deb92489beec | 296 | { |
dallegre | 0:deb92489beec | 297 | xStop = SSD1306_LCDWIDTH - 1; |
dallegre | 0:deb92489beec | 298 | } |
dallegre | 0:deb92489beec | 299 | |
dallegre | 0:deb92489beec | 300 | if (y > SSD1306_LCDHEIGHT - 1) |
dallegre | 0:deb92489beec | 301 | { |
dallegre | 0:deb92489beec | 302 | y = SSD1306_LCDHEIGHT - 1; |
dallegre | 0:deb92489beec | 303 | } |
dallegre | 0:deb92489beec | 304 | |
dallegre | 0:deb92489beec | 305 | if (xStart > xStop) |
dallegre | 0:deb92489beec | 306 | { |
dallegre | 0:deb92489beec | 307 | temp = xStart; |
dallegre | 0:deb92489beec | 308 | xStart = xStop; |
dallegre | 0:deb92489beec | 309 | xStop = temp; |
dallegre | 0:deb92489beec | 310 | } |
dallegre | 0:deb92489beec | 311 | |
dallegre | 0:deb92489beec | 312 | page = y / 8; |
dallegre | 0:deb92489beec | 313 | temp = 0x80 >> (y %8); |
dallegre | 0:deb92489beec | 314 | |
dallegre | 0:deb92489beec | 315 | a = xStart; |
dallegre | 0:deb92489beec | 316 | ramData[0] = temp; |
dallegre | 0:deb92489beec | 317 | |
dallegre | 0:deb92489beec | 318 | setAddress(page, xStart); |
dallegre | 0:deb92489beec | 319 | |
dallegre | 0:deb92489beec | 320 | while (a <= xStop) |
dallegre | 0:deb92489beec | 321 | { |
dallegre | 0:deb92489beec | 322 | SSD1306SendData(ramData, 1); |
dallegre | 0:deb92489beec | 323 | a++; |
dallegre | 0:deb92489beec | 324 | } |
dallegre | 0:deb92489beec | 325 | } |
dallegre | 0:deb92489beec | 326 | |
dallegre | 0:deb92489beec | 327 | void verticalLine(char x, char yStart, char yStop) |
dallegre | 0:deb92489beec | 328 | { |
dallegre | 0:deb92489beec | 329 | char temp1 = 0, temp2 = 0; |
dallegre | 0:deb92489beec | 330 | char page1, page2, pageStart; |
dallegre | 0:deb92489beec | 331 | char a; |
dallegre | 0:deb92489beec | 332 | char ramData1[] = {0x00}; |
dallegre | 0:deb92489beec | 333 | char ramData2[] = {0x00}; |
dallegre | 0:deb92489beec | 334 | |
dallegre | 0:deb92489beec | 335 | if (x > SSD1306_LCDWIDTH - 1) |
dallegre | 0:deb92489beec | 336 | { |
dallegre | 0:deb92489beec | 337 | x = SSD1306_LCDWIDTH - 1; |
dallegre | 0:deb92489beec | 338 | } |
dallegre | 0:deb92489beec | 339 | |
dallegre | 0:deb92489beec | 340 | if (yStart > SSD1306_LCDHEIGHT - 1) |
dallegre | 0:deb92489beec | 341 | { |
dallegre | 0:deb92489beec | 342 | yStart = SSD1306_LCDHEIGHT - 1; |
dallegre | 0:deb92489beec | 343 | } |
dallegre | 0:deb92489beec | 344 | |
dallegre | 0:deb92489beec | 345 | if (yStop > SSD1306_LCDHEIGHT - 1) |
dallegre | 0:deb92489beec | 346 | { |
dallegre | 0:deb92489beec | 347 | yStop = SSD1306_LCDHEIGHT - 1; |
dallegre | 0:deb92489beec | 348 | } |
dallegre | 0:deb92489beec | 349 | |
dallegre | 0:deb92489beec | 350 | if (yStart > yStop) |
dallegre | 0:deb92489beec | 351 | { |
dallegre | 0:deb92489beec | 352 | temp1 = yStart; |
dallegre | 0:deb92489beec | 353 | yStart = yStop; |
dallegre | 0:deb92489beec | 354 | yStop = temp1; |
dallegre | 0:deb92489beec | 355 | } |
dallegre | 0:deb92489beec | 356 | |
dallegre | 0:deb92489beec | 357 | page1 = yStart / 8; |
dallegre | 0:deb92489beec | 358 | page2 = yStop / 8; |
dallegre | 0:deb92489beec | 359 | pageStart = yStart % 8; |
dallegre | 0:deb92489beec | 360 | |
dallegre | 0:deb92489beec | 361 | if (page1 != page2) |
dallegre | 0:deb92489beec | 362 | { |
dallegre | 0:deb92489beec | 363 | if ( pageStart > 0) |
dallegre | 0:deb92489beec | 364 | { |
dallegre | 0:deb92489beec | 365 | temp1 = 0xFF00 >> pageStart; |
dallegre | 0:deb92489beec | 366 | temp1 = temp1 ^ 0xFF; |
dallegre | 0:deb92489beec | 367 | } |
dallegre | 0:deb92489beec | 368 | else |
dallegre | 0:deb92489beec | 369 | { |
dallegre | 0:deb92489beec | 370 | temp1 = 0xFF; |
dallegre | 0:deb92489beec | 371 | } |
dallegre | 0:deb92489beec | 372 | } |
dallegre | 0:deb92489beec | 373 | else |
dallegre | 0:deb92489beec | 374 | { |
dallegre | 0:deb92489beec | 375 | temp1 = 0; |
dallegre | 0:deb92489beec | 376 | |
dallegre | 0:deb92489beec | 377 | a = yStart - (page1 * 8); |
dallegre | 0:deb92489beec | 378 | a = 0xFF00 >> a; |
dallegre | 0:deb92489beec | 379 | temp2 = temp2 ^ a; |
dallegre | 0:deb92489beec | 380 | } |
dallegre | 0:deb92489beec | 381 | |
dallegre | 0:deb92489beec | 382 | ramData1[0] = temp1; |
dallegre | 0:deb92489beec | 383 | |
dallegre | 0:deb92489beec | 384 | setAddress(page1,x); |
dallegre | 0:deb92489beec | 385 | SSD1306SendData(ramData1, 1); |
dallegre | 0:deb92489beec | 386 | |
dallegre | 0:deb92489beec | 387 | a = page1 + 1; |
dallegre | 0:deb92489beec | 388 | ramData1[0] = 0xFF; |
dallegre | 0:deb92489beec | 389 | |
dallegre | 0:deb92489beec | 390 | while (a < page2) |
dallegre | 0:deb92489beec | 391 | { |
dallegre | 0:deb92489beec | 392 | setAddress(a, x); |
dallegre | 0:deb92489beec | 393 | SSD1306SendData(ramData1, 1); |
dallegre | 0:deb92489beec | 394 | a++; |
dallegre | 0:deb92489beec | 395 | } |
dallegre | 0:deb92489beec | 396 | |
dallegre | 0:deb92489beec | 397 | temp2 = 8 - (yStop % 8); |
dallegre | 0:deb92489beec | 398 | temp2--; |
dallegre | 0:deb92489beec | 399 | temp2 = 0xFF << temp2; |
dallegre | 0:deb92489beec | 400 | |
dallegre | 0:deb92489beec | 401 | ramData2[0] = temp2; |
dallegre | 0:deb92489beec | 402 | |
dallegre | 0:deb92489beec | 403 | setAddress(page2, x); |
dallegre | 0:deb92489beec | 404 | SSD1306SendData(ramData2, 1); |
dallegre | 0:deb92489beec | 405 | } |
dallegre | 0:deb92489beec | 406 | |
dallegre | 0:deb92489beec | 407 | void imageDraw(const char IMAGE[], char row, char column) |
dallegre | 0:deb92489beec | 408 | { |
dallegre | 0:deb92489beec | 409 | char a, height, width; |
dallegre | 0:deb92489beec | 410 | |
dallegre | 0:deb92489beec | 411 | width = IMAGE[0]; |
dallegre | 0:deb92489beec | 412 | height = IMAGE[1]; |
dallegre | 0:deb92489beec | 413 | |
dallegre | 0:deb92489beec | 414 | for ( a = 0; a < height; a++) |
dallegre | 0:deb92489beec | 415 | { |
dallegre | 0:deb92489beec | 416 | setAddress(row + a, column); |
dallegre | 0:deb92489beec | 417 | SSD1306SendData((char *)IMAGE + 2 + a * width, width); |
dallegre | 0:deb92489beec | 418 | } |
dallegre | 0:deb92489beec | 419 | } |
dallegre | 0:deb92489beec | 420 | |
dallegre | 0:deb92489beec | 421 | void circleDraw(register int x, register int y, int r) |
dallegre | 0:deb92489beec | 422 | { |
dallegre | 0:deb92489beec | 423 | register int xx = -r; |
dallegre | 0:deb92489beec | 424 | register int yy = 0; |
dallegre | 0:deb92489beec | 425 | register int e = 2 - (2 * r); |
dallegre | 0:deb92489beec | 426 | do { |
dallegre | 0:deb92489beec | 427 | pixelDraw(x - xx, y + yy); |
dallegre | 0:deb92489beec | 428 | pixelDraw(x - yy, y - xx); |
dallegre | 0:deb92489beec | 429 | pixelDraw(x + xx, y - yy); |
dallegre | 0:deb92489beec | 430 | pixelDraw(x + yy, y + xx); |
dallegre | 0:deb92489beec | 431 | if(e > xx) e += ((++xx << 1) + 1); |
dallegre | 0:deb92489beec | 432 | if(e <= yy) e += ((++yy << 1) + 1); |
dallegre | 0:deb92489beec | 433 | } while (xx < 0); |
dallegre | 0:deb92489beec | 434 | } |
dallegre | 0:deb92489beec | 435 | |
dallegre | 0:deb92489beec | 436 | void Fill_RAM( char data ) |
dallegre | 0:deb92489beec | 437 | { |
dallegre | 0:deb92489beec | 438 | unsigned char i,j; |
dallegre | 0:deb92489beec | 439 | |
dallegre | 0:deb92489beec | 440 | char ramData[] = { 0x00}; |
dallegre | 0:deb92489beec | 441 | |
dallegre | 0:deb92489beec | 442 | ramData[0] = data; |
dallegre | 0:deb92489beec | 443 | |
dallegre | 0:deb92489beec | 444 | for(i=0; i < 8 ;i++) |
dallegre | 0:deb92489beec | 445 | { |
dallegre | 0:deb92489beec | 446 | setAddress(i,0); |
dallegre | 0:deb92489beec | 447 | |
dallegre | 0:deb92489beec | 448 | for(j=0; j < SSD1306_LCDWIDTH; j++) |
dallegre | 0:deb92489beec | 449 | { |
dallegre | 0:deb92489beec | 450 | SSD1306SendData(ramData, 1); |
dallegre | 0:deb92489beec | 451 | } |
dallegre | 0:deb92489beec | 452 | } |
dallegre | 0:deb92489beec | 453 | } |
dallegre | 0:deb92489beec | 454 | |
dallegre | 0:deb92489beec | 455 | void Fill_RAM_PAGE(unsigned char page, char data) |
dallegre | 0:deb92489beec | 456 | { |
dallegre | 0:deb92489beec | 457 | unsigned char j; |
dallegre | 0:deb92489beec | 458 | |
dallegre | 0:deb92489beec | 459 | char ramData[] = { 0x00 }; |
dallegre | 0:deb92489beec | 460 | |
dallegre | 0:deb92489beec | 461 | ramData[0] = data; |
dallegre | 0:deb92489beec | 462 | |
dallegre | 0:deb92489beec | 463 | setAddress(page,0); |
dallegre | 0:deb92489beec | 464 | |
dallegre | 0:deb92489beec | 465 | for(j=0; j < SSD1306_LCDWIDTH ;j++) |
dallegre | 0:deb92489beec | 466 | { |
dallegre | 0:deb92489beec | 467 | SSD1306SendData(ramData, 1); |
dallegre | 0:deb92489beec | 468 | } |
dallegre | 0:deb92489beec | 469 | } |
dallegre | 0:deb92489beec | 470 | |
dallegre | 0:deb92489beec | 471 | void Set_Contrast_Control(unsigned char d) |
dallegre | 0:deb92489beec | 472 | { |
dallegre | 0:deb92489beec | 473 | char ramData[] = {SSD1306_SETCONTRAST, 0x00}; |
dallegre | 0:deb92489beec | 474 | ramData[1] = d; |
dallegre | 0:deb92489beec | 475 | |
dallegre | 0:deb92489beec | 476 | SSD1306SendCommand(ramData, 2); |
dallegre | 0:deb92489beec | 477 | } |
dallegre | 0:deb92489beec | 478 | |
dallegre | 0:deb92489beec | 479 | void Set_Inverse_Display(unsigned char d) |
dallegre | 0:deb92489beec | 480 | { |
dallegre | 0:deb92489beec | 481 | // 0 = normal, 1 = inverted |
dallegre | 0:deb92489beec | 482 | |
dallegre | 0:deb92489beec | 483 | char ramData[] = {SSD1306_NORMALDISPLAY}; |
dallegre | 0:deb92489beec | 484 | ramData[0] = ramData[0] + d; |
dallegre | 0:deb92489beec | 485 | |
dallegre | 0:deb92489beec | 486 | SSD1306SendCommand(ramData, 1); |
dallegre | 0:deb92489beec | 487 | } |
dallegre | 0:deb92489beec | 488 | |
dallegre | 0:deb92489beec | 489 | void Set_Display_On_Off(unsigned char d) |
dallegre | 0:deb92489beec | 490 | { |
dallegre | 0:deb92489beec | 491 | // 0 = off, 1 = on |
dallegre | 0:deb92489beec | 492 | |
dallegre | 0:deb92489beec | 493 | char ramData[] = {SSD1306_DISPLAYOFF}; |
dallegre | 0:deb92489beec | 494 | ramData[0] = ramData[0] + d; |
dallegre | 0:deb92489beec | 495 | |
dallegre | 0:deb92489beec | 496 | SSD1306SendCommand(ramData, 1); |
dallegre | 0:deb92489beec | 497 | } |
dallegre | 0:deb92489beec | 498 |