Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

PIC: SSD1306

Compartilhe:

PIC: SSD1306




SSD1306 é um controlador para display OLED. Este display pode ser encontrado no Mercado Livre, possui uma resolução de 128x64 pixels e tem o mesmo tamanho de uma moeda de 1 real.


Comunica-se através do barramento I2C, por isso utiliza apenas dois fios ( Clock e Data ).

CARACTERÍSTICAS
  • Resolução de 128x64 pixels;
  • Tensão de alimentação: 3.3V ou 5V ( O display que eu comprei no Mercado Livre suporta esta tensão. Verifique se o seu display também suporta ).
  • Contraste ajustável;

FUNCIONAMENTO
A interface I2C com o display consiste no envio de um endereço ( 0b011110XY ), na qual o bit X corresponde ao endereço do display ( 0 ou 1 ). Na parte de trás do display há um jumper com um pingo de solda, selecionando por padrão o endereço 0. Com isso, você é capaz de ligar até dois displays no mesmo barramento. O bit Y informa se a operação será de escrita(0) ou leitura(1). Após isso, é necessário enviar no mínimo dois bytes ( um de comando e outro de dado ). O byte de comando ( 0bXY000000 ) é composto pelo bit X que, uma vez setado, você poderá enviar n dados na sequência. O bit Y quando for igual a 1, diz que o próximo dado corresponde a um comando interno do display. Quando for igual à 0, diz que o próximo dado corresponde a uma carácter, por exemplo, que é gravado na GDDRAM ( memoria utilizada pelo display para exibir as informações na tela ).

CÓDIGO DA BIBLIOTECA
MikroC PRO PIC
/*
SSD1306 - Display monocromático OLED 128x64
Autor: Tiago
Compilador: MikroC PRO PIC
Criado em: 26/12/2014 por Tiago
*/
/* Fundamental Command */
#define SSD1306_SETCONTRAST 0x81
#define SSD1306_ENTIREDISPLAYON_RESUME 0xA4
#define SSD1306_ENTIREDISPLAYON 0xA5
#define SSD1306_NORMALDISPLAY 0xA6
#define SSD1306_INVERTDISPLAY 0xA7
#define SSD1306_DISPLAYOFF 0xAE
#define SSD1306_DISPLAYON 0xAF
/* Scrolling Command */
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
#define SSD1306_DEACTIVATE_SCROLL 0x2E
#define SSD1306_ACTIVATE_SCROLL 0x2F
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
/* Addressing Setting Command */
#define SSD1306_SETLOWCOLUMN 0x00
#define SSD1306_SETHIGHCOLUMN 0x10
#define SSD1306_MEMORYMODE 0x20
#define SSD1306_COLUMNADDR 0x21
#define SSD1306_PAGEADDR 0x22
#define SSD1306_PAGESTARTADDR 0xB0
/* Hardware Configuration (Panel resolution and layout related) Command */
#define SSD1306_SETSTARTLINE 0x40
#define SSD1306_SEGREMAP 0xA0
#define SSD1306_SETMULTIPLEXRATIO 0xA8
#define SSD1306_COMSCANINC 0xC0
#define SSD1306_COMSCANDEC 0xC8
#define SSD1306_SETDISPLAYOFFSET 0xD3
#define SSD1306_SETCOMPINS 0xDA
/* Timing and Driving Scheme Setting Command */
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
#define SSD1306_SETPRECHARGE 0xD9
#define SSD1306_SETVCOMDETECT 0xDB
#define SSD1306_NOP 0xE3
#define SSD1306_CHARGEPUMP 0x8D
#define SSD1306_EXTERNALVCC 0x1
#define SSD1306_SWITCHCAPVCC 0x2
#define SSD1306_CL_WHITE 0
#define SSD1306_CL_BLACK 1
/* Rotinas */
void SSD1306_Init();
void SSD1306_Cmd( char wData );
void SSD1306_Data( char wData );
void SSD1306_Chr( char character, char color );
void SSD1306_Chr8( char row, char col, char wChar, char color );
void SSD1306_Chr16( char row, char col, char wChar, char color );
void SSD1306_Out8( char row, char col, char *texto, char color );
void SSD1306_Out16( char row, char col, char *texto, char color );
void SSD1306_Set_Cursor( char row, char col );
void SSD1306_Set_Contrast( char value );
#define SSD1306_Clear() SSD1306_Fill( 0 )
//https://bitbucket.org/tinusaur/ssd1306xled/src/d467de1d216d/ssd1306xled/?at=default
const code char SSD1306_Font8x16[][16] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,// ! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,// # 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,// $ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,// % 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,// & 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// ' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,// ( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,// ) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,// * 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,// + 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,// , 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,// - 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,// . 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,// / 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,// 0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,// 1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,// 2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,// 3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,// 4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,// 5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,// 6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,// 7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,// 8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,// 9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,// : 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,// ; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,// < 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,// = 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,// > 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,// ? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,// @ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,// A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,// B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,// C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,// D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,// E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,// F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,// G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,// H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,// I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,// J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,// K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,// L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,// M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,// N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,// O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,// P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,// Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,// R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,// S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,// T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,// U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,// V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,// W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,// X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,// Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,// Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,// [ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,// \ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,// ] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// ^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,// _ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// ` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,// a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,// b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,// c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,// d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,// e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,// f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,// g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,// h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,// i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,// j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,// k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,// l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,// m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,// n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,// o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,// p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,// q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,// r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,// s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,// t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,// u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,// v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,// w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,// x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,// y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,// z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,// { 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,// | 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,// } 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// ~ 94
};
const code char SSD1306_Font8x8[][8] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00,
0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00,
0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00,
0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00,
0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00,
0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00,
0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00,
0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00,
0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00,
0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00,
0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,
0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00,
0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00,
0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00,
0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00,
0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00,
0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00,
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,
0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00,
0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00,
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,
0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,
0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00,
0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00,
0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,
0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00,
0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00,
0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00,
0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00,
0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00,
0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00,
0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00,
0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00,
0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00,
0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00,
0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00,
0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00,
0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00,
0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00,
0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00,
0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00,
0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00,
0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00,
0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00,
0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00,
0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00,
0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00,
0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00,
0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00,
0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00,
0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00,
0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00,
0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00,
0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00,
0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00,
0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00,
0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00,
0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00,
0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00,
0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00,
0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00,
0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00,
0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00,
0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00,
0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00,
0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00,
0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00,
0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00,
0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00,
0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00,
0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00,
0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00,
0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00,
0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00,
0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00,
0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00,
0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00,
0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00,
0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00,
0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00,
0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00,
0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00,
0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00,
0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,
0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00,
0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00,
0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00
};
/* Envia um comando */
void SSD1306_Cmd( char wData )
{
Soft_I2C_Start(); //Sinal de start
Soft_I2C_Write( 0x78 ); //Envia o endereço do display
Soft_I2C_Write( 0x00 ); //Control Byte
Soft_I2C_Write( wData ); //Comando
Soft_I2C_Stop(); //Sinal de stop
}
/* Envia um dado */
void SSD1306_Data( char wData )
{
Soft_I2C_Start(); //Sinal de start
Soft_I2C_Write( 0x78 ); //Envia o endereço do display
Soft_I2C_Write( 0b1100000 ); //Control Byte
Soft_I2C_Write( wData ); //Dado
Soft_I2C_Stop(); //Sinal de stop
}
/* Inicializa o display */
void SSD1306_Init()
{
SSD1306_Cmd( SSD1306_DISPLAYOFF ); //Display Off
/* MUITO IMPORTANTE!!! */
SSD1306_Cmd( SSD1306_SETMULTIPLEXRATIO ); //Multiplex Ratio
SSD1306_Cmd( 0x3F );
SSD1306_Cmd( SSD1306_SETDISPLAYOFFSET ); //Display Offset
SSD1306_Cmd( 0x00 );
SSD1306_Cmd( SSD1306_SETSTARTLINE ); //Display Start Line
SSD1306_Cmd( SSD1306_SEGREMAP | 1 );
SSD1306_Cmd( SSD1306_COMSCANDEC ); //COM Output Scan Direction
SSD1306_Cmd( SSD1306_SETCOMPINS ); //COM Pins Hardware Configuration
SSD1306_Cmd( 0x12 );
SSD1306_Cmd( SSD1306_SETCONTRAST ); //Contrast Control
SSD1306_Cmd( 255 );
SSD1306_Cmd( SSD1306_ENTIREDISPLAYON_RESUME ); //Entire Display On/Off
SSD1306_Cmd( SSD1306_NORMALDISPLAY ); //Normal/Inverse Display
SSD1306_Cmd( SSD1306_SETDISPLAYCLOCKDIV ); //Display Clock Divide Ratio/Oscillator Frequency
SSD1306_Cmd( 0x80 );
SSD1306_Cmd( SSD1306_SETPRECHARGE ); //Pre-Charge Period
SSD1306_Cmd( 0x25 );
SSD1306_Cmd( SSD1306_SETVCOMDETECT ); //VCOMH Deselect Level
SSD1306_Cmd( 0x20 );
/* MUITO IMPORTANTE!!! */
SSD1306_Cmd( SSD1306_PAGEADDR );
SSD1306_Cmd( 0 );
SSD1306_Cmd( 7 );
/* posicao inicial do cursor */
SSD1306_Cmd( 0xB0 );
SSD1306_Cmd( 0x10 );
SSD1306_Cmd( 0x00 );
SSD1306_Cmd( SSD1306_MEMORYMODE );
SSD1306_Cmd( 2 );
SSD1306_Cmd( SSD1306_CHARGEPUMP ); //Charge Pump
SSD1306_Cmd( 0x14 ); //Enable Charge Pump
SSD1306_Cmd( SSD1306_DISPLAYON ); //Display On
}
/* Define a posição do cursor */
void SSD1306_Set_Cursor( char row, char col )
{
SSD1306_Cmd( SSD1306_PAGESTARTADDR | row ); //Define a posicao da linha
SSD1306_Cmd( ( SSD1306_SETHIGHCOLUMN | ( col >> 4 ) ) ); //Define o nibble MSB da posição da coluna
SSD1306_Cmd( ( 0x0f & col ) ); //Difne o nibble LSB da posição da coluna
}
/* Define o constraste do display */
void SSD1306_Set_Contrast( char value )
{
SSD1306_Cmd( SSD1306_SETCONTRAST ); //Envia o comando para alterar o contraste
SSD1306_Cmd( value ); //Define o novo valor do constraste
}
/* Escreve um caracter 8x8 na posição atual do cursor */
void SSD1306_Chr( char wChar, char color )
{
char i;
wChar = wChar - 0x20;
color = color ? 0x00 : 0xFF;
for( i = 0; i < 8; i++ )
SSD1306_Data( SSD1306_Font8x8[wChar][i] ^ color );
}
/* Escreve um caracter 8x8 na posição especificada */
void SSD1306_Chr8( char row, char col, char wChar, char color )
{
SSD1306_Set_Cursor( row, col << 3 );
SSD1306_Chr( wChar, color );
}
/* Escreve um caracter 8x16 na posição especificada */
void SSD1306_Chr16( char row, char col, char wChar, char color )
{
char i;
col <<= 3;
SSD1306_Set_Cursor( row++, col );
wChar = wChar - 0x20;
color = color ? 0x00 : 0xFF;
for( i = 0; i < 8; i++ )
SSD1306_Data( SSD1306_Font8x16[wChar][i] ^ color );
SSD1306_Set_Cursor( row, col );
for( i = 8; i < 16; i++ )
SSD1306_Data( SSD1306_Font8x16[wChar][i] ^ color );
}
/* Escreve um texto com caracteres 8x8 na posição especificada */
void SSD1306_Out8( char row, char col, char *texto, char color )
{
SSD1306_Set_Cursor( row, col << 3 );
while( *texto )
SSD1306_Chr( *texto++, color );
}
/* Escreve um texto com caracteres 8x16 na posição especificada */
void SSD1306_Out16( char row, char col, char *texto, char color )
{
while( *texto )
SSD1306_Chr16( row, col++, *texto++, color );
}
/* Desenha uma imagem */
void SSD1306_Image( const char *bmp, char color )
{
char x, y;
color = color ? 0x00 : 0xFF;
for( y = 0; y < 8; y++ )
{
SSD1306_Set_Cursor( y, 0 );
Soft_I2C_Start();
Soft_I2C_Write( 0x78 );
Soft_I2C_Write( 0b1100000 );
for( x = 0; x < 128; x++ )
Soft_I2C_Write( *bmp++ ^ color );
Soft_I2C_Stop();
}
}
/* Preeche o display com o byte */
void SSD1306_Fill( char color )
{
char x, y;
for( y = 0; y < 8; y++ )
{
SSD1306_Set_Cursor( y, 0 );
Soft_I2C_Start();
Soft_I2C_Write( 0x78 );
Soft_I2C_Write( 0b1100000 );
for( x = 0; x < 128; x++ )
Soft_I2C_Write( color );
Soft_I2C_Stop();
}
}
view raw SSD1306.C hosted with ❤ by GitHub

EXEMPLO





MikroC PRO PIC
/*
Compilador: MikroC PRO PIC
Autor: Tiago
Blog: microcontrolandos.blogspot.com.br
Bibliotecas Utilizadas: SSD1306, Soft_I2C
*/
/* Pinos */
sbit Soft_I2C_Sda at PORTB.B0;
sbit Soft_I2C_Scl at PORTB.B1;
sbit Soft_I2C_Sda_Direction at TRISB.B0;
sbit Soft_I2C_Scl_Direction at TRISB.B1;
/* Imagem gerada pela ferramenta GLCD Bitmap Editor, display KS0108 */
const code char Logo[1024] = { ... };
void main()
{
Soft_I2C_Init(); //Inicializa a comunicação I2C
SSD1306_Init(); //Inicializa o display
SSD1306_Fill( 0 ); //Limpa o display
SSD1306_Out8( 0, 0, "Tiago", 0 ); //Imprime o texto na linha 0, coluna 0, com as cores invertida
Delay_ms( 5000 ); //Aguarda 5ms
SSD1306_Image( Logo, 1 ); //Desenha a imagem
}
view raw SSD1306_demo.C hosted with ❤ by GitHub

Escreva um comentário

17 comentários:

  1. Tem como simular esse display no Proteus?

    ResponderExcluir
    Respostas
    1. nao! proteus so tem UG-2864HSWEG01 com esse controlador SSD1306, e ele não é I2C!

      Excluir
  2. O meu display SSD1306 não possui o pingo de solda que você menciona, o que eu deveria alterar no código para que ele funcione corretamente. E mais outra dúvida, pq no desenho do esquemático, você ligou eles nos pinos D0 e D1? Não seria B0 e B1?

    ResponderExcluir
  3. hi..
    i cant compile this code on mikro c 6.5.0
    (project manager-add source file to project-ssd1306.c)
    can you help me about this project.

    ResponderExcluir
  4. It is possible to get the proteus libary anywhere for the oled 182x64. Thanks!

    ResponderExcluir
  5. It is possible to get the proteus libary anywhere for the oled 182x64. Thanks!

    ResponderExcluir
  6. O que eu comprei no ML não vem com um pingo de solda atrás, compilei o código certinho, porém o LCD nem sinal de vida, alguma dica?

    ResponderExcluir
    Respostas
    1. Atras do display, na parte onde está escrito "address", tem um jumper que define o endereço no barramento ( 0 ou 1 )...Voce pode confirmar isso?

      Excluir
    2. Ele é esse aqui, desse mesmo jeito é a traseira dele.

      http://i00.i.aliimg.com/wsphoto/v0/32275937420_1/Best-Seller-Price-1pcs-Serial-128X64-font-b-OLED-b-font-LCD-LED-Display-0-96.jpg

      Excluir
    3. Na imagem o endereço está definido como 0x78 ( ou 0, como eu tinha dito acima ). Então era pra funcionar.
      Veja se não alterou algum fio ( na imagem q voce postou, os pinos GND e VCC então invertidos comparados com a imagem lá em cima do post ).

      Excluir
    4. Sim, eu me atentei a isso. Vou comprar um segundo LCD, pra ver se o meu não veio com problemas, vou procurar alguma biblioteca pronta no arduíno tb, assim se eu conseguir fazer funcionar nele o problema não é o LCD, e sim eu que não estou acertando usar sua biblioteca. Mas muito obrigado pela ajuda! É algo que estou fazendo errado e não estou percebendo rsrs.

      Excluir
  7. hello please send me isis library and model files for ssd1306 and thx
    email: rody2005@hotmail.com

    ResponderExcluir
  8. Alguém tem esse display no proteus? Alguma biblioteca para download?

    ResponderExcluir
  9. Hi,
    Please can you send me isis library and model files ?

    mladen.bruck@gmail.com

    ResponderExcluir
  10. hello, please send me final project (mikroC project - all files, hex, mcppi etc.) for ssd1306. thanks :) . email: tunerymanta@mail.com

    ResponderExcluir
  11. Boa tarde.
    Já usou o novo mplab xpress da microchip ?!
    Estou com dificuldade em comunicar o display oled (ssd1306) com o pic 16F15376 no protocolo I2C usando as funções que o próprio site disponibiliza.

    ResponderExcluir