Работа с ЖКИ на контроллере 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% коктейля "Рекурсивный"...
- Сообщения: 64
- Зарегистрирован: Пт янв 16, 2009 23:27:49
Спасибо, буду пробовать.
Еще есть такой вопрос. Как мне переопределить порты в данном случае:
То есть в начале программы они у меня определены так. Потом по ходу программы мне нужно работать уже с другими ножками. Как это сделать?
Пытаюсь вот так. Не получается
Дело в том, что у меня 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;};думаю что так, проверить не могу
Код: Выделить всё
#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% коктейля "Рекурсивный"...
#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
когда Вы пишете Вы просто даете понять компилятору что подставить в ИСХОДНЫЙ код программы вместо ключевого слова DATA_IN. Во время компиляции он во все места программы, где написано DATA_IN подставляет PINA. (Скажу по секрету, что PINA - тоже не конечный результат, а аналогично объявленное через #define ключевое слово, за которым скрывается обычное число - адрес регистра PINA В контроллере)
В Вашем случае нужно корректировать функции, добавив в их список аргументов порты, с которыми следует работать при ее вызове.
когда Вы пишете
Код: Выделить всё
#define DATA_IN PINA В Вашем случае нужно корректировать функции, добавив в их список аргументов порты, с которыми следует работать при ее вызове.
Ставим плюсы: )
- Реклама
смею не согласитьсяibiza11 писал(а):#define - опция компилятора. Она используется только на этапе компиляции. Во время работы программы в контроллере нельзя переопределить константы)
#define объявляет макрос, т.е. в теле программы соответствующие значения меняется на то что мы в дефайне зададим, неважно константа это или функция
см пример кода выше
...............
исправлено
в погоне за экспериментами хотел предложить вариант с #if, #elif, #endif, но этот вариант точно работать не будет т.к. он не работает с переменными программы и выполняется на этапе препроцессирования, т.е. именно так как писал выше ibiza11
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером. Желательно с примерами на ассемблере.
- Сообщения: 160
- Зарегистрирован: Сб дек 08, 2012 16:40:40
Выводи в нужную позицию. Или я не понял вопроса?tux писал(а):Мне нужно вывести значение некоего счетчика на дисплей. Как это правильно сделать? Статично то LCD выводит символы, хотелось бы разобраться как выводить на дисплей значения после их обработки контроллером.
Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
- Сообщения: 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]);
}
}
}
}
Вам нужно преобразовать число в символы, тогда будет нормально выводитьtux писал(а):Ну насколько я понимаю, коды символов дисплея не совпадают со значениями, которые выводит счетчик. Или не? Он мне чушь в общем выводит.Триод писал(а): Выводи в нужную позицию. Или я не понял вопроса?
функция itoa();
- Сообщения: 160
- Зарегистрирован: Сб дек 08, 2012 16:40:40
ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
Код цифры = цифра + 0x30
Интересно, чем проще ?на асме проще выделять из числа единицы
Покажите простой пример выделения десяток тысяч, тысяч, сотен, десяток и единиц из 2-х байтового числа.
Функция именно этим и занимается самый простой способ взять эту функцию, откомпилить и посмотреть как она в асме выглядит.Триод писал(а):ИМХО, на асме проще выделять из числа единицы, десятки, сотни итд и выводить их отдельно.vitalik_1984 писал(а): Вам нужно преобразовать число в символы, тогда будет нормально выводить
функция itoa();
Код цифры = цифра + 0x30
А не мог бы кто нибудь кинуть пример такого преобразования на ассемблере? А то не нашел нигде доступного для моего понимания
Переходите на си, или давайте свои примеры разберем вместе.
вы про это?
это с одним разрядом
а это ковыряйте сами
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% коктейля "Рекурсивный"...
Спасибо. Попробую разобраться
- Сообщения: 30
- Зарегистрирован: Ср окт 19, 2011 23:28:03
Кто сталкивался с подобной проблемой. Собираю штуку СД дата логгер, 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 КБ) 188 скачиваний
-
- FDCC1602G1.pdf
- (245.29 КБ) 1515 скачиваний
Последний раз редактировалось vetdoktor Пн янв 14, 2013 23:19:09, всего редактировалось 1 раз.
Проверяйте замыкания между дорожками и соответствие между схемой в протеусе и реальной схемой.
Пробуйте составить таблицу- отправляйте все 255 символов на экран и составьте такую же таблицу как в даташите, возможно просто какие то ноги местами перепутаны.
Вообще по описанию сигналов похоже на контроллер HD 44780 или KS0066
для него есть тема
Пробуйте составить таблицу- отправляйте все 255 символов на экран и составьте такую же таблицу как в даташите, возможно просто какие то ноги местами перепутаны.
Вообще по описанию сигналов похоже на контроллер HD 44780 или KS0066
для него есть тема


