Сорс код за управление на 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();
}
Коментари



Телефон: 0898 518 261
e-mail: info@ekits.eu
Адрес: София бул. Европа 177