Страница 60 из 123

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

Добавлено: Чт дек 27, 2012 15:08:38
ibiza11
Каждый со своей колокольни смотрит) Например мой дедушка или отец даже "выставить ногу Е" не смогли бы)

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

Добавлено: Чт дек 27, 2012 18:50:40
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); //задержка вместо проверки занятости
}

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

Добавлено: Чт дек 27, 2012 20:09:04
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 датчиков повешены на разные ножки и нужно их как-то выбирать. Прошу помощи

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

Добавлено: Чт дек 27, 2012 23:47:43
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;
				}

	//и т.д.

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

Добавлено: Пт дек 28, 2012 08:26:36
ibiza11
#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
когда Вы пишете

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

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

В Вашем случае нужно корректировать функции, добавив в их список аргументов порты, с которыми следует работать при ее вызове.

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

Добавлено: Пт дек 28, 2012 14:52:29
unalex
ibiza11 писал(а):#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
смею не согласиться
#define объявляет макрос, т.е. в теле программы соответствующие значения меняется на то что мы в дефайне зададим, неважно константа это или функция
см пример кода выше
...............
исправлено
в погоне за экспериментами хотел предложить вариант с #if, #elif, #endif, но этот вариант точно работать не будет т.к. он не работает с переменными программы и выполняется на этапе препроцессирования, т.е. именно так как писал выше ibiza11

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

Добавлено: Пн янв 07, 2013 11:16:08
tux
Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером. Желательно с примерами на ассемблере.

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

Добавлено: Пн янв 07, 2013 12:24:17
Триод
tux писал(а):Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером.
Выводи в нужную позицию. Или я не понял вопроса?

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

Добавлено: Пн янв 07, 2013 12:51:44
tux
Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.

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

Добавлено: Пн янв 07, 2013 13:18:23
Триод
Вот кусок кода на С, который выводит правильные символы:
Спойлер

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

#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]);
			}
		}
	}
}

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

Добавлено: Пн янв 07, 2013 13:25:06
vitalik_1984
tux писал(а):
Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.
Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();

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

Добавлено: Пн янв 07, 2013 13:34:32
Триод
vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.
Код цифры = цифра + 0x30

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

Добавлено: Пн янв 07, 2013 14:15:51
Аlex
на асме проще выделять из числа единицы
Интересно, чем проще ?
Покажите простой пример выделения десяток тысяч, тысяч, сотен, десяток и единиц из 2-х байтового числа.

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

Добавлено: Пн янв 07, 2013 14:27:33
vitalik_1984
Триод писал(а):
vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.
Код цифры = цифра + 0x30
Функция именно этим и занимается самый простой способ взять эту функцию, откомпилить и посмотреть как она в асме выглядит.

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

Добавлено: Вт янв 08, 2013 02:50:25
tux
А не мог бы кто нибудь кинуть пример такого преобразования на ассемблере? А то не нашел нигде доступного для моего понимания

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

Добавлено: Вт янв 08, 2013 03:33:12
vitalik_1984
Переходите на си, или давайте свои примеры разберем вместе.

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

Добавлено: Вт янв 08, 2013 04:21:12
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

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

Добавлено: Вт янв 08, 2013 05:14:25
tux
Спасибо. Попробую разобраться

LCD работает в протеус, а в железе нет?

Добавлено: Пн янв 14, 2013 21:32:00
vetdoktor
Кто сталкивался с подобной проблемой. Собираю штуку СД дата логгер, http://www.rlocman.ru/shem/schematics.html?di=105924 собрал, захотелось прикрутить к нему лсд дисплей1602, к исходнику добавил библиотеку , чтобы можно было подключать к разным пинам мк лсд. вот из этой статьи взял http://www.rlocman.ru/shem/schematics.html?di=112664 . Проверил в протеус - работает. А в железе нет. ЛСД фордата fdcc1602g1-fswfbw-91xr. Подключил такойже дисплей (от паяльной станции-там работает нормально) , не работает.
Неработа лсд проявляется ввиде вывода "EEE" в верхнем ряду. вместо "***" в двух рядах. Если в прошивку записать другое выводить на экран, то выводятся другие символы. Создается впечатление, что в лсд таблица шрифтов не совпадает.

Re: LCD работает в протеус, а в железе нет?

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