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

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

Добавлено: Сб сен 17, 2016 13:11:04
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)
 {

 }
}

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

Добавлено: Сб окт 29, 2016 20:58:22
RU3DDM
Друзья! Взаимозаменяемы ли lcd модули wh1601 и mdls16166? Оба на контроллере hd44780, 16x1 символов, меня смущает что в даташите на mdls16166 написано следующее: electricalle configured as 8 characters x 2 lines. Аналогично ли это 2-line display mode для wh1601?
Не пинайте сильно, "плаваю" в этих вопросах.
Пдф на mdls16166 прилагаю.

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

Добавлено: Сб окт 29, 2016 21:01:13
СКАЗОЧНИК
Да. Должны заменяться.

Просто 8 знаков и две строки это тоже самое, что 16 знаков в одну строку (если память мне не изменяет). И вывод на все 16 знаковые подразумевает вывод на двустрочный 8 знаковый... Надеюсь не запутал. :)))

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

Добавлено: Сб окт 29, 2016 21:11:54
RU3DDM
Спасибо за ответ! Буду значит на этот дисплей расчитывать, есть WH1601L но он Large действительно, великоват для моей задумки.

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

Добавлено: Сб окт 29, 2016 21:17:11
СКАЗОЧНИК
Контроллеры у дисплеев одинаковые. Инициализация тоже одинаковая. Тут больше смотрят на наличие в контроллере нужного языка для вывода на ЖКИ.

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

Добавлено: Сб окт 29, 2016 21:36:32
RU3DDM
А вот насчет поддержки языка- хз, сняты с кассовых аппаратов, надеюсь латиница есть, пробовать буду.

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

Добавлено: Вс дек 11, 2016 21:13:21
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мсек. в программе как-то напрягает.
Может это кому-то и примитивно ,но я только учусь.

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

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

Про задержку в 1.6 мс. не понял.

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

Добавлено: Пн дек 12, 2016 04:23:33
akl
lionberger писал(а): Задержка в 1,6мсек. в программе как-то напрягает.
Ничего не поделаешь, это самая длинная по времени выполнения операция.
hd44780.PNG
(37.21 КБ) 444 скачивания
lionberger писал(а):или это делается другим образом ?
Как вариант, сделать в ОЗУ образ экрана, *заполнить его кодом 0x20 ' ', в нужном месте заполнить текстом и вывести. При смене индикации опять начать со *.

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

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

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

Добавлено: Вт дек 13, 2016 17:29:17
lionberger
Про задержку в 1.6 мс. не понял.[/quote]
Будет-ли задержка влиять на выполнение главной программы,если в ее теле будет,например,еще и какой-то ногодрыг ?Или дрыги разносить на прерывания ?

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

Добавлено: Ср дек 14, 2016 01:18:28
abc
lionberger писал(а):Будет-ли задержка влиять на выполнение главной программы,если в ее теле будет,например,еще и какой-то ногодрыг ?Или дрыги разносить на прерывания ?
Не надо ничего никуда разносить. Достаточно сделать так, чтоб МК вообще не трогал дисплей в теч. этих самых 1.6мс.

Но
ARV писал(а):сначала символы выводимой строки, а если их меньше 16, то остальные пробелы.
- самое грамотное решение.

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

Добавлено: Ср дек 14, 2016 01:53:36
MOHCTEP
Еще вариант - "подместись" пробелами в нужном месте и, потом, туда уже вставлять изменяющуюся информацию.
Вот кусок кода, для примера:

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

lcd_gotoxy(11,0);//место вывода инфы
		lcd_string("     ");//стираем старые данные
		count=cap>sns0?0:sns0-cap<2?0:sns0-cap;//обновляем чего-то там...
		lcd_gotoxy(11,0);//обратно на место вывода инфы
		lcd_number(count);//показываем чего-то там...

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

Добавлено: Ср дек 14, 2016 06:34:14
WiseLord
Если такое делать в основном цикле программы получится мерцание знакомест.

Стирать и чуть позже что-то выводить можно только если делать это только по каким-то событиям.

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

Добавлено: Ср дек 14, 2016 11:22:14
Мурато Мяуконни
Сформируйте одну или две строки в памяти, обновляя инфу, а потом целиком за один раз выведите её в дисплей.
Выделите в озу под дисплей 16-32 байта (по количеству символов) и меняйте инфу только в озу, а на дисплей выводите за раз готовое.
Тогда не будет никакого мерцания.

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

Добавлено: Пн дек 26, 2016 16:53:33
trengtor
Не встречал ли кто списка команд HD44780 с указанным временем (продолжительностью) их выполнения контроллером/дисплеем?

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

Добавлено: Пн дек 26, 2016 18:14:22
Мурато Мяуконни
Встречали, еще как встречали. Первый попавшийся документ: 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 мкс. Не знаю, я вместо этой команды всегда применял переход на заданную позицию.

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

Добавлено: Пн дек 26, 2016 21:07:28
trengtor
Мурато Мяуконни писал(а):Встречали, еще как встречали.
Спасибо!

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

Добавлено: Чт янв 05, 2017 08:45:35
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;

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

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

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