/* OLED_SSD1306 via I2C * * This program communicate with the OLED_SSD1306 via I2C. * It writes "ABC" on the display and fills the rest of the * display with a checker board pattern. * * This program uses Wire library. For details of libraries: * http://energia.nu/reference/libraries/ * * Energia 1.6.10E18 */ #include "Wire.h" #define SLAVE_ADDR 0x3C // 0111 100. #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define SCREEN_PAGE_NUM (SCREEN_HEIGHT / 8) const static char font_table[][6] = { /* sample font table */ {0x7e, 0x11, 0x11, 0x11, 0x7e, 0}, /* A */ {0x7f, 0x49, 0x49, 0x49, 0x36, 0}, /* B */ {0x3e, 0x41, 0x41, 0x41, 0x22, 0}}; /* C */ void setup() { int i, j, k; Wire.begin(); SSD1306_init(); SSD1306_command(0x22); /* set page */ SSD1306_command(0x00); /* starting page */ SSD1306_command(0x00); /* end page */ SSD1306_command(0x21); /* set column */ SSD1306_command(0); /* starting column */ SSD1306_command(SCREEN_WIDTH-1); /* end column */ /* write ABC at the beginning of first line */ for (j = 0; j < 3; j++) for (i = 0; i < 6; i++) SSD1306_data(font_table[j][i]); /* clear the rest of the line */ for (i = 0; i < SCREEN_WIDTH-3*6; i++) SSD1306_data(0); for (i = 1; i < SCREEN_PAGE_NUM; i++) { SSD1306_command(0x22); /* set page */ SSD1306_command(i); /* starting page */ SSD1306_command(i); /* end page */ SSD1306_command(0x21); /* set column */ SSD1306_command(0); /* starting column */ SSD1306_command(SCREEN_WIDTH-1); /* end column */ /* make checker board pattern */ for (j = 0; j < SCREEN_WIDTH/8; j++) { for (k = 0; k < 4; k++) SSD1306_data(0xF0); for (k = 0; k < 4; k++) SSD1306_data(0x0F); } } } void loop() { // put your main code here, to run repeatedly: } const static char init_seq[] = { 0xae, // turn off oled panel 0x00, // set low column address 0x10, // set high column address 0x40, // set start line address 0x20, 0x02, // page addressing mode 0xc8, // top-down segment (4th quadrant) 0x81, // set contrast control register 0xcf, 0xa1, // set segment re-map 95 to 0 0xa6, // set normal display 0xa8, // set multiplex ratio(1 to 64) 0x3f, // 1/64 duty 0xd3, // set display offset 0x00, // not offset 0xd5, // set display clock divide ratio/oscillator frequency 0x80, // set divide ratio 0xd9, // set pre-charge period 0xf1, 0xda, // set com pins hardware configuration 0x12, 0xdb, // set vcomh 0x40, 0x8d, // set Charge Pump enable/disable 0x14, // set(0x10) disable 0xaf // turn on oled panel }; void SSD1306_init(void) { int i; delay(100); for (i = 0; i < sizeof(init_seq); i++) SSD1306_command(init_seq[i]); } void SSD1306_data(char data) { Wire.beginTransmission(SLAVE_ADDR); // start Wire.write(0xC0); // send command Wire.write(data); // send data Wire.endTransmission(); // stop } void SSD1306_command(char command) { Wire.beginTransmission(SLAVE_ADDR); // start Wire.write(0x80); // send command Wire.write(command); // send command Wire.endTransmission(); // stop }