Клуб DiyAudio

Разное и полезное => Микроконтроллеры и их программирование => Тема начата: lgedmitry от 02 Октября 2013, 21:30:30

Название: Работа с ЖКИ
Отправлено: lgedmitry от 02 Октября 2013, 21:30:30
Сегодня-таки научился буквы писАть.
Надо сказать, готового рецепта в инете накопать не смог.
Пришлось помучиться.

Вот что получилось: (Извините, но у Вас нет доступа в Галерею)

Выкладываю листинг, вдруг кому полезно будет:
*
 * lcd_servo1.asm
 *
 *  Created: 30.09.2013 19:18:45
 *   Author: se
 */

.macro del //задержка
 
ldi bebe,@2  //0,0,1-0.6338us
ldi meme,@1  //0,1,0-0.16ms
ldi kuku,@0  //1,0,0-40.96ms
subi bebe,1
sbci meme,0
sbci kuku,0
brcc pc-3
.endmacro

.macro lcdcom //отправка команды в ЛСД
cbi portc,rs
ldi bebe,@0
out portd,bebe
sbi portc,e
del 0,0,3
cbi portc,e
del 0,0,60
.endmacro

.macro lcddata //отправка данных в ЛСД
sbi portc,rs
ldi bebe,@0
out portd,bebe
sbi portc,e
del 0,0,3
cbi portc,e
del 0,0,60
.endmacro

.macro initlcd
//настраиваем порты Д-на вывод данных. С4 и С5 на вывод е и rs соответственно
ldi bebe,255
out ddrd,bebe
out portd,bebe
in bebe,ddrc
sbr bebe,((1<<rs)|(1<<e))
out ddrc,bebe
sbi portc,rs
sbi portc,e
del 0,200,0

lcdcom 0b00111000 //8бит шина 2строки 5*8 пикселов в знаке
lcdcom 0b00001100
//забиваем символы в знакогенератор
lcdcom 0b01000000
// Б
lcddata 0b00011110
lcddata 0b00001001
lcddata 0b00001000
lcddata 0b00001110
lcddata 0b00001001
lcddata 0b00001001
lcddata 0b00010111
lcddata 0b00000000
// Е
lcddata 0b00011110
lcddata 0b00001001
lcddata 0b00001000
lcddata 0b00001100
lcddata 0b00001010
lcddata 0b00001000
lcddata 0b00010111
lcddata 0b00000000
// Р
lcddata 0b00011110
lcddata 0b00001001
lcddata 0b00001001
lcddata 0b00001101
lcddata 0b00001011
lcddata 0b00001000
lcddata 0b00010100
lcddata 0b00000000
// Н
lcddata 0b00011010
lcddata 0b00001001
lcddata 0b00001001
lcddata 0b00001101
lcddata 0b00001011
lcddata 0b00001001
lcddata 0b00010001
lcddata 0b00000000
// Д
lcddata 0b00011110
lcddata 0b00001001
lcddata 0b00001001
lcddata 0b00001001
lcddata 0b00001101
lcddata 0b00001011
lcddata 0b00010001
lcddata 0b00000000
// Й
lcddata 0b00011010
lcddata 0b00001000
lcddata 0b00001001
lcddata 0b00001011
lcddata 0b00001101
lcddata 0b00001001
lcddata 0b00010001
lcddata 0b00000000
// -
lcddata 0b00000000
lcddata 0b00000000
lcddata 0b00000000
lcddata 0b00011110
lcddata 0b00000001
lcddata 0b00000000
lcddata 0b00000000
lcddata 0b00000000

lcdcom 0b00000001
del 0,17,255
lcdcom 0b00000110
.endmacro

.equ rs=5
.equ e=4
.def bebe=r16
.def meme=r17
.def kuku=r18
.org 0
rjmp start

start:
initlcd


lcdcom 0b00000001
del 0,10,0
lcddata 'n'
lcddata 'u'
lcddata 'c'
lcddata 'l'
lcddata 'o'
lcddata 'n'
lcddata 0x20
lcddata '-'
lcdcom 0b11000110
lcddata 6
lcddata 0x20
lcddata 0
lcddata 1
lcddata 2
lcddata 1
lcddata 3
lcddata 4
lcddata 1
lcddata 5
loop:
rjmp loop
Название: Re: Работа с ЖКИ
Отправлено: Catcatcat от 02 Октября 2013, 22:38:27
вот мой вариант работы с HD44780 или KS0066U, на Си.
http://catcatcat.d-lan.dp.ua/skachat/biblioteki/biblioteka-dlya-rabotyi-s-lcd-indikatorami-na-drayvere-hd44780-ili-ks0066u/

Библиотека состоит из 5 функций которые облегчают вывод на индикаторы любых сообщений. Библиотека корректно выводить как латинские так и русские символы, очень удобна для формирования строковых сообщений.

InitLCD ()  - функция начальной инициализации дисплея. Необходимо использовать один раз в начале программы.

ClearLCD () – очистка индикатора. Когда необходимо полностью очистить индикатор.

CursorLCD (unsigned char stroka,unsigned char stolbec), где stroka – номер строки 0-3, stolbec – 0-40. В функции нет проверки привязки к типу индикатора, по этому необходимо корректно вводить номер столбца и номер строки. Используем эту функцию, когда необходимо установить курсор для вывода сообщения с определенной позиции индикатора. Пример, CursorLCD(0,5); – вывод в самую верхнюю строку с 6 знакоместа.

StringLCD (const unsigned char *str); – вывод строки текста в положение курсора, длина текста не должна превышать 255 символов. Хотя для вывода на индикатор необходимо учитывать его длину. Необходимо понимать, что драйвер HD44780 представляет собой управления до 40 знакомест, а в зависимости от того как производитель подключил драйвер к ЖКИ матрице и сколько он таких драйверов использует в дисплее, то превышение длины строки может в одном варианте привести к потере информации, в другом, то что конец строки появиться на третей или четвертой строке дисплея.

Пример,StringLCD(“Привет мир ILLISSI!!”);

(http://catcatcat.d-lan.dp.ua/wp-content/uploads/2013/03/illissi_lcd_19.jpg)

SendLCDdata (unsigned char data, unsigned char rs); – загрузка в индикатор команды или данных для вывода на индикатор. Где data - код символа или команда, rs - 0 команда, 1 – данные. Предназначена когда необходимо вывести какой-то определенный (не печатный) символ из таблицы кодировки или команду. Пример, SendLCDdata (0xEF,1); – выводит на дисплей символ градус, SendLCDdata (0b00001111,0); – команда – дисплей включен/курсор включен/мигание курсора включено.
Название: Re: Работа с ЖКИ
Отправлено: lgedmitry от 02 Октября 2013, 22:56:15
Catcatcat, Ген, завтра попробую твой вывод строк поглядеть  поближе. Темка интересная :v:
Название: Re: Работа с ЖКИ
Отправлено: Catcatcat от 03 Октября 2013, 07:56:16
Если будут непонятки спрашивай помогу.
Название: Re: Работа с ЖКИ
Отправлено: xar от 03 Октября 2013, 09:56:24
lgedmitry, Шрифт прикольный )
Название: Re: Работа с ЖКИ
Отправлено: lgedmitry от 03 Октября 2013, 10:42:47
xar, когда-то давно  я на ротной стенгазете буковки плакатным пером выписывал. А тепрь и руки не те, да и противная буква "М" никак в слове "ГРОМК." не выходит: либо на М не похоже,  либо стилистика нарушается.
Могет кто другое слово знает, чтоб вместо "ГРОМК." написать можно было? ;-[

и добавил...
кажись, придумал! Надо написать: "УРОВЕНЬ". И буквы все нормальные, и сокращать не придётся :yah:
Название: Re: Работа с ЖКИ
Отправлено: xar от 03 Октября 2013, 17:52:13
И буквы все нормальные, и сокращать не придётся
и по олдовому :v:
Название: Re: Работа с ЖКИ
Отправлено: blindman от 03 Октября 2013, 19:38:34
А можно я немного поумничаю ?  ;-[

Родной атмеловский ассемблер делает метки в макросах локальными, поэтому вполне можно писать так
.macro del //задержка
ldi bebe,@2  //0,0,1-0.6338us
ldi meme,@1  //0,1,0-0.16ms
ldi kuku,@0  //1,0,0-40.96ms
loop:
subi bebe,1
sbci meme,0
sbci kuku,0
brcc loop
.endmacro

Куда понятнее чем brcc pc-3

Правда с гнутым ассемблером такое не прокатывает, если сделать метку loop внутри макроса, то она будет размножена при каждой подстановке, и получим кучу ошибок. там надо использовать другой синтаксис для локальных меток:

.macro del d1 d2 d3
ldi bebe,\d3  //0,0,1-0.6338us
ldi meme,\d2  //0,1,0-0.16ms
ldi kuku,\d1 //1,0,0-40.96ms
1:
subi bebe,1
sbci meme,0
sbci kuku,0
brcc 1b
.endmacro

Но все же del, lcdcom и lcddata лучше оформить в виде подпрограмм, а не макросов. А то память может очень быстро закончиться.
Название: Re: Работа с ЖКИ
Отправлено: Catcatcat от 03 Октября 2013, 19:52:16
Я на ассемблере лет 8 сидел, и все никак не решался на Си перейти, а когда перешел, забыл ассемблер, как страшный сон. Как на Си все легко :yah:. Думаю новичкам надо с Си начинать. Хотя знание ассемблера обалденно помогает. Иногда читаешь на форумах, народ задает такие нелепые вопросы, что понимаешь Си немного отрывает от сути железа. Но зато перейти с одной модели контроллера на другою нет никаких проблем. И плюсов программирования на Си больше, главное время разработки значительно снижается.
Название: Re: Работа с ЖКИ
Отправлено: hippo64 от 03 Октября 2013, 20:44:46
А мне как вдолбили за мк и ассемблер, так никак и не решусь для них на сях писать
Название: Re: Работа с ЖКИ
Отправлено: lgedmitry от 03 Октября 2013, 20:48:12
Но все же del, lcdcom и lcddata лучше оформить в виде подпрограмм, а не макросов. А то память может очень быстро закончиться.
Андрей, вот именно этим сейчас и занимаюсь. ;)
Только в этой связи у меня следующая какашка вылезла: имею (на данный момент): один файл основной и 2 файла с подпрограммами.
Пишу в основном файле, в месте, где тушки подпрограмм должны быть: ".include d:\ и тд. и тп..." А противный компиллятор матерится, мол я вызываю подпрограммы, каких нету. Не хочет он, отчего-то открыть вложенные файлы и поискать там нужные подпрограммы. Как это победить?
Боюсь, если просто ".include d:\ и тд. и тп..." всунуть в начало программы, то и подпрограммы вместо конца в начале окажутся, чего совсем бы не хотелось.

А так всё с подпрограммами заработало, когда я просто текст из тех двух файлов в основной скопипастил. Только мне такой подход не очень импонирует. Ибо, когда подпрограмм будет раз в 5 больше - я в этом файле заблужусь. :wall:
Название: Re: Работа с ЖКИ
Отправлено: Catcatcat от 04 Октября 2013, 15:17:46
ну насколько я понимаю

если такое написание:
#include <libpic30.h>  - для файлов располагающих в каталогах по умолчанию. типа компилятор сам знает куда лесть и где искать.
если такое...
#include "graphic.h" - эти файлы должны находиться в рабочей папке вместе с главным файлом программы (main).
Название: Re: Работа с ЖКИ
Отправлено: lgedmitry от 04 Октября 2013, 16:03:37
. Думаю новичкам надо с Си начинать.
Уже тоже начинаю так думать.  :-X
Название: Re: Работа с ЖКИ
Отправлено: technic от 04 Октября 2013, 16:33:28
Я начинал с ассемблера. Потом на C перешел. Но случаются рецедивы, когда какую-нибудь функцийку на ассемблере дорисовываю, когда хочется, чтобы код работал так, как я написал, а не как компилятор наоптимизировал...
Название: Re: Работа с ЖКИ
Отправлено: lgedmitry от 09 Октября 2013, 22:02:56
Первый опыт с Сями VID 20131009 224801 (http://www.youtube.com/watch?v=qMQrogLrHNU#)
Во-первых, надо на 8-ми проводное подключение ЖК перейти - должно быть быстрее, а то мне такая скорость не очень что-то.
А может ещё и ассемблерную вставку сделать. Потому, как не знаю, как можно по-быстрому в Си поделить на 2 с остатком. В ассемблере - проще простого. А тут-сдвинуть вправо легко, а вот где я carry возьму потом  :d_know:
Название: Re: Работа с ЖКИ
Отправлено: Catcatcat от 09 Октября 2013, 22:17:39
Не заморачивайся, в Си то же сдвиг есть  ;D 8 проводная много ножек занимает, а так одним портом (8 битным) можешь полностью управиться с управлением.
Название: Re: Работа с ЖКИ
Отправлено: blindman от 10 Октября 2013, 02:51:15
а то мне такая скорость не очень что-то
Да нормальная скорость. Я вижу обычную инерционность ЖКИ, от которой никуда не деться. Можно попробовать ее чуть уменьшить регулировкой контрастности .
сдвинуть вправо легко, а вот где я carry возьму потом
У ты бери не потом, а заранее : (x & 1)
Название: Re: Работа с ЖКИ
Отправлено: khvilon от 10 Октября 2013, 03:38:45
У ты бери не потом, а заранее : (x & 1)
или в более общем случае
x % y;
или в частном
x % 2;
Название: Re: Работа с ЖКИ
Отправлено: Catcatcat от 10 Октября 2013, 09:47:58
Цитировать (выделенное)
Я вижу обычную инерционность ЖКИ
подтверждаю, ЖКИ такого типа - очень инерционные, поэтому супер пупер скорости вывода индикации не получиться. Это не ОЛЭД на которых можно хоть кино смотреть ;D

A library OLED driver SEPS114A (http://www.youtube.com/watch?v=O8v2htftLxc#ws)
Название: Re: Работа с ЖКИ
Отправлено: lgedmitry от 29 Октября 2013, 09:27:03
VID 20131029 105910 (http://www.youtube.com/watch?v=fD8cDCZD8sw#)
Кажись доделал.
Щелчков нет. По рецепту одесского камрада Лёши (aleyer), победил задержкой в 2мсек между включением "новых" реле и выключением "старых".
Дольше пришлось возится с детектированием помех индикатором уровня. Победил лишь питанием реле и атмеги от разных БП. Пришлось малость испортить безупречную девственность рисунка печатки. Там изначально всё на одной земле сидело ???
Думаю, в усе условия всёж-таки попроще будут. Там это всё на выходе будет висеть, а не на входе. И не будет длиннющих проводков.