Работа с ЖКИ на контроллере HD44780 и его аналогах
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Каждый со своей колокольни смотрит) Например мой дедушка или отец даже "выставить ногу Е" не смогли бы)
Ставим плюсы: )
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
везде где идет проверка занятости надо заменить ее на задержку(чтоб индикатор успел отработать команду) ничего сложного, попробуй
да и собственный код написать слишком логики не надо - просто дергай ногами в нужной последовательности с нужными задержками согласно документации
писал для LPC2368 собственную либу для LCD - ничего мегасложного
простой пример(не заморачиваясь на конкретные команды и последовательности байтов)
да и собственный код написать слишком логики не надо - просто дергай ногами в нужной последовательности с нужными задержками согласно документации
писал для 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% коктейля "Рекурсивный"...
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Спасибо, буду пробовать.
Еще есть такой вопрос. Как мне переопределить порты в данном случае:
То есть в начале программы они у меня определены так. Потом по ходу программы мне нужно работать уже с другими ножками. Как это сделать?
Пытаюсь вот так. Не получается
Дело в том, что у меня 10 датчиков повешены на разные ножки и нужно их как-то выбирать. Прошу помощи
Еще есть такой вопрос. Как мне переопределить порты в данном случае:
Код: Выделить всё
#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 и его аналогах
думаю что так, проверить не могу
Код: Выделить всё
#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 и его аналогах
#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
когда Вы пишете Вы просто даете понять компилятору что подставить в ИСХОДНЫЙ код программы вместо ключевого слова DATA_IN. Во время компиляции он во все места программы, где написано DATA_IN подставляет PINA. (Скажу по секрету, что PINA - тоже не конечный результат, а аналогично объявленное через #define ключевое слово, за которым скрывается обычное число - адрес регистра PINA В контроллере)
В Вашем случае нужно корректировать функции, добавив в их список аргументов порты, с которыми следует работать при ее вызове.
когда Вы пишете
Код: Выделить всё
#define DATA_IN PINA В Вашем случае нужно корректировать функции, добавив в их список аргументов порты, с которыми следует работать при ее вызове.
Ставим плюсы: )
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
ibiza11 писал(а):#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
смею не согласиться
#define объявляет макрос, т.е. в теле программы соответствующие значения меняется на то что мы в дефайне зададим, неважно константа это или функция
см пример кода выше
...............
исправлено
в погоне за экспериментами хотел предложить вариант с #if, #elif, #endif, но этот вариант точно работать не будет т.к. он не работает с переменными программы и выполняется на этапе препроцессирования, т.е. именно так как писал выше ibiza11
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером. Желательно с примерами на ассемблере.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
tux писал(а):Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером.
Выводи в нужную позицию. Или я не понял вопроса?
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Триод писал(а):Выводи в нужную позицию. Или я не понял вопроса?
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.
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 и его аналогах
tux писал(а):Триод писал(а):Выводи в нужную позицию. Или я не понял вопроса?
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.
Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
vitalik_1984 писал(а):Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.
Код цифры = цифра + 0x30
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Интересно, чем проще ?на асме проще выделять из числа единицы
Покажите простой пример выделения десяток тысяч, тысяч, сотен, десяток и единиц из 2-х байтового числа.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Триод писал(а):vitalik_1984 писал(а):Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.
Код цифры = цифра + 0x30
Функция именно этим и занимается самый простой способ взять эту функцию, откомпилить и посмотреть как она в асме выглядит.
-
tux
- Первый раз сказал Мяу!
- Сообщения: 36
- Зарегистрирован: Чт сен 20, 2012 11:57:28
- Откуда: Владивосток
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
А не мог бы кто нибудь кинуть пример такого преобразования на ассемблере? А то не нашел нигде доступного для моего понимания
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Переходите на си, или давайте свои примеры разберем вместе.
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
вы про это?
это с одним разрядом
а это ковыряйте сами
http://www.avr-asm-tutorial.net/avr_en/ ... ml#asc2bin
http://www.avr-asm-tutorial.net/avr_en/ ... ml#bin2asc
Код: Выделить всё
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 и его аналогах
Спасибо. Попробую разобраться
LCD работает в протеус, а в железе нет?
Кто сталкивался с подобной проблемой. Собираю штуку СД дата логгер, http://www.rlocman.ru/shem/schematics.html?di=105924 собрал, захотелось прикрутить к нему лсд дисплей1602, к исходнику добавил библиотеку , чтобы можно было подключать к разным пинам мк лсд. вот из этой статьи взял http://www.rlocman.ru/shem/schematics.html?di=112664 . Проверил в протеус - работает. А в железе нет. ЛСД фордата fdcc1602g1-fswfbw-91xr. Подключил такойже дисплей (от паяльной станции-там работает нормально) , не работает.
Неработа лсд проявляется ввиде вывода "EEE" в верхнем ряду. вместо "***" в двух рядах. Если в прошивку записать другое выводить на экран, то выводятся другие символы. Создается впечатление, что в лсд таблица шрифтов не совпадает.
Неработа лсд проявляется ввиде вывода "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 работает в протеус, а в железе нет?
Проверяйте замыкания между дорожками и соответствие между схемой в протеусе и реальной схемой.
Пробуйте составить таблицу- отправляйте все 255 символов на экран и составьте такую же таблицу как в даташите, возможно просто какие то ноги местами перепутаны.
Вообще по описанию сигналов похоже на контроллер HD 44780 или KS0066
для него есть тема
Пробуйте составить таблицу- отправляйте все 255 символов на экран и составьте такую же таблицу как в даташите, возможно просто какие то ноги местами перепутаны.
Вообще по описанию сигналов похоже на контроллер HD 44780 или KS0066
для него есть тема