Сорс код за управление на OLED 128x64px с контролер SSD1315
Широкоразпространените китайски OLED дисплей са много подходящи за изграждане на устройства за домашна автоматизация. Имат малки размери, добра яркост и разделителна способност. Най-популярни са тези с контролер SSD1306 и SSD1315. Като цяло двата контролера са напълно взаимозаменяеми.
За свързване се използва I2C протокол. Не са свързани пул ъп резистори. Дисплеят е захранен с 3,3 волта.
#define I2C_SDA 21 #define I2C_SCL 22
За да инициализираме I2C интерфейса на ESP32 се използва комада. Тук се задава честотата в kHz (100 000 или 400 000)
Wire.begin(I2C_SDA, I2C_SCL,400000);
Всеки елемент свързан към I2C има специфичен адрес. В случая адреса на дисплея е 0x3C. Трябва да се предаде инструкция, която показва каква информация ще се предава по комуникацията - команда или данни.
#define SSD1315_COMMAND 0x00 #define SSD1315_DATA 0x40 #define SSD1315_ARDS 0x3C
Предаването на данни по I2C има следния формат
Wire.beginTransmission(SSD1315_ARDS); Wire.write(SSD1315_COMMAND); Wire.write(val); // command value Wire.endTransmission();
За да работи дисплея трябва да се инициализира при включване на захранване. Това става като в съответните регистри се запишат подходящи стойности.
byte ssd1315_init_sequence[] = { // Initialization Sequence 0xAE, // Set Display ON/OFF - AE=OFF, AF=ON 0xD5, 0xF0, // Set display clock divide ratio/oscillator frequency, set divide ratio 0xA8, 0x3F, // Set multiplex ratio (1 to 64) ... (height - 1) 0xD3, 0x00, // Set display offset. 00 = no offset 0x40 | 0x00, // Set start line address, at 0. 0x8D, 0x14, // Charge Pump Setting, 14h = Enable Charge Pump //0x20, 0x10, // Set Memory Addressing Mode - 00=Horizontal, 01=Vertical, 10=Page, 11=Invalid 0xA0 | 0x01, // Set Segment Re-map 0xC8, // Set COM Output Scan Direction 0xDA, 0x12, // Set COM Pins Hardware Configuration - 128x32:0x02, 128x64:0x12 0x81, 0x3F, // Set contrast control register 0xD9, 0x22, // Set pre-charge period (0x22 or 0xF1) 0xDB, 0x20, // Set Vcomh Deselect Level - 0x00: 0.65 x VCC, 0x20: 0.77 x VCC (RESET), 0x30: 0.83 x VCC 0xA4, // Entire Display ON (resume) - output RAM to display 0xA6, // Set Normal/Inverse Display mode. A6=Normal; A7=Inverse 0x2E, // Deactivate Scroll command 0x20, 0x00, // Set Memory Addressing Mode - 00=Horizontal, 01=Vertical, 10=Page, 11=Invalid 0xAF // Set Display ON/OFF - AE=OFF, AF=ON };
Има няколко основни функции за комуникация - предаване на данни и команда.
void send_command_start(void) { Wire.beginTransmission(SSD1315_ARDS); Wire.write(SSD1315_COMMAND); } void send_command_stop() { Wire.endTransmission(); } void send_byte(byte val) { Wire.write(val); } void send_data_start(void) { Wire.beginTransmission(SSD1315_ARDS); Wire.write(SSD1315_DATA); } void send_data_stop() { Wire.endTransmission(); }
И определена последователност да се позиционира курсора на точно определено положение по X и Y
void setpos(byte x, byte y) { byte lower, higher; send_command_start(); send_byte(0xb0 | (y & 0x07)); lower=x;lower=lower&0x0F; higher=x;higher=higher>>4;higher=higher&0x07;higher=0x10|higher; send_byte(lower); send_byte(higher); send_command_stop(); }
Коментари