Заголовок сообщения: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920
Добавлено: Ср янв 08, 2014 17:04:43
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:3
Захотелось мне на досуге расширить свой кругозор. Давно хотелось научиться выводить на экран какую-нибудь картинку (Но без внешней памяти. Силами Atmega). Друг-продавец посоветовал вот этот экранчик http://krsk.24au.ru/3232807/. За 360 руб я получил неплохой монохромный экранчик с приличным разрешением, а так же хорошими габаритами. Т.к. я не ищу легких путей и на каждый внешний модуль или определенную задачу пишу собственную библиотеку, то не теряя времени я взялся за работу. Долго искал датащит. Попался только на японском. И то, с заблокированным копированием. Обратился за помощью к продавцу, и тот любезно предоставил мне вот этот датащит на английском.
Далее столкнулся со сложностями в плане адресации. Убил 2 дня на то, чтобы разобраться. Помогла вот эта статья http://avrprog.blogspot.ru/2013/12/lcd-12864-st7920-8.html. С помощью нее удалось понять принцип. А далее была написана библиотека, которая выдает на экран картинку из памяти. Изначально планировал выводить из ОЗУ. Но требуется ровно 1 килобайт. Я, обрадовавшись написал версию, читающую данные из ОЗУ, но забыл, что в Atmega16 всего 1 кб, а часть уходит на регистры и стек, из-за этого не срослось... На данный момент библиотека лишь выводит картинку, записанную в cseg (память программ), но как только приобрету Atmega32, перепишу библиотеку на чтение из ОЗУ, а так же разорхиватор картинок, сжатых с помощью алгоритма RLE. Для конвертации изображений использую вот эту программу http://hobby-research.at.ua/load/utility/grafika/bitmap2code/9-1-0-22. Вот мой рабочий закоментированый пример.
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Создал новую библиотеку. Достает данные из Flash памяти, распаковывает и сразу же в дисплей. Данные запаковываются алгоритмом RLE все в той же программе. Вот пример работы под ATmega16. Жалко, что в Proteus нет данного контроллера.
Спасибо. Интересный материал. У меня как раз лежит 5 таких дисплеев, тоже хотел написать сам бииблиотечку, да все руки никак не доходят ... Только я хочу написать под SPI, ато жалко кучу выводов тратить... Тут http://www.bajdi.com/cheap-128x64-graphic-lcd-12864zw/ по SPI вроде подключили, все работает, так что когда займусь, думаю что ваш материал чем то поможет...
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Мне пинов не жалко. Главное скорость. А 8-ми битная шина - это быстро и, болемение, просто. Вот немного изменил. Выполняется быстрее и памяти ест меньше.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Перевел ваш примерчик на Си... Работает!!!!! http://www.youtube.com/watch?v=jtNtIfQSboc По моему у меня еще больше получилось оптимизировать процедуру распаковки картинки на дисплей... Вот как это выглядит на Си... Чуть позже скину этот вариант на асме...
Код:
//---------- //функция вывода на дисплей упакованной графической картинки из PROGMEM //АРГУМЕНТ - указатель на упакованную в PROGMEM картинку void ST7920_CompressPictureOut (uint8_t* pPicture) { uint8_t RepeatMode; //флаг режима НЕНОЛЬ-повтор, НОЛЬ-неповтор uint8_t RepeatCntr; //счетчик количества одинаковых\неодинаковых байтов uint8_t SymbNum=0; //0-15 кол-во байт в линии uint8_t LineNum=0; //0-63 кол-во линий по вертикали uint8_t byte = 0;
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Поздравляю! Рад, что вы всерьез взялись за этот дисплей. Чувствую конкуренцию , но сдаваться не намерен . Вывод картинки - это, конечно, хорошо, но далее я намерен выводить картинку с microSD в формате bmp (пока хоть в несжатом). Драйвер для SD уже написан и работает. Осталось с bmp до конца разобраться. Позже выложу все сюда. Так же на асеме. И еще. Судя по датащиту, наш дисплей может работать только в режиме 8 или 4-х битной шины. SPI нет.
_________________ Все можно сделать, было бы желание!
Конкуренция нереальная... Вот еще чел на пятки наступает http://forum.cxem.net/index.php?showtopic=134266&st=0 Правда мы там с ним не очень лестно отзывались о вашем стиле написания ... Ну в общем не обращайте внимания.....
Вадиматоричик писал(а):
Судя по датащиту, наш дисплей может работать только в режиме 8 или 4-х битной шины. SPI нет.
Ну это вы погорячились... я же выше давал ссылку, где чел подключил по SPI... да и в даташите черным по белому описывается этот режим работы... И катсти... даташит пишется через Ш... вы уже несколько раз написали через Щ... (хотя мож я и ошибаюсь... )
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Цитата:
Конкуренция нереальная...
Жаль, что не нашел ее, когда только купил дисплей... Было бы легче жить.
Цитата:
Правда мы там с ним не очень лестно отзывались о вашем стиле написания ... Ну в общем не обращайте внимания...
Почему-то я не удивлен. Мой стиль написания весьма не идеален. Т.к. чувствую себя "супер программистом", а бывает и элементарного не знаю. Стараюсь писать понятнее и делать море комментариев, что помогает даже незнающему языка все понять. Так что красота письма - дело времени. Буду рад, если в ЛС скинете "переписку", в которой критикуется код. Приму к сведению и постараюсь исправиться.
Цитата:
Ну это вы погорячились... я же выше давал ссылку, где чел подключил по SPI... да и в даташите черным по белому описывается этот режим работы...
Гляжу в книгу - вижу фигу. Да, перечитал даташит (Спасибо за орфографическое исправление, я и вправду не знал, как пишется. Т.к. оба варианта подчеркиваются как ошибка.).
_________________ Все можно сделать, было бы желание!
CicleBig: lpm ;читаем бит типа упаковки и количество упакованных байтов mov RepeatCounter, r0 ;Счетчик повторов/неповторов. ldi Temp, 1 add ZL, Temp ;Следущий байт - байт данных adc ZH, MIN
set ;признак повторения sbrc RepeatCounter, 7 rjmp SetT clt ;признак НЕ повторения SetT: andi RepeatCounter,0b01111111;Убераем старший бит (Показатель повторов). inc RepeatCounter ;Повторы могут быть от 2-х раз до 129.
CicleRead: lpm ;читаем байт данных ldi Temp, 1 add ZL, Temp adc ZH, MIN
CicleNoRead: cpi LoopSymbNum,16 ; brlo CicleEnd ;если НЕ конец строки - идем на конец цикла ldi LoopSymbNum,0 ;иначе - строка с начала
inc LoopLineNum ;следующая строка cpi LoopLineNum,64 ;контроль окончания вывода картинки brlo DispPart ret
DispPart: ldi Data, 0b10000000 ;вычисляем адрес строки or Data, LoopLineNum cpi LoopLineNum,32 ;верхняя\нижняя половинки экрана brlo DP1 subi Data, 32 ;если нижняя часть - отнимаем 32
CicleEnd: mov Data, r0 rcall LCD12864_DataOut ;Выводим данные inc LoopSymbNum dec RepeatCounter ;обработка цикла повторов breq CicleBig ;главный цикл brtc CicleRead ;если НЕ повтор - будем читать следующее значение rjmp CicleNoRead ;если повтор - будем использовать старое значение
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Рад, что этот дисплей приобрел такую популярность. Есть даже статья на хабре http://habrahabr.ru/post/213459/. Попытался по ней написать нормальную библиотеку для работы по SPI. Но столкнулся с проблемой. Если подать "0" (-) на SPB (Для разрешения приема данных) вся цепь замыкается. У меня питается от программатора, так что гаснет все. Программатор в том числе. У кого-нибудь еще такое было? И еще. На дисплее по ссылке GND и VCC, по сравнению с мои дисплеем, на разных местах. Я об этом узнал уже после того, как подключил и цепь замкнулась. Даже и не подумал, что пины могут отличаться по назначению. Видимо, не судьба с SPI мне поработать... Спасибо за примеры. Буду стараться написать еще более компактный код
_________________ Все можно сделать, было бы желание!
Тоже прикупил такой дисплей , именно st7920. Пробую прикрутить его к Си-библиотеке u8glib - https://code.google.com/p/u8glib/ (U8glib for AVR) , интересует SPI-режим. В качестве МК Atmega328 ,а точнее плата ArduinoProMini. Компилирую в AVR Studio 4.19.Сначала шла ошибка - нету Makefile , с библиотекой идет пример "Hello World", там есть Makefile .Кинул его в папку default, предварительно поменяв в нем МК на Atmega328 и частоту 16МГц.Теперь ошибка другого плана -
Цитата:
make: *** Нет правила для сборки цели `u8m2.a()', требуемой для `u8m2.elf'. Останов. Build failed with 1 errors and 0 warnings...
Размер для Atmega328 получился - Program: 6888 bytes (21.0% Full). Это строка текста,несколько прямоугольников и круг.
Многовато однако.....
Думаю надо будет все таки свой вариант библиотеки состряпать... Прямоугольники думаю элементарно будет сообразить... а вот остальные фигуры наверное не нужны... Если нужно вывести чтото более замудреное, легче упаковывать графическую картинку и ее выводить когда надо, как предложл Вадиматоричик ...
Тем более можно сделать эффективность упаковки еще больше, если паковать не горизонтально, а вертикально... скоро предложу и такой вариант...
В оперативке отводится место под графический буфер дисплея, для данного дисплея это 1024 байта... Потом печать текстом (в принципе любого размера) идет в этот буфер... (вот тут самые интересные нитересности этой либы заложены ... ) Ну и теперь остается только периодически рефрешить дисплей из этого самого буфера, например 10 раз в сек... или по необходимости...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения