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

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

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

Сообщение ibiza11 »

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

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

Сообщение 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% коктейля "Рекурсивный"...
Uselock
Открыл глаза
Сообщения: 64
Зарегистрирован: Пт янв 16, 2009 23:27:49

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

Сообщение 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 датчиков повешены на разные ножки и нужно их как-то выбирать. Прошу помощи
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение 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% коктейля "Рекурсивный"...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

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

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

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

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

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

Сообщение unalex »

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


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

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

Сообщение tux »

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

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

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

tux писал(а):Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером.

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

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

Сообщение tux »

Триод писал(а):Выводи в нужную позицию. Или я не понял вопроса?

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

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

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

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

Спойлер

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

#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]);
         }
      }
   }
}
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

tux писал(а):
Триод писал(а):Выводи в нужную позицию. Или я не понял вопроса?

Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.

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

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

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

vitalik_1984 писал(а):Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();

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

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

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

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

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

Сообщение vitalik_1984 »

Триод писал(а):
vitalik_1984 писал(а):Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();

ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.
Код цифры = цифра + 0x30

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

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

Сообщение tux »

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

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

Сообщение vitalik_1984 »

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

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

Сообщение 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
Откуда: Владивосток
Контактная информация:

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

Сообщение tux »

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

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

Сообщение 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 КБ) 183 скачивания
FDCC1602G1.pdf
(245.29 КБ) 1507 скачиваний
Последний раз редактировалось vetdoktor Пн янв 14, 2013 23:19:09, всего редактировалось 1 раз.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

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

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