Здравствуйте! Начал разбираться с дисплеем на контроллере ssd1306, но столкнулся с непонятной строчкой кода в многих исходниках на этот дисплей. Приводится строка displayBuff[x + (y/8) * SSD1306_WIDTH] |= (1 << (y%8)) и говорится, что т.к. для отображения конкретного пикселя необходимо знать состояние остальных в сегменте, то нужно создать буфер в памяти контроллера и загружать его в память дисплея. Никак не могу понять следующее:
1) Что это за буфер, разве нельзя обратиться по странице и сегменту, а потом уже с помощью маски установить нужный бит,
2) Зачем умножать на длину (128 пикселей) страницы?
Добрый день! А можете исходники скинуть?
https://habr.com/ru/post/514382/
https://github.com/edosedgar/stm32f0_ARM/blob/master/labs/12_i2c_oled_display/lib/oled_driver.c (строка 209)
Навскидку по всей видимости адресация таким образом построена:
Относительно массива в памяти так (на примере 0-й страницы):
Выделенные вертикальные пиксели (8 штук) - это один элемент массива (8 бит). Для пикселя с x = 9 и y = 3 по картинке получаем, что это будет [9] элемент массива. По формуле получаем:
x + (y/8) * SSD1306_WIDTH = 9 + 0 * 128 = 9
Соответствует. Для страницы 1:
Если аналогично прикинуть, то все четко тоже.
Что это за буфер, разве нельзя обратиться по странице и сегменту, а потом уже с помощью маски установить нужный бит
Там запись идет целыми сегментами, то есть один конкретный пиксель нельзя изменить, только 8. Соответственно, надо считывать 8 бит, изменять один из них и записывать обратно (если у дисплея есть функция считывания). Даже если такой вариант есть, то по быстродействию видимо выгоднее целиком все перезаписывать.
Большое спасибо! Теперь стало ясно. 🙂
Хорошо 🙂