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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
ABTORO6OT
Родился
Сообщения: 1
Зарегистрирован: Сб мар 05, 2011 22:15:13

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

Сообщение ABTORO6OT »

Здравствуйте. Необходимо подцепить дисплей к камню STM8S, на отладке он работает, но есть некоторая проблема которую в упор я не вижу.
На камне STM8S105C6 данный код работает прекрасно, вывод всего что нужно на нем можно реализовать, но при заливке его же на STM8S003K3 получилось что DB4 никаких признаков жизни не проявляет, попробовал перенаправить на другую ногу тоже ноль эмоций. Потом опять перешил на 105 и там всё тоже самое, при переопределении ничего не показывает.
Прогать только начинаю и к сожалению примеров не нашёл практически на IAR под STM8
Буду благодарен за любую помощь.

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

 
#include "iostm8s105c6.h"

#define RS PD_ODR_bit.ODR7//0-запись команд, 1-запись данных сигнал RD
#define E  PD_ODR_bit.ODR5//Ввод данных по спадающему фронту сигнал Е
#define DB4 PD_ODR_bit.ODR6//Определение линий 4-х битного интерфейса DB4
#define DB5 PD_ODR_bit.ODR4//Определение линий 4-х битного интерфейса DB5
#define DB6 PD_ODR_bit.ODR2//Определение линий 4-х битного интерфейса DB6
#define DB7 PD_ODR_bit.ODR0//Определение линий 4-х битного интерфейса DB7
//*****************************************************************************
char time=30;//Базовая задержка времени для LCD(зависит от тактовой частоты MCU)

//*****************************************************************************
void delay(int a)//Функция задержки
{int cnt;
 for (cnt=a; cnt>0; cnt--);
}
//*****************************************************************************
void lcd(char d)//Функция записи команд/данных в LCD
 {E=1;
  DB7=(d&0x80)>>7;//Выводим старший ниббл
  DB6=(d&0x40)>>6;
  DB5=(d&0x20)>>5;
  DB4=(d&0x10)>>4;
  delay(time);//Задержка
  E=0;//Запись
  delay(time);//Задержка
  E=1;//enable = 1
  DB7=(d&0x08)>>3;//Выводим младший ниббл
  DB6=(d&0x04)>>2;
  DB5=(d&0x02)>>1;
  DB4=(d&0x01);
  delay(time);//Задержка
  E=0;//Запись
  delay(time);//Пауза для выполнения команды
 }
//*****************************************************************************
void lcd_com(char c)//Фунция записи команд в LCD
{RS=0;//Режим записи "Команды"
lcd(c);//Запись
}
//*****************************************************************************
void lcd_putchar(char d)//Функция записи данных в LCD
{RS=1;//Режим записи "Данные"
lcd(d);//Запись
 }
//*****************************************************************************
void lcd_clear(void)//Функция очистки LCD
{lcd_com(0x01); delay(time*100);//Очистка LCD
}
//*****************************************************************************
void lcd_init(void)//Функция инициализации LCD
{delay(time*10);//Предварительная задержка
 lcd_com(0x33); delay(time*50);//Подготовка
 lcd_com(0x32); lcd_com(0x28);//4 бита, 2 строки
 lcd_com(0x08);//Выключение LCD
 lcd_clear();//Очистка LCD
 lcd_com(0x06);//Сдвиг курсора вправо
 lcd_com(0x0C);//Включение без курсора
 delay(time);//Пауза для выполнения команды
}
//*****************************************************************************
void lcd_putsf(char *_str)//Функция вывода строки на LCD
{char data;
while (*_str) {data=*_str++; lcd_putchar(data);}
}
//*****************************************************************************
void lcd_gotoxy(char x, char y)//Функция перехода в указанную позицию
{lcd_com((0x80+y*64)+x);//Рассчет позиции. Ячейка 0х80 - лев. верхн. угол
}
//*****************************************************************************
//*****************************************************************************
// Основная программа
 int main( void )
{   //Настройка портов ввода/вывода
    PD_DDR_bit.DDR7=1;//Настройка сигнала RS бит 7 порта D на вывод
    PD_CR1_bit.C17=1;//Установка регистра CR1 бит 7 порта D как "двухтактный выход"(см. Datasheet)
    PD_DDR_bit.DDR5=1;//Настройка сигнала Е бит 5 порта D на вывод
    PD_CR1_bit.C15=1;//Установка регистра CR1 бит 5 порта D как "двухтактный выход"(см. Datasheet)
    PD_DDR_bit.DDR6=1;//Настройка сигнала DB4 бит 6 порта D на вывод 
    PD_CR1_bit.C16=1;//Установка регистра CR1 бит 6 порта D как "двухтактный выход"(см. Datasheet)
    PD_DDR_bit.DDR4=1;//Настройка сигнала DB5 бит 4 порта D на вывод
    PD_CR1_bit.C14=1;//Установка регистра CR1 бит 4 порта D как "двухтактный выход"(см. Datasheet)
    PD_DDR_bit.DDR2=1;//Настройка сигнала DB5 бит 2 порта D на вывод
    PD_CR1_bit.C12=1;//Установка регистра CR1 бит 2 порта D как "двухтактный выход"(см. Datasheet)
    PD_DDR_bit.DDR0=1;//Настройка сигнала DB6 бит 0 порта D на вывод
    PD_CR1_bit.C10=1;//Установка регистра CR1 бит 0 порта D как "двухтактный выход"(см. Datasheet)
//*****************************************************************************
lcd_init();
lcd_gotoxy(2,0);//Переходим в позицию LCD x=2, y=0
lcd_putsf("QWERTY");//Вывод на дисплей текста
lcd_gotoxy(2,1);//Переходим в позицию LCD x=0, y=0
lcd_putsf("100.5");//Вывод на дисплей текста
lcd_gotoxy(8,1);//Переходим в позицию LCD x=0, y=0
lcd_putsf("50");//Вывод на дисплей текста
    while(1)
 {

 }
}
RU3DDM
Опытный кот
Сообщения: 770
Зарегистрирован: Сб авг 15, 2015 19:11:26
Откуда: Коломна, М.О. - Воронеж.

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

Сообщение RU3DDM »

Друзья! Взаимозаменяемы ли lcd модули wh1601 и mdls16166? Оба на контроллере hd44780, 16x1 символов, меня смущает что в даташите на mdls16166 написано следующее: electricalle configured as 8 characters x 2 lines. Аналогично ли это 2-line display mode для wh1601?
Не пинайте сильно, "плаваю" в этих вопросах.
Пдф на mdls16166 прилагаю.
Вложения
MDLS_16166.pdf
(574.04 КБ) 172 скачивания
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Да. Должны заменяться.

Просто 8 знаков и две строки это тоже самое, что 16 знаков в одну строку (если память мне не изменяет). И вывод на все 16 знаковые подразумевает вывод на двустрочный 8 знаковый... Надеюсь не запутал. :)))
Станислав
RU3DDM
Опытный кот
Сообщения: 770
Зарегистрирован: Сб авг 15, 2015 19:11:26
Откуда: Коломна, М.О. - Воронеж.

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

Сообщение RU3DDM »

Спасибо за ответ! Буду значит на этот дисплей расчитывать, есть WH1601L но он Large действительно, великоват для моей задумки.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Контроллеры у дисплеев одинаковые. Инициализация тоже одинаковая. Тут больше смотрят на наличие в контроллере нужного языка для вывода на ЖКИ.
Станислав
RU3DDM
Опытный кот
Сообщения: 770
Зарегистрирован: Сб авг 15, 2015 19:11:26
Откуда: Коломна, М.О. - Воронеж.

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

Сообщение RU3DDM »

А вот насчет поддержки языка- хз, сняты с кассовых аппаратов, надеюсь латиница есть, пробовать буду.
lionberger
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб окт 09, 2010 08:45:42

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

Сообщение lionberger »

Добрый вечер.Помогите советом.При выводе на экран в while (1) ,например, двух строчек текста разной длинны через определенное время , во втором случае (короткая строка) на пустых знакоместах остается текст из первой строчки.
goto_cursor(0x00);
lcd_send_str("йЙцЦуУкКеЕнНгГ");
HAL_Delay(5000);
goto_cursor(0x00);
lcd_send_str("fgfgfgg");

Стоит ли очищать экран каждый раз таким макаром ?
#define lcd_CLEARDISPLAY 0x01

lcd_write_command(lcd_CLEARDISPLAY);
delay_us(1600);

или это делается другим образом ? Задержка в 1,6мсек. в программе как-то напрягает.
Может это кому-то и примитивно ,но я только учусь.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

lionberger писал(а):Может это кому-то и примитивно
Это не примитивно, это логично.
Если у Вас, к примеру, лежит на столе 16 коробочек, заполненных каким-то содержимым, и в нескольких коробочках Вы меняете содержимое на другое, то с какой стати содержимое остальных изменится ?

Про задержку в 1.6 мс. не понял.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

lionberger писал(а): Задержка в 1,6мсек. в программе как-то напрягает.
Ничего не поделаешь, это самая длинная по времени выполнения операция.
hd44780.PNG
(37.21 КБ) 439 скачиваний

lionberger писал(а):или это делается другим образом ?
Как вариант, сделать в ОЗУ образ экрана, *заполнить его кодом 0x20 ' ', в нужном месте заполнить текстом и вывести. При смене индикации опять начать со *.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

lionberger писал(а):или это делается другим образом ?
лично я в некоторых случаях пишу дополнительную функцию вывода, которая всегда выводит 16 (или сколько там знакомест в строке) символов: сначала символы выводимой строки, а если их меньше 16, то остальные пробелы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
lionberger
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб окт 09, 2010 08:45:42

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

Сообщение lionberger »

Про задержку в 1.6 мс. не понял.[/quote]
Будет-ли задержка влиять на выполнение главной программы,если в ее теле будет,например,еще и какой-то ногодрыг ?Или дрыги разносить на прерывания ?
Аватара пользователя
abc
Друг Кота
Сообщения: 3677
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

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

Сообщение abc »

lionberger писал(а):Будет-ли задержка влиять на выполнение главной программы,если в ее теле будет,например,еще и какой-то ногодрыг ?Или дрыги разносить на прерывания ?

Не надо ничего никуда разносить. Достаточно сделать так, чтоб МК вообще не трогал дисплей в теч. этих самых 1.6мс.

Но
ARV писал(а):сначала символы выводимой строки, а если их меньше 16, то остальные пробелы.
- самое грамотное решение.
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

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

Сообщение MOHCTEP »

Еще вариант - "подместись" пробелами в нужном месте и, потом, туда уже вставлять изменяющуюся информацию.
Вот кусок кода, для примера:

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

lcd_gotoxy(11,0);//место вывода инфы
      lcd_string("     ");//стираем старые данные
      count=cap>sns0?0:sns0-cap<2?0:sns0-cap;//обновляем чего-то там...
      lcd_gotoxy(11,0);//обратно на место вывода инфы
      lcd_number(count);//показываем чего-то там...
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Если такое делать в основном цикле программы получится мерцание знакомест.

Стирать и чуть позже что-то выводить можно только если делать это только по каким-то событиям.
Мурато Мяуконни
Прорезались зубы
Сообщения: 203
Зарегистрирован: Сб ноя 19, 2016 21:05:48

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

Сообщение Мурато Мяуконни »

Сформируйте одну или две строки в памяти, обновляя инфу, а потом целиком за один раз выведите её в дисплей.
Выделите в озу под дисплей 16-32 байта (по количеству символов) и меняйте инфу только в озу, а на дисплей выводите за раз готовое.
Тогда не будет никакого мерцания.
Подпись убрал вместе с автором. aen
Аватара пользователя
trengtor
Сверлит текстолит когтями
Сообщения: 1299
Зарегистрирован: Вт мар 31, 2015 22:56:07
Откуда: Мы люди простые, живем в лесу, на пенек молимся
Контактная информация:

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

Сообщение trengtor »

Не встречал ли кто списка команд HD44780 с указанным временем (продолжительностью) их выполнения контроллером/дисплеем?
Изображение
Мурато Мяуконни
Прорезались зубы
Сообщения: 203
Зарегистрирован: Сб ноя 19, 2016 21:05:48

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

Сообщение Мурато Мяуконни »

Встречали, еще как встречали. Первый попавшийся документ: http://www.melt.com.ru/pdf/mt-16s2h.pdf
Такой же есть и для Винстаров - http://z.compel.ru/item-pdf/d5b376fadc4 ... gh-ctk.pdf
Все команды, за исключением двух, выполняются за 39-41 мкс, а две - очистка дисплея и возврат курсора на нулевую позицию - за 1,5 - 1,6 мс. МЭЛТ правда обещает возврат курсора за 40 мкс. Не знаю, я вместо этой команды всегда применял переход на заданную позицию.
Подпись убрал вместе с автором. aen
Аватара пользователя
trengtor
Сверлит текстолит когтями
Сообщения: 1299
Зарегистрирован: Вт мар 31, 2015 22:56:07
Откуда: Мы люди простые, живем в лесу, на пенек молимся
Контактная информация:

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

Сообщение trengtor »

Мурато Мяуконни писал(а):Встречали, еще как встречали.

Спасибо!
Изображение
Аватара пользователя
trengtor
Сверлит текстолит когтями
Сообщения: 1299
Зарегистрирован: Вт мар 31, 2015 22:56:07
Откуда: Мы люди простые, живем в лесу, на пенек молимся
Контактная информация:

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

Сообщение trengtor »

Пробую написать сою библиотеку для LCD. Увяз на инициализации, думаю, что нужна помощь зала. Вот такой код модуля (для mikroPascal). Формально все требования соблюдены, но не работает. Задержками играл – не помогло.
Выводы МК в программе назначены корректно.

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

var
  ULCD_RS : sbit; sfr; external;
  ULCD_EN : sbit; sfr; external;
  ULCD_D7 : sbit; sfr; external;
  ULCD_D6 : sbit; sfr; external;
  ULCD_D5 : sbit; sfr; external;
  ULCD_D4 : sbit; sfr; external;
  ULCD_RS_Direction : sbit; sfr; external;
  ULCD_EN_Direction : sbit; sfr; external;
  ULCD_D7_Direction : sbit; sfr; external;
  ULCD_D6_Direction : sbit; sfr; external;
  ULCD_D5_Direction : sbit; sfr; external;
  ULCD_D4_Direction : sbit; sfr; external;

procedure Strobe_EN;
begin
  Delay_1us;
  ULCD_EN := 1;
  Delay_1us;
  Delay_1us;
  ULCD_EN := 0;
  Delay_1us;
end;

procedure Send_Nibble(N:byte);
begin
  ULCD_D4 := N.0;
  ULCD_D5 := N.1;
  ULCD_D6 := N.2;
  ULCD_D7 := N.3;
  Strobe_EN;
end;

procedure ULCD_Init;
begin
  // Задержка для установления питания
  Delay_ms(500);
  // Управляющие сигналы
  ULCD_RS := 0;
  ULCD_EN := 0;
  // Разрядность 8
  Send_Nibble(0x03);
  Delay_ms(5);
  // Разрядность 8
  Strobe_EN;
  Delay_us(120);
  // Разрядность 8
  Strobe_EN;
  Delay_us(40);
  // Разрядность 4
  Send_Nibble(0x02);
  Delay_us(40);
  // Разрядность 4 и параметры (2 строки, дисплей включен)
  Strobe_EN;
  Send_Nibble(0x0C);
  Delay_us(40);
  // Выключение дисплея
  Send_Nibble(0x00);
  Send_Nibble(0x0E);
  Delay_us(40);
  // Очистка дисплея
  Send_Nibble(0x00);
  Send_Nibble(0x01);
  Delay_ms(2);
  // Выбор режима ввода данных
  Send_Nibble(0x00);
  Send_Nibble(0x06);
  Delay_us(40);
end;
Изображение
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Send_Nibble(0x0C); - не совсем понятно это. Почему 0x0C? Нестандартный (не 5x8 символы) дисплей? По идее, 1) там должно быть 0x08, 2) прямо перед этим ещё одно 0x02, уже в 4-х битном режиме, ранее установленном.

P.S. по 2-му пункту, наверное, неправ - там уже есть строб.
Ответить

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