/* Program 12-1 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. */ #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 */ }