Драйвер для SSD1306
- Войдите на сайт для отправки комментариев
Парни. Написал драйвер для популярного LED дисплея на конроллере SSD1306. Может кому-нибудь пригодится кроме меня? Данный драйвер использует минимум ОЗУ. Для буфера можно использовать от 128 до 1024 байт. Можно использовать даже с attiny85. Прошу помочь оптимизировать код. Так как на С++ я пишу не часто, то приветствуется здоровая и не здоровая критика с примерами "как надо". Буду благодарен всем, кто допишет новые методы для рисования примитивов. К примеру окружности, треугольника и т.д. На данный момент драйвер поддерживает вывод текста и отрисовку битмапов. Выводить можно в любое место на экране. Простенький шрифт(5x8) с поддержкой кирилицы уже "вшит" в драйвер. Единственное чего нужно придерживаться, это цикла перерисовки экрана. Вообщем навеяно этим и этим. Заранее огромное спасибо!
Проект c примером для Atmel Studio 6.
Круги помнится долго оптимизировал. Вышло так
Функция Pixel должна проверять попадаем в область для которой задан буфер или нет. У меня буфер (он же канва по сути) задается отдельной функцией вместе с координатами при начале операции и освобождается после вывода на экран.
Скорость вывода на экран можете поднять, он выше 800КГц тянет.
Готовтесь добавлять шрифты, много и крупные, базовый слишком мелок.
Еще из интересного прокрутки.
Цепляйте себе, может чё интересное и выйдет.
Спасибо. Как я понимаю это часть вашего драйвера? Можно ли увидеть его целиком?
Что за параметр cornername?
Вообщем ваша функция "в лоб" не заработала. Рисует наклоненный квадрат :)
cornername определяет маску четвертей круга. Странно что не заработала, щас проверю.
Проверил. Так работает.
линию рисует и две окружности. Вторая вылазит за пределы окна и обрезается сверху и снизу.
С какими параметрами вызов у Вас. Может слишком большие числа? Там все оптимизировано под байт, т.к. размеры экрана соответствующие.
Вот что получается. Еще я не понял что за неиспользуемая переменная "operation"?
С какими параметрами вызов у Вас? Может эмуль кривой. operation задает режим вывода - зажечь пиксель, потушить или инвертировать. Картинка для кода из выше.
Похоже что дело в char. Студия похоже считает его unsigned по умолчанию. Укажите явно signed char в обявлении в функции которую я выкладывал.
Заодно глянул чего operation передается в функцию рисования круга и не передается дальше. А ХЗ ))).
Вывод пикселя его принимает как необязательный и если не передан, то считает что пиксель нужно зажечь. Очевидно что такого для моих проектов достаточно, вот нигде проблема и не выявилась. По хорошему его надо 3-м параметром в Pixel передавать.
Вот собственно и нарисовался ответ на вопрос о публикации библиотеки. Библиотека - штука куда более серезная чем просто кусок кода заработавшего у меня. Она требует большого обёма тестирования, много больше чем требуется для моих проектов. И на разных платформах и с разными версиями железа и компилятора. У меня нет ни желания ни необходимости это делать. А не сделав это код остается сырым с скрытыми ошибками. Но в моих проектах работает - меня устраивает. Мои проекты для меня приоритетней чем сомнительная известность "тот самый что делал либу". Опубликовав "как есть" прийдется постоянно реагировать на фидбеки или смирится что у многих так и не работает (тогда смыслу выкладывать??). Ситуация усугубляется тем, что одной либой не ограничивается, например вывод по I2C у меня тоже на своей либе.
Кстати Ваш экран каким интерфейсом подключен? Судя по картинке эмуля там интересно...
Похоже что дело в char. Студия похоже считает его unsigned по умолчанию. Укажите явно signed char в обявлении в функции которую я выкладывал.
Заодно глянул чего operation передается в функцию рисования круга и не передается дальше. А ХЗ ))).
Вывод пикселя его принимает как необязательный и если не передан, то считает что пиксель нужно зажечь. Очевидно что такого для моих проектов достаточно, вот нигде проблема и не выявилась. По хорошему его надо 3-м параметром в Pixel передавать.
Вот собственно и нарисовался ответ на вопрос о публикации библиотеки. Библиотека - штука куда более серезная чем просто кусок кода заработавшего у меня. Она требует большого обёма тестирования, много больше чем требуется для моих проектов. И на разных платформах и с разными версиями железа и компилятора. У меня нет ни желания ни необходимости это делать. А не сделав это код остается сырым с скрытыми ошибками. Но в моих проектах работает - меня устраивает. Мои проекты для меня приоритетней чем сомнительная известность "тот самый что делал либу". Опубликовав "как есть" прийдется постоянно реагировать на фидбеки или смирится что у многих так и не работает (тогда смыслу выкладывать??). Ситуация усугубляется тем, что одной либой не ограничивается, например вывод по I2C у меня тоже на своей либе.
Кстати Ваш экран каким интерфейсом подключен? Судя по картинке эмуля там интересно...
Экран подключен по i2c. На устройстве такая же проблема, эмулятор тут не причем. Посмотрите мой код в первом сообщении.
Делайте явный signed char, пишите как вызываете функцию, попробую у себя.
А чего на картинке эмуля подключено не i2c? Вроде как паралельная шина..
Делайте явный signed char, пишите как вызываете функцию, попробую у себя.
А чего на картинке эмуля подключено не i2c? Вроде как паралельная шина..
Обязательно проверю, как буду у ПК. Там i2c, просто для работы данного дисплея необходимо сделать минимальную обвязку. Вы можете выложить код своей библиотеки на "поковыряться"? Спасибо за ответы.
Делайте явный signed char, пишите как вызываете функцию, попробую у себя.
Ошибка была в том, что я использовал uint8_t. Сейчас все в норме.