Заголовок сообщения: Графический дисплей 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-ми битная шина - это быстро и, болемение, просто. Вот немного изменил. Выполняется быстрее и памяти ест меньше.
Перевел ваш примерчик на Си... Работает!!!!! 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;
Карма: 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 раз в сек... или по необходимости...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения