Форум РадиоКот https://radiokot.ru/forum/ |
|
Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 https://radiokot.ru/forum/viewtopic.php?f=61&t=99043 |
Страница 1 из 12 |
Автор: | Вадиматоричик [ Ср янв 08, 2014 17:04:43 ] |
Заголовок сообщения: | Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Захотелось мне на досуге расширить свой кругозор. Давно хотелось научиться выводить на экран какую-нибудь картинку (Но без внешней памяти. Силами 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. Вот мой рабочий закоментированый пример. Вложение: Картинка дисплея с изображением в железе. Вложение:
|
Автор: | Вадиматоричик [ Чт янв 09, 2014 19:56:42 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Создал новую библиотеку. Достает данные из Flash памяти, распаковывает и сразу же в дисплей. Данные запаковываются алгоритмом RLE все в той же программе. Вот пример работы под ATmega16. Жалко, что в Proteus нет данного контроллера. Вложение:
|
Автор: | shads [ Ср янв 15, 2014 00:51:50 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Спасибо. Интересный материал. У меня как раз лежит 5 таких дисплеев, тоже хотел написать сам бииблиотечку, да все руки никак не доходят ![]() Только я хочу написать под SPI, ато жалко кучу выводов тратить... Тут http://www.bajdi.com/cheap-128x64-graphic-lcd-12864zw/ по SPI вроде подключили, все работает, так что когда займусь, думаю что ваш материал чем то поможет... |
Автор: | Вадиматоричик [ Ср янв 15, 2014 10:43:12 ] | ||
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 | ||
Мне пинов не жалко. Главное скорость. А 8-ми битная шина - это быстро и, болемение, просто. Вот немного изменил. Выполняется быстрее и памяти ест меньше.
|
Автор: | shads [ Вт фев 18, 2014 23:06:13 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Перевел ваш примерчик на Си... Работает!!!!! 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; ST7920_CommandOut (0x80); ST7920_CommandOut (0x80); while (1){ RepeatCntr = pgm_read_byte (pPicture++); RepeatMode = (RepeatCntr & 0x80); //определяем режим заполнения (повтор\неповтор) RepeatCntr &= ~0x80; RepeatCntr++; if (RepeatMode) byte = pgm_read_byte (pPicture++); //тут читаем если режим повтора for (uint8_t i=RepeatCntr; i; i--){ if (! RepeatMode) byte = pgm_read_byte (pPicture++); //тут читаем если режим НЕповтора if (SymbNum == 16){ //контроль окончания строки SymbNum = 0; if (++LineNum >= 64) //контроль окончания вывода картинки return; if (LineNum < 32){ //верхняя половина дисплея ST7920_CommandOut (0x80 | LineNum); ST7920_CommandOut (0x80); } else{ //нижняя половина дисплея ST7920_CommandOut ((0x80 | LineNum) - 32); ST7920_CommandOut (0x88); } } ST7920_DataOut (byte); //данные на дисплей SymbNum++; } } } |
Автор: | Вадиматоричик [ Ср фев 19, 2014 04:41:34 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Поздравляю! ![]() ![]() ![]() |
Автор: | shads [ Ср фев 19, 2014 10:08:54 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Вадиматоричик писал(а): Чувствую конкуренцию ![]() ![]() ![]() Правда мы там с ним не очень лестно отзывались о вашем стиле написания ![]() Вадиматоричик писал(а): Судя по датащиту, наш дисплей может работать только в режиме 8 или 4-х битной шины. SPI нет. Ну это вы погорячились... я же выше давал ссылку, где чел подключил по SPI... да и в даташите черным по белому описывается этот режим работы...И катсти... даташит пишется через Ш... вы уже несколько раз написали через Щ... (хотя мож я и ошибаюсь... ![]() |
Автор: | Вадиматоричик [ Ср фев 19, 2014 10:37:18 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Цитата: Конкуренция нереальная... Жаль, что не нашел ее, когда только купил дисплей... Было бы легче жить. Цитата: Правда мы там с ним не очень лестно отзывались о вашем стиле написания ![]() Почему-то я не удивлен. Мой стиль написания весьма не идеален. Т.к. чувствую себя "супер программистом", а бывает и элементарного не знаю. Стараюсь писать понятнее и делать море комментариев, что помогает даже незнающему языка все понять. Так что красота письма - дело времени. Буду рад, если в ЛС скинете "переписку", в которой критикуется код. Приму к сведению и постараюсь исправиться. Цитата: Ну это вы погорячились... я же выше давал ссылку, где чел подключил по SPI... да и в даташите черным по белому описывается этот режим работы... Гляжу в книгу - вижу фигу. Да, перечитал даташит (Спасибо за орфографическое исправление, я и вправду не знал, как пишется. Т.к. оба варианта подчеркиваются как ошибка.). |
Автор: | shads [ Ср фев 19, 2014 11:24:50 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Вадиматоричик писал(а): Жаль, что не нашел ее, когда только купил дисплей... Было бы легче жить. Дык та тема появилась позже вашей... так что вы по любому первопроходец! Вадиматоричик писал(а): Буду рад, если в ЛС скинете "переписку", в которой критикуется код. Да там его коммент и через один мой... вот и вся критика ![]() Вадиматоричик писал(а): Гляжу в книгу - вижу фигу. Да, перечитал даташит Нашли упоминание о SPI ? Или может у вас другой какой то даташит.... Могу своим поделится...
|
Автор: | shads [ Пт фев 21, 2014 15:43:10 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Много ли... мало ли... но 44 байта сэкономил, только на одной процедуре распаковки экрана... Код: LCD12864_OUT_OZU: ;ВЫВОД УПАКОВАННОЙ КАРТИНКИ НА ДИСПЛЕЙ
clr LoopLineNum ;Номер линии. clr LoopSymbNum ;Номер байта в линии. ldi Data, 0b10000000 rcall LCD12864_CommandOut rcall LCD12864_CommandOut ldi ZL, Low (LCD*2) ;Начальный адрес упакованной картинки. ldi ZH, High(LCD*2) 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 DP1: rcall LCD12864_CommandOut ldi Data, 0b10000000 cpi LoopLineNum,32 ;верхняя\нижняя половинки экрана brlo DP2 ldi Data, 0b10000000+8 ;если нижняя часть - прибавляем 8 DP2: rcall LCD12864_CommandOut CicleEnd: mov Data, r0 rcall LCD12864_DataOut ;Выводим данные inc LoopSymbNum dec RepeatCounter ;обработка цикла повторов breq CicleBig ;главный цикл brtc CicleRead ;если НЕ повтор - будем читать следующее значение rjmp CicleNoRead ;если повтор - будем использовать старое значение |
Автор: | Вадиматоричик [ Сб фев 22, 2014 15:59:48 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Рад, что этот дисплей приобрел такую популярность. Есть даже статья на хабре http://habrahabr.ru/post/213459/. Попытался по ней написать нормальную библиотеку для работы по SPI. Но столкнулся с проблемой. Если подать "0" (-) на SPB (Для разрешения приема данных) вся цепь замыкается. У меня питается от программатора, так что гаснет все. Программатор в том числе. У кого-нибудь еще такое было? И еще. На дисплее по ссылке GND и VCC, по сравнению с мои дисплеем, на разных местах. Я об этом узнал уже после того, как подключил и цепь замкнулась. Даже и не подумал, что пины могут отличаться по назначению. Видимо, не судьба с SPI мне поработать... Спасибо за примеры. Буду стараться написать еще более компактный код ![]() |
Автор: | rastamanoff [ Ср фев 26, 2014 00:40:16 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Тоже прикупил такой дисплей , именно 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... В самом источнике библиотеки есть описание как подключить ее к AVR Studio 4,к сожалению на английском https://code.google.com/p/u8glib/wiki/avr Спецы помогите ! Или ткните носом в нормальное описание подключения на СИ. И еще не могу понять,что надо делать в опциях: Цитата: AVR Studio 4: Set additional options (Project - Configuration - Custom Options) [All Files] -ffunction-sections -fdata-sections [Linker Options] -Wl,--gc-sections Самое интерестное, для Arduino есть пример http://nnm.me/blogs/pencraft/arduino-i-graficheskiy-displey-128x64-s-kontrollerom-st7920/.Я подключил все работает.Простенькие фигуры,текст. |
Автор: | rastamanoff [ Ср фев 26, 2014 00:56:41 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
С опциями разобрался,но ошибка осталась Цитата: make: *** Нет правила для сборки цели `u8m2.a()', требуемой для `u8m2.elf'. Останов.
Build failed with 1 errors and 0 warnings... |
Автор: | rastamanoff [ Чт фев 27, 2014 00:48:03 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
"Лед тронулся..." Разобрался. ![]() Тестовый проект для AVR Studio 4.19 ,подключение 3-мя поводами по SPI (PB2,PB3,PB4) http://yadi.sk/d/1EuM3dLkJcHoa |
Автор: | shads [ Чт фев 27, 2014 09:53:00 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
А она не слишком тяжеленькая... эта библиотечка?... Чет с виду перегружена очень... или это так, только кажется? И еще, как скорость по SPI ? не слишком медленный обмен? (хотя... это наверное будет заметно только в графическом режиме...) |
Автор: | rastamanoff [ Чт фев 27, 2014 15:27:50 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
Размер для Atmega328 получился - Program: 6888 bytes (21.0% Full). Это строка текста,несколько прямоугольников и круг. Пока меня устраивает.. Скорость ,не могу сказать,так как сравнить с паралельным режимом не пробовал .Но для вывода текста в рамочке на мой взгляд подойдет. |
Автор: | shads [ Чт фев 27, 2014 17:41:13 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
rastamanoff писал(а): Размер для Atmega328 получился - Program: 6888 bytes (21.0% Full). Многовато однако.....Это строка текста,несколько прямоугольников и круг. Думаю надо будет все таки свой вариант библиотеки состряпать... Прямоугольники думаю элементарно будет сообразить... а вот остальные фигуры наверное не нужны... Если нужно вывести чтото более замудреное, легче упаковывать графическую картинку и ее выводить когда надо, как предложл Вадиматоричик ... Тем более можно сделать эффективность упаковки еще больше, если паковать не горизонтально, а вертикально... скоро предложу и такой вариант... |
Автор: | shads [ Пт мар 07, 2014 16:50:36 ] | ||
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 | ||
Я тут кой чего намулевал... Соображаю библиотечку для печати шрифтом размерностью 6х8... Тогда в строке помещается 21 символ...
|
Автор: | aleksandr-zh [ Ср июн 11, 2014 00:06:13 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
добрый день подскажите: как выводите символы своего размера на индикатор? я не могу понять алгоритм |
Автор: | shads [ Ср июн 11, 2014 13:34:41 ] |
Заголовок сообщения: | Re: Графический дисплей LCD 12864 (128x64 пикселя) на ST7920 |
В оперативке отводится место под графический буфер дисплея, для данного дисплея это 1024 байта... Потом печать текстом (в принципе любого размера) идет в этот буфер... (вот тут самые интересные нитересности этой либы заложены ![]() Ну и теперь остается только периодически рефрешить дисплей из этого самого буфера, например 10 раз в сек... или по необходимости... |
Страница 1 из 12 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |