Работа с ЖКИ на контроллере HD44780 и его аналогах

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Каждый со своей колокольни смотрит) Например мой дедушка или отец даже "выставить ногу Е" не смогли бы)
Ставим плюсы: )
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

везде где идет проверка занятости надо заменить ее на задержку(чтоб индикатор успел отработать команду) ничего сложного, попробуй

да и собственный код написать слишком логики не надо - просто дергай ногами в нужной последовательности с нужными задержками согласно документации
писал для LPC2368 собственную либу для LCD - ничего мегасложного

простой пример(не заморачиваясь на конкретные команды и последовательности байтов)

Код: Выделить всё

#include<avr/io.h>
#include<util/delay.h>

void LCD_Init();	//Функция инициализации дисплея
void LCD_PutChar(char value);	//Фунция отправки символа
//И другие функции  - установки типа курсора, направления перемещения текста, позиции символа, вывода числа, строки и т.п.

void LCD_Init()
{
	//последовательность команд для инициализации
	PORTB = blabla;
	delay_ms(blabla);
	PORTB = blabla;
	delay_ms(blabla);
	...
}

void LCD_PutChar(char value)
{
	//последовательность команд для отрисовки символа
	PORTB = blabla;
	...;
	PORTB = value;
	...
	delay_ms(blabla); //задержка вместо проверки занятости
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Открыл глаза
Сообщения: 64
Зарегистрирован: Пт янв 16, 2009 23:27:49

Сообщение Uselock »

Спасибо, буду пробовать.
Еще есть такой вопрос. Как мне переопределить порты в данном случае:

Код: Выделить всё

#define DATA_OUT    PORTB.0   
#define DATA_IN     PINB.0       
#define DATA_IO     DDRB.0
То есть в начале программы они у меня определены так. Потом по ходу программы мне нужно работать уже с другими ножками. Как это сделать?
Пытаюсь вот так. Не получается

Код: Выделить всё

switch (rx_buffer) {
case 0: 
#define DATA_OUT    PORTB.0    
#define DATA_IN     PINB.0       
#define DATA_IO     DDRB.0
break;
case 1: 
#define DATA_OUT    PORTB.1    
#define DATA_IN     PINB.1       
#define DATA_IO     DDRB.1
break;
case 2: 
#define DATA_OUT    PORTB.2    
#define DATA_IN     PINB.2      
#define DATA_IO     DDRB.2
break;};
Дело в том, что у меня 10 датчиков повешены на разные ножки и нужно их как-то выбирать. Прошу помощи
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

думаю что так, проверить не могу

Код: Выделить всё

#define DATA_IN switch(rx_buffer)
				{
					case 0: PINB.0; break;
					case 1: PINB.1; break;
					case 2: PINB.2; break;
				}
				
#define DATA_OUT switch(rx_buffer)
				{
					case 0: PORTB.0; break;
					case 1: PORTB.1; break;
					case 2: PORTB.2; break;
				}

	//и т.д.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
когда Вы пишете

Код: Выделить всё

#define DATA_IN PINA 
Вы просто даете понять компилятору что подставить в ИСХОДНЫЙ код программы вместо ключевого слова DATA_IN. Во время компиляции он во все места программы, где написано DATA_IN подставляет PINA. (Скажу по секрету, что PINA - тоже не конечный результат, а аналогично объявленное через #define ключевое слово, за которым скрывается обычное число - адрес регистра PINA В контроллере)

В Вашем случае нужно корректировать функции, добавив в их список аргументов порты, с которыми следует работать при ее вызове.
Ставим плюсы: )
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

ibiza11 писал(а):#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
смею не согласиться
#define объявляет макрос, т.е. в теле программы соответствующие значения меняется на то что мы в дефайне зададим, неважно константа это или функция
см пример кода выше
...............
исправлено
в погоне за экспериментами хотел предложить вариант с #if, #elif, #endif, но этот вариант точно работать не будет т.к. он не работает с переменными программы и выполняется на этапе препроцессирования, т.е. именно так как писал выше ibiza11
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток

Сообщение tux »

Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером. Желательно с примерами на ассемблере.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

tux писал(а):Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером.
Выводи в нужную позицию. Или я не понял вопроса?
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток

Сообщение tux »

Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

Вот кусок кода на С, который выводит правильные символы:
Спойлер

Код: Выделить всё

#include <avr/pgmspace.h>

#define COMMAND 0
#define DATA 1
#define sbi(reg, bit)  (reg|=(1<<bit))
#define cbi(reg, bit)  (reg&=~(1<<bit))



//массив во флэш-памяти для русских символов
const char Decode2Rus[255-192+1] PROGMEM = {
	0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,
	0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,
	0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,
	0xAC,0xE2,0xAD,0xAE,0xAD,0xAF,0xB0,0xB1,
	0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,
	0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE,
	0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,
0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7 };


//Тактирование LCD
void lcd_clk()
{
	sbi(LCDPORT,LCD_PIN_E);
	_delay_ms(1);
	cbi(LCDPORT,LCD_PIN_E);
	_delay_ms(1);
}

//отправка байта в LCD
void lcd_send(unsigned char type, unsigned char c)
{
	if (type==COMMAND)
{cbi(LCDPORT,LCD_PIN_RS);}//RS=0 - комманда
	else
{sbi(LCDPORT,LCD_PIN_RS);}

	//Передача старшего полубайта
	if (bit_is_set(c,7))
{ sbi(LCDPORT,LCD_PIN_D7);}
	else
{cbi(LCDPORT,LCD_PIN_D7);}
	
	if (bit_is_set(c,6))
{ sbi(LCDPORT,LCD_PIN_D6);}
	else
{cbi(LCDPORT,LCD_PIN_D6);}

	if (bit_is_set(c,5))
{ sbi(LCDPORT,LCD_PIN_D5);}
	else
{cbi(LCDPORT,LCD_PIN_D5);}

	if (bit_is_set(c,4))
{ sbi(LCDPORT,LCD_PIN_D4);}
	else
{cbi(LCDPORT,LCD_PIN_D4);}
	
	lcd_clk();

	//Передача младшего полубайта
	if (bit_is_set(c,3))
{ sbi(LCDPORT,LCD_PIN_D7);}
	else
{cbi(LCDPORT,LCD_PIN_D7);}
	
	if (bit_is_set(c,2))
{ sbi(LCDPORT,LCD_PIN_D6);}
	else
{cbi(LCDPORT,LCD_PIN_D6);}

	if (bit_is_set(c,1))
{ sbi(LCDPORT,LCD_PIN_D5);}
	else
{cbi(LCDPORT,LCD_PIN_D5);}

	if (bit_is_set(c,0))
{ sbi(LCDPORT,LCD_PIN_D4);}
	else
{cbi(LCDPORT,LCD_PIN_D4);}

	lcd_clk();
}



void lcd_write(char*t) //Отображение строки символов
{
	unsigned char i;
	for (i=0;i<255;i++)
	{
		if (t[i]==0)
		{
			return;
		}
		else
		{
			if (t[i]>=192)
			{
				lcd_send(DATA, pgm_read_byte(&(Decode2Rus[t[i]-192])));
			}
			else
			{
				lcd_send(DATA, t[i]);
			}
		}
	}
}
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

tux писал(а):
Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.
Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.
Код цифры = цифра + 0x30
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

на асме проще выделять из числа единицы
Интересно, чем проще ?
Покажите простой пример выделения десяток тысяч, тысяч, сотен, десяток и единиц из 2-х байтового числа.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Триод писал(а):
vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.
Код цифры = цифра + 0x30
Функция именно этим и занимается самый простой способ взять эту функцию, откомпилить и посмотреть как она в асме выглядит.
Контактная информация:
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток

Сообщение tux »

А не мог бы кто нибудь кинуть пример такого преобразования на ассемблере? А то не нашел нигде доступного для моего понимания
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Переходите на си, или давайте свои примеры разберем вместе.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

вы про это?

Код: Выделить всё

ascii2num:
				; num = ascii - 0x30;
				subi r24, 48
				ret

num2ascii:
				; ascii = num -(-0x30) = num + 0x30
				subi r24, -48
				ret
это с одним разрядом

а это ковыряйте сами
http://www.avr-asm-tutorial.net/avr_en/ ... ml#asc2bin
http://www.avr-asm-tutorial.net/avr_en/ ... ml#bin2asc
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
tux
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Чт сен 20, 2012 11:57:28
Откуда: Владивосток

Сообщение tux »

Спасибо. Попробую разобраться
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Ср окт 19, 2011 23:28:03

Сообщение vetdoktor »

Кто сталкивался с подобной проблемой. Собираю штуку СД дата логгер, http://www.rlocman.ru/shem/schematics.html?di=105924 собрал, захотелось прикрутить к нему лсд дисплей1602, к исходнику добавил библиотеку , чтобы можно было подключать к разным пинам мк лсд. вот из этой статьи взял http://www.rlocman.ru/shem/schematics.html?di=112664 . Проверил в протеус - работает. А в железе нет. ЛСД фордата fdcc1602g1-fswfbw-91xr. Подключил такойже дисплей (от паяльной станции-там работает нормально) , не работает.
Неработа лсд проявляется ввиде вывода "EEE" в верхнем ряду. вместо "***" в двух рядах. Если в прошивку записать другое выводить на экран, то выводятся другие символы. Создается впечатление, что в лсд таблица шрифтов не совпадает.
Вложения
Proteus.zip
(88.66 КБ) 188 скачиваний
FDCC1602G1.pdf
(245.29 КБ) 1515 скачиваний
Последний раз редактировалось vetdoktor Пн янв 14, 2013 23:19:09, всего редактировалось 1 раз.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Проверяйте замыкания между дорожками и соответствие между схемой в протеусе и реальной схемой.
Пробуйте составить таблицу- отправляйте все 255 символов на экран и составьте такую же таблицу как в даташите, возможно просто какие то ноги местами перепутаны.
Вообще по описанию сигналов похоже на контроллер HD 44780 или KS0066
для него есть тема
Контактная информация:
Ответить

Вернуться в «Периферия»