mirror of
https://github.com/adafruit/Adafruit_SSD1306.git
synced 2026-07-27 20:05:50 +00:00
everything works, but theres a few optimizations that can be fixed. it now 'acts' like a ks0108 in terms of orientation
This commit is contained in:
+166
-227
@@ -9,87 +9,91 @@
|
||||
|
||||
#include "SSD1306.h"
|
||||
|
||||
uint8_t is_reversed = 0;
|
||||
static uint8_t is_reversed = 0;
|
||||
|
||||
// a handy reference to where the pages are on the screen
|
||||
const uint8_t pagemap[] = { 3, 2, 1, 0, 7, 6, 5, 4 };
|
||||
const uint8_t pagemap[] = { 0, 1, 2, 3, 4, 5, 6, 7};
|
||||
|
||||
// a 5x7 font table
|
||||
extern uint8_t PROGMEM font[];
|
||||
|
||||
// the memory buffer for the LCD
|
||||
static uint8_t buffer[1024] = {
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x3, 0x7, 0xF, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x7F, 0x3F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x1F, 0x3F, 0x70, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x6, 0x0, 0x0, 0x0, 0x3, 0x3,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0XC0, 0XE0, 0XF0, 0XF8, 0XF8, 0XCF, 0XCF, 0XCF, 0XCF, 0XE0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0XFE, 0XFC, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0XF8, 0XFC, 0XE, 0XE, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X60, 0X60, 0X0, 0X0, 0X0, 0XC0, 0XC0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
|
||||
0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xF, 0x7, 0x7,
|
||||
0x7, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xF, 0x3F,
|
||||
0x70, 0x60, 0x60, 0x60, 0x60, 0x30, 0x7F, 0x3F, 0x0, 0x0, 0x1F, 0x3F, 0x70, 0x60, 0x60, 0x60,
|
||||
0x60, 0x39, 0xFF, 0xFF, 0x0, 0x6, 0x1F, 0x39, 0x60, 0x60, 0x60, 0x60, 0x30, 0x3F, 0x7F, 0x0,
|
||||
0x0, 0x60, 0xFF, 0xFF, 0x60, 0x60, 0x0, 0x7F, 0x7F, 0x70, 0x60, 0x60, 0x40, 0x0, 0x7F, 0x7F,
|
||||
0x0, 0x0, 0x0, 0x0, 0x7F, 0x7F, 0x0, 0x0, 0x0, 0x7F, 0x7F, 0x0, 0x0, 0x60, 0xFF, 0xFF,
|
||||
0x60, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF8, 0XF0, 0XE0, 0XE0,
|
||||
0XE0, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7C, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0XF0, 0XFC,
|
||||
0XE, 0X6, 0X6, 0X6, 0X6, 0XC, 0XFE, 0XFC, 0X0, 0X0, 0XF8, 0XFC, 0XE, 0X6, 0X6, 0X6,
|
||||
0X6, 0X9C, 0XFF, 0XFF, 0X0, 0X60, 0XF8, 0X9C, 0X6, 0X6, 0X6, 0X6, 0XC, 0XFC, 0XFE, 0X0,
|
||||
0X0, 0X6, 0XFF, 0XFF, 0X6, 0X6, 0X0, 0XFE, 0XFE, 0XE, 0X6, 0X6, 0X2, 0X0, 0XFE, 0XFE,
|
||||
0X0, 0X0, 0X0, 0X0, 0XFE, 0XFE, 0X0, 0X0, 0X0, 0XFE, 0XFE, 0X0, 0X0, 0X6, 0XFF, 0XFF,
|
||||
0X6, 0X6, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
|
||||
0x80, 0xF8, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xE7, 0xE7, 0xE3,
|
||||
0xF3, 0xF9, 0xFF, 0xFF, 0xFF, 0xF7, 0x7, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF,
|
||||
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x0, 0x0, 0x0, 0xC0,
|
||||
0xE0, 0x60, 0x20, 0x20, 0x60, 0xE0, 0xE0, 0xE0, 0x0, 0x0, 0x80, 0xC0, 0xE0, 0x60, 0x20, 0x60,
|
||||
0x60, 0xE0, 0xE0, 0xE0, 0x0, 0x0, 0x80, 0xC0, 0x60, 0x60, 0x20, 0x60, 0x60, 0xE0, 0xE0, 0x0,
|
||||
0x0, 0x0, 0xE0, 0xE0, 0x0, 0x0, 0x0, 0xE0, 0xE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xE0,
|
||||
0x60, 0x60, 0x60, 0x60, 0xE0, 0x80, 0x0, 0x0, 0x0, 0xE0, 0xE0, 0x0, 0x0, 0x0, 0xE0, 0xE0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0X1, 0X1F, 0X3F, 0X7F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XE7, 0XE7, 0XC7,
|
||||
0XCF, 0X9F, 0XFF, 0XFF, 0XFF, 0XEF, 0XE0, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0F, 0XFF,
|
||||
0XFE, 0XFE, 0XFE, 0XFE, 0XFE, 0XFE, 0XFC, 0XFC, 0XF8, 0XF0, 0XE0, 0XC0, 0X0, 0X0, 0X0, 0X3,
|
||||
0X7, 0X6, 0X4, 0X4, 0X6, 0X7, 0X7, 0X7, 0X0, 0X0, 0X1, 0X3, 0X7, 0X6, 0X4, 0X6,
|
||||
0X6, 0X7, 0X7, 0X7, 0X0, 0X0, 0X1, 0X3, 0X6, 0X6, 0X4, 0X6, 0X6, 0X7, 0X7, 0X0,
|
||||
0X0, 0X0, 0X7, 0X7, 0X0, 0X0, 0X0, 0X7, 0X7, 0X0, 0X0, 0X0, 0X0, 0X0, 0X1, 0X7,
|
||||
0X6, 0X6, 0X6, 0X6, 0X7, 0X1, 0X0, 0X0, 0X0, 0X7, 0X7, 0X0, 0X0, 0X0, 0X7, 0X7,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
|
||||
0x0, 0x0, 0x0, 0x3, 0x7, 0x1F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF1, 0xE3,
|
||||
0xE3, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFC, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xE0, 0x80, 0x0, 0x0, 0x0, 0xC,
|
||||
0x1C, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7F, 0x7F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x7, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C, 0xC, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0X0, 0X0, 0X0, 0XC0, 0XE0, 0XF8, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0X8F, 0XC7,
|
||||
0XC7, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XF, 0X3F, 0XFE, 0XFC, 0XFC, 0XFC, 0XFC, 0XFE, 0XFF, 0XFF,
|
||||
0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0X3F, 0XF, 0X7, 0X1, 0X0, 0X0, 0X0, 0X30,
|
||||
0X38, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0XFE, 0XFE, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0XE0, 0XE0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X38, 0X30, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
|
||||
0x0, 0x7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0xF8,
|
||||
0xF8, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF,
|
||||
0xFF, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xE0, 0xC0, 0xC0, 0xC0, 0xFF, 0x7F, 0x0, 0x0, 0x1E, 0x7F,
|
||||
0xE1, 0xC0, 0xC0, 0xC0, 0xC0, 0x61, 0xFF, 0xFF, 0x0, 0x0, 0xFE, 0xFF, 0x1, 0x0, 0x0, 0x0,
|
||||
0xFF, 0xFF, 0x0, 0x0, 0x21, 0xF9, 0xF8, 0xDC, 0xCC, 0xCF, 0x7, 0x0, 0xC0, 0xFF, 0xFF, 0xC0,
|
||||
0x80, 0x0, 0xFF, 0xFF, 0xC0, 0xC0, 0x80, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x0, 0x1F, 0x7F, 0xF9,
|
||||
0xC8, 0xC8, 0xC8, 0xC8, 0x79, 0x39, 0x0, 0x0, 0x71, 0xF9, 0xD8, 0xCC, 0xCE, 0x47, 0x3, 0x0,
|
||||
0X0, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0X7F, 0X7F, 0X7F, 0X3F, 0X1F,
|
||||
0X1F, 0XF, 0X7F, 0XFF, 0XFF, 0XFF, 0XFE, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0XFF,
|
||||
0XFF, 0X0, 0X0, 0X0, 0XFF, 0XFF, 0X7, 0X3, 0X3, 0X3, 0XFF, 0XFE, 0X0, 0X0, 0X78, 0XFE,
|
||||
0X87, 0X3, 0X3, 0X3, 0X3, 0X86, 0XFF, 0XFF, 0X0, 0X0, 0X7F, 0XFF, 0X80, 0X0, 0X0, 0X0,
|
||||
0XFF, 0XFF, 0X0, 0X0, 0X84, 0X9F, 0X1F, 0X3B, 0X33, 0XF3, 0XE0, 0X0, 0X3, 0XFF, 0XFF, 0X3,
|
||||
0X1, 0X0, 0XFF, 0XFF, 0X3, 0X3, 0X1, 0X0, 0X0, 0XFF, 0XFF, 0X0, 0X0, 0XF8, 0XFE, 0X9F,
|
||||
0X13, 0X13, 0X13, 0X13, 0X9E, 0X9C, 0X0, 0X0, 0X8E, 0X9F, 0X1B, 0X33, 0X73, 0XE2, 0XC0, 0X0,
|
||||
|
||||
0x0, 0x0, 0x0, 0x0, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xC0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xC0,
|
||||
0xC0, 0x0, 0x0, 0x0, 0xC0, 0xC0, 0x0, 0x0, 0x0, 0x0, 0xC0, 0xC0, 0x0, 0x0, 0x0, 0x80,
|
||||
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0xC0, 0xC0, 0x0, 0x0, 0x0, 0x80, 0xC0, 0xC0, 0xC0, 0xC0,
|
||||
0xC0, 0x80, 0x0, 0x0, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0, 0x0, 0x0, 0xC0, 0xC0, 0x0,
|
||||
0x0, 0x0, 0xC0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xC0, 0xC0, 0x0, 0x0, 0x0, 0x80, 0xC0,
|
||||
0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x0, 0x0, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x0, 0x0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X1, 0X1, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X1, 0X3, 0X7, 0XF, 0X1F, 0X1F, 0X3F, 0X3F, 0X3F, 0X3F, 0X1F, 0XF, 0X3,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X3,
|
||||
0X3, 0X0, 0X0, 0X0, 0X3, 0X3, 0X0, 0X0, 0X0, 0X0, 0X3, 0X3, 0X0, 0X0, 0X0, 0X1,
|
||||
0X3, 0X3, 0X3, 0X3, 0X3, 0X1, 0X3, 0X3, 0X0, 0X0, 0X0, 0X1, 0X3, 0X3, 0X3, 0X3,
|
||||
0X3, 0X1, 0X0, 0X0, 0X1, 0X3, 0X3, 0X3, 0X3, 0X3, 0X0, 0X0, 0X0, 0X3, 0X3, 0X0,
|
||||
0X0, 0X0, 0X3, 0X1, 0X0, 0X0, 0X0, 0X0, 0X0, 0X3, 0X3, 0X0, 0X0, 0X0, 0X1, 0X3,
|
||||
0X3, 0X3, 0X3, 0X3, 0X1, 0X1, 0X0, 0X0, 0X1, 0X3, 0X3, 0X3, 0X3, 0X1, 0X0, 0X0,
|
||||
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0, 0X0,
|
||||
|
||||
|
||||
};
|
||||
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,};
|
||||
|
||||
|
||||
void SSD1306::drawbitmap(uint8_t x, uint8_t y,
|
||||
@@ -109,11 +113,11 @@ void SSD1306::drawstring(uint8_t x, uint8_t line, char *c) {
|
||||
drawchar(x, line, c[0]);
|
||||
c++;
|
||||
x += 6; // 6 pixels wide
|
||||
if (x + 6 >= LCDWIDTH) {
|
||||
if (x + 6 >= SSD1306_LCDWIDTH) {
|
||||
x = 0; // ran out of this line
|
||||
line++;
|
||||
}
|
||||
if (line >= (LCDHEIGHT/8))
|
||||
if (line >= (SSD1306_LCDHEIGHT/8))
|
||||
return; // ran out of space :(
|
||||
}
|
||||
|
||||
@@ -194,7 +198,7 @@ void SSD1306::drawrect(uint8_t x, uint8_t y, uint8_t w, uint8_t h,
|
||||
}
|
||||
|
||||
// draw a circle outline
|
||||
void SD1306::drawcircle(uint8_t x0, uint8_t y0, uint8_t r,
|
||||
void SSD1306::drawcircle(uint8_t x0, uint8_t y0, uint8_t r,
|
||||
uint8_t color) {
|
||||
int8_t f = 1 - r;
|
||||
int8_t ddF_x = 1;
|
||||
@@ -265,184 +269,138 @@ void SSD1306::fillcircle(uint8_t x0, uint8_t y0, uint8_t r,
|
||||
|
||||
// the most basic function, set a single pixel
|
||||
void SSD1306::setpixel(uint8_t x, uint8_t y, uint8_t color) {
|
||||
if ((x >= LCDWIDTH) || (y >= LCDHEIGHT))
|
||||
if ((x >= SSD1306_LCDWIDTH) || (y >= SSD1306_LCDHEIGHT))
|
||||
return;
|
||||
|
||||
// x is which column
|
||||
if (color)
|
||||
buffer[x+ (y/8)*128] |= _BV(7-(y%8));
|
||||
if (color == WHITE)
|
||||
buffer[x+ (y/8)*128] |= _BV((y%8));
|
||||
else
|
||||
buffer[x+ (y/8)*128] &= ~_BV(7-(y%8));
|
||||
buffer[x+ (y/8)*128] &= ~_BV((y%8));
|
||||
}
|
||||
|
||||
|
||||
void SSD1306::ssd1306_init(void) {
|
||||
void SSD1306::ssd1306_init(uint8_t vccstate) {
|
||||
// set pin directions
|
||||
pinMode(sid, OUTPUT);
|
||||
pinMode(sclk, OUTPUT);
|
||||
pinMode(a0, OUTPUT);
|
||||
pinMode(dc, OUTPUT);
|
||||
pinMode(rst, OUTPUT);
|
||||
pinMode(cs, OUTPUT);
|
||||
|
||||
// toggle RST low to reset; CS low so it'll listen to us
|
||||
if (cs > 0)
|
||||
digitalWrite(cs, LOW);
|
||||
|
||||
digitalWrite(rst, LOW);
|
||||
_delay_ms(500);
|
||||
digitalWrite(rst, HIGH);
|
||||
// VDD (3.3V) goes high at start, lets just chill for a ms
|
||||
delay(1);
|
||||
// bring0xset low
|
||||
digitalWrite(rst, LOW);
|
||||
// wait 10ms
|
||||
delay(10);
|
||||
// bring out of reset
|
||||
digitalWrite(rst, HIGH);
|
||||
// turn on VCC (9V?)
|
||||
|
||||
// LCD bias select
|
||||
ssd1306_command(CMD_SET_BIAS_7);
|
||||
// ADC select
|
||||
ssd1306_command(CMD_SET_ADC_NORMAL);
|
||||
// SHL select
|
||||
ssd1306_command(CMD_SET_COM_NORMAL);
|
||||
// Initial display line
|
||||
ssd1306_command(CMD_SET_DISP_START_LINE);
|
||||
ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
|
||||
ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
|
||||
ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
|
||||
|
||||
ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
|
||||
|
||||
// turn on voltage converter (VC=1, VR=0, VF=0)
|
||||
ssd1306_command(CMD_SET_POWER_CONTROL | 0x4);
|
||||
// wait for 50% rising
|
||||
_delay_ms(50);
|
||||
ssd1306_command(SSD1306_SETCONTRAST); // 0x81
|
||||
if (vccstate == SSD1306_EXTERNALVCC) {
|
||||
ssd1306_command(0x9F); // external 9V
|
||||
} else {
|
||||
ssd1306_command(0xCF); // chargepump
|
||||
}
|
||||
|
||||
ssd1306_command(0xa1); // setment remap 95 to 0 (?)
|
||||
|
||||
// turn on voltage regulator (VC=1, VR=1, VF=0)
|
||||
ssd1306_command(CMD_SET_POWER_CONTROL | 0x6);
|
||||
// wait >=50ms
|
||||
_delay_ms(50);
|
||||
ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6
|
||||
|
||||
// turn on voltage follower (VC=1, VR=1, VF=1)
|
||||
ssd1306_command(CMD_SET_POWER_CONTROL | 0x7);
|
||||
// wait
|
||||
_delay_ms(10);
|
||||
ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
|
||||
|
||||
// set lcd operating voltage (regulator resistor, ref voltage resistor)
|
||||
ssd1306_command(CMD_SET_RESISTOR_RATIO | 0x6);
|
||||
ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8
|
||||
ssd1306_command(0x3F); // 0x3F 1/64 duty
|
||||
|
||||
ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3
|
||||
ssd1306_command(0x0); // no offset
|
||||
|
||||
ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
|
||||
ssd1306_command(0x80); // the suggested ratio 0x80
|
||||
|
||||
ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
|
||||
if (vccstate == SSD1306_EXTERNALVCC) {
|
||||
ssd1306_command(0x22); // external 9V
|
||||
} else {
|
||||
ssd1306_command(0xF1); // DC/DC
|
||||
}
|
||||
|
||||
ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
|
||||
ssd1306_command(0x12); // disable COM left/right remap
|
||||
|
||||
ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB
|
||||
ssd1306_command(0x40); // 0x20 is default?
|
||||
|
||||
// initial display line
|
||||
// set page address
|
||||
// set column address
|
||||
// write display data
|
||||
ssd1306_command(SSD1306_MEMORYMODE); // 0x20
|
||||
ssd1306_command(0x00); // 0x0 act like ks0108
|
||||
|
||||
// left to right scan
|
||||
ssd1306_command(SSD1306_SEGREMAP | 0x1);
|
||||
|
||||
ssd1306_command(SSD1306_COMSCANDEC);
|
||||
|
||||
ssd1306_command(SSD1306_CHARGEPUMP); //0x8D
|
||||
if (vccstate == SSD1306_EXTERNALVCC) {
|
||||
ssd1306_command(0x10); // disable
|
||||
} else {
|
||||
ssd1306_command(0x14); // disable
|
||||
}
|
||||
ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel
|
||||
}
|
||||
|
||||
|
||||
void SSD1306::invert(uint8_t i) {
|
||||
if (i) {
|
||||
ssd1306_command(SSD1306_INVERTDISPLAY);
|
||||
} else {
|
||||
ssd1306_command(SSD1306_NORMALDISPLAY);
|
||||
}
|
||||
}
|
||||
|
||||
inline void SSD1306::spiwrite(uint8_t c) {
|
||||
shiftOut(sid, sclk, MSBFIRST, c);
|
||||
/*
|
||||
int8_t i;
|
||||
for (i=7; i>=0; i--) {
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(i))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
// loop unwrapped! too fast doesnt work :(
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(7))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(6))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(5))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(4))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(3))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(2))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(1))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
|
||||
SCLK_PORT &= ~_BV(SCLK);
|
||||
if (c & _BV(0))
|
||||
SID_PORT |= _BV(SID);
|
||||
else
|
||||
SID_PORT &= ~_BV(SID);
|
||||
SCLK_PORT |= _BV(SCLK);
|
||||
*/
|
||||
|
||||
}
|
||||
void SSD1306::ssd1306_command(uint8_t c) {
|
||||
digitalWrite(a0, LOW);
|
||||
|
||||
void SSD1306::ssd1306_command(uint8_t c) {
|
||||
digitalWrite(cs, HIGH);
|
||||
digitalWrite(dc, LOW);
|
||||
digitalWrite(cs, LOW);
|
||||
spiwrite(c);
|
||||
digitalWrite(cs, HIGH);
|
||||
}
|
||||
|
||||
void SSD1306::ssd1306_data(uint8_t c) {
|
||||
digitalWrite(a0, HIGH);
|
||||
|
||||
digitalWrite(cs, HIGH);
|
||||
digitalWrite(dc, HIGH);
|
||||
digitalWrite(cs, LOW);
|
||||
spiwrite(c);
|
||||
digitalWrite(cs, HIGH);
|
||||
}
|
||||
|
||||
void SSD1306::ssd1306_set_brightness(uint8_t val) {
|
||||
ssd1306_command(CMD_SET_VOLUME_FIRST);
|
||||
ssd1306_command(CMD_SET_VOLUME_SECOND | (val & 0x3f));
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SSD1306::display(void) {
|
||||
uint8_t c, p;
|
||||
ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
|
||||
ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
|
||||
ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
|
||||
|
||||
for(p = 0; p < 8; p++) {
|
||||
/*
|
||||
putstring("new page! ");
|
||||
uart_putw_dec(p);
|
||||
putstring_nl("");
|
||||
*/
|
||||
|
||||
ssd1306_command(CMD_SET_PAGE | pagemap[p]);
|
||||
ssd1306_command(CMD_SET_COLUMN_LOWER | (0x0 & 0xf));
|
||||
ssd1306_command(CMD_SET_COLUMN_UPPER | ((0x0 >> 4) & 0xf));
|
||||
ssd1306_command(CMD_RMW);
|
||||
ssd1306_data(0xff);
|
||||
|
||||
//ssd1306_data(0x80);
|
||||
//continue;
|
||||
|
||||
for(c = 0; c < 128; c++) {
|
||||
//uart_putw_dec(c);
|
||||
//uart_putchar(' ');
|
||||
ssd1306_data(buffer[(128*p)+c]);
|
||||
}
|
||||
for (uint16_t i=0; i<1024; i++) {
|
||||
ssd1306_data(buffer[i]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// clear everything
|
||||
@@ -450,25 +408,6 @@ void SSD1306::clear(void) {
|
||||
memset(buffer, 0, 1024);
|
||||
}
|
||||
|
||||
|
||||
// this doesnt touch the buffer, just clears the display RAM - might be handy
|
||||
void SSD1306::clear_display(void) {
|
||||
uint8_t p, c;
|
||||
|
||||
for(p = 0; p < 8; p++) {
|
||||
/*
|
||||
putstring("new page! ");
|
||||
uart_putw_dec(p);
|
||||
putstring_nl("");
|
||||
*/
|
||||
|
||||
ssd1306_command(CMD_SET_PAGE | p);
|
||||
for(c = 0; c < 129; c++) {
|
||||
//uart_putw_dec(c);
|
||||
//uart_putchar(' ');
|
||||
ssd1306_command(CMD_SET_COLUMN_LOWER | (c & 0xf));
|
||||
ssd1306_command(CMD_SET_COLUMN_UPPER | ((c >> 4) & 0xf));
|
||||
ssd1306_data(0x0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user