LED дисплей SSD1306 I2C с разрешением 128x64 px. отлично работает с библиотекой Adafruit. Но большинство библиотек работают с кадровым буфером, а это 128*64/8=1024 байт. В результате, нет места для переменных пользователя, а Adafruit ещё и память программ занимает более чем на 60%. Пришлось разбираться с низкоуровневым выводом на экран.
Схема подключения LED дисплея SSD1306 I2C очень простая, поэтому её здесь не привожу. У дисплея всего 4 вывода, из них 2 питание от 3,3 до 5 Вольт. Подключите вывод SDA на плате дисплея к выводу A4, а вывод SCK к выводу A5 на плате Arduino. Будем использовать аппаратный I2C интерфейс микроконтроллера ATMega 328 со стандартной для среды Arduino IDE библиотекой Whare.
#include <Wire.h>
#define SSD1306_Address 0x3C
#define SSD1306_Command_Mode 0x80
#define SSD1306_Data_Mode 0xC0
#define SSD1306_Dats_Mode 0x40
#define SSD1306_MEMORYMODE 0x20 //2< Автоматическая адресация
#define SSD1306_COLUMNADDR 0x21 //3< See datasheet
#define SSD1306_PAGEADDR 0x22 //3< See datasheet
#define SSD1306_SETCONTRAST 0x81 //2< Контрастность
#define SSD1306_CHARGEPUMP 0x8D //2< Умножитель напряжения
#define SSD1306_SEGREMAP_MIRROR 0xA0 ///< Развёртка справа/налево
#define SSD1306_SEGREMAP 0xA1 ///< Развёртка слева/направо
#define SSD1306_DISPLAYALLON_RESUME 0xA4 ///< отображение содержимого RAM
#define SSD1306_DISPLAYALLON 0xA5 ///< Игнорирует содержимое RAM.
#define SSD1306_NORMALDISPLAY 0xA6 ///< Нет инверсии
#define SSD1306_INVERTDISPLAY 0xA7 ///< Инверсия
#define SSD1306_SETMULTIPLEX 0xA8 //2< See datasheet
#define SSD1306_DISPLAYOFF 0xAE ///< Выключить дисплей
#define SSD1306_DISPLAYON 0xAF ///< Дисплей включен
#define SSD1306_COMSCANINC 0xC0 ///< Развёртка снизу/верх
#define SSD1306_COMSCANDEC 0xC8 ///< Развёртка сверху/вниз
#define SSD1306_SETDISPLAYOFFSET 0xD3 //2< See datasheet
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5 //2< Частота обновления
#define SSD1306_SETPRECHARGE 0xD9 ///< See datasheet
#define SSD1306_SETCOMPINS 0xDA //2< Разрешение 0x02-128x32, 0x12-128x64
#define SSD1306_SETVCOMDETECT 0xDB ///< See datasheet
#define SSD1306_SETLOWCOLUMN 0x00 ///< Not currently used
#define SSD1306_SETHIGHCOLUMN 0x10 ///< Not currently used
#define SSD1306_SETSTARTLINE 0x40 ///< See datasheet
#define SSD1306_EXTERNALVCC 0x01 ///< External display voltage source
#define SSD1306_SWITCHCAPVCC 0x02 ///< Gen. display voltage from 3.3V
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26 ///< Init rt scroll
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27 ///< Init left scroll
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 ///< Init diag scroll
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A ///< Init diag scroll
#define SSD1306_DEACTIVATE_SCROLL 0x2E ///< Stop scroll
#define SSD1306_ACTIVATE_SCROLL 0x2F ///< Start scroll
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3 ///< Set scroll range
unsigned char ledComIni1[] {
SSD1306_SETMULTIPLEX,
0x3F,
SSD1306_SETDISPLAYOFFSET,
0x00,
SSD1306_SETSTARTLINE,
SSD1306_MEMORYMODE,
0x00,
SSD1306_COLUMNADDR,
0x00,
0x7F,
SSD1306_PAGEADDR,
0x00,
0x07,
SSD1306_SEGREMAP,
SSD1306_COMSCANDEC,
SSD1306_SETCOMPINS,
0x12,
SSD1306_SETCONTRAST,
0x7F,
SSD1306_NORMALDISPLAY,
SSD1306_SETDISPLAYCLOCKDIV,
0x20,
SSD1306_CHARGEPUMP,
0x14,
SSD1306_DISPLAYALLON_RESUME,
SSD1306_DISPLAYON
};
void setup() {
Wire.begin();
Wire.setClock(400000);
for (int n = 0; n < sizeof(ledComIni1); n++) {
sendCommand(ledComIni1[n]);
}
// Serial.begin(9600);
// Serial.print(tekst);
}
void loop() {
for (int n = 0; n < 128; n++) {
sendDats(0xff);
}
delay(500);
for (int n = 0; n < 128; n++) {
sendDats(0x00);
}
delay(500);
}
void sendCommand(unsigned char command)
{
Wire.beginTransmission(SSD1306_Address);
Wire.write(SSD1306_Command_Mode);
Wire.write(command);
Wire.endTransmission();
}
void sendData(unsigned char Data)
{
Wire.beginTransmission(SSD1306_Address);
Wire.write(SSD1306_Data_Mode);
Wire.write(Data);
Wire.endTransmission();
}
void sendDats(unsigned char Data)
{
Wire.beginTransmission(SSD1306_Address);
Wire.write(SSD1306_Dats_Mode);
Wire.write(Data);
Wire.write(0xAA);
Wire.write(Data);
Wire.write(0xAA);
Wire.write(Data);
Wire.write(0xAA);
Wire.write(Data);
Wire.write(0xAA);
Wire.endTransmission();
}
Рис. 1. ПО для дисплея SSD1306 I2C.
впвыап