Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: lcd 4470 avr
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
demsp
Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея
Код
#include <avr/io.h>
#define F_CPU 16000000UL //16MHz
#include <util/delay.h>

int main(void) {
DDRD = 0b11111100;
PORTD = 0b00000000;
_delay_ms(20);         //задержка 20ms
PORTD = 0b0011 0000;   //PD4=1; PD5=1;
PORTD = 0b0000 1000;   //E=1;
// тут нужна задержка?
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);         //задержка 40us
PORTD = 0b0000 1000;   //E=1;
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);         //задержка 40us
PORTD = 0b0000 1000;   //E=1;
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);         //задержка 40us
PORTD = 0b0010 0000;   //PD5=1;
PORTD = 0b0000 1000;   //E=1;
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);        
// ...
}


A=PD2 (RS)
E=PD3
DB4=PD4
DB5=PD5
DB6=PD6
DB7=PD7

Нажмите для просмотра прикрепленного файла
kovigor
Цитата(demsp @ Jun 28 2018, 21:57) *
Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея

Запросто, лишь бы подавать их в соответствии с временной диаграммой, нарисованной в даташите. Только зачем ? В CodeVision этот дисплей, насколько я помню, поддерживается, все уже написано и отлажено ...
Сергей Борщ
QUOTE (demsp @ Jun 28 2018, 21:57) *
Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея
Можно. Задержка нужна, согласно документации не менее 450 нс.
QUOTE
CODE
PORTD = 0b0011 0000;   //PD4=1; PD5=1;
PORTD = 0b0000 1000;   //E=1;
Вот только тут второй строчкой вы сбросили PD4 и PD5, а они должны удерживаться пока E=1.

QUOTE (kovigor @ Jun 29 2018, 00:50) *
Только зачем ? В CodeVision этот дисплей,
Может затем, что автор использует gcc, а не компилятор "языка, похожего на Си"?
demsp
Спасибо, но пока не работает ((
Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на DB4-DB7 "после положительного фронта" на входе Е (подаём 1 на Е, задержка, подаем 1 на DB4-DB7, подаём 0 на Е (запись по спаду), задержка, подаем 0 на DB4-DB7), т.е. должно быть так (в 4bit режиме)
Код
int main(void) {
DDRD = 0b11111100;
PORTD = 0b00000000;
_delay_ms(20);         //задержка 20ms после подачи питания
PORTD = 0b0000 1000;   //E=1;
_delay_us(40);         //задержка 40us
PORTD = 0b0011 1000;   //PD4=1; PD5=1; E=1;
_delay_us(40);         //задержка 40us
PORTD = 0b0011 0000;   //PD4=1; PD5=1; E=0; (запись по спаду)
_delay_us(40);         //задержка 40us
PORTD = 0b0000 0000;
...
}


Так правильно?
Сергей Борщ
QUOTE (demsp @ Jun 29 2018, 15:29) *
Спасибо, но пока не работает ((
Такое бывает. Могу порекомендовать купить на али 8-канальный логический анализатор, он рублей 300 стоит сейчас. Очень помогает в подобных случаях - записал диаграмму и сиди себе, рассматривай, времянки измеряй или даже передаваемые данные рассматривай (софт имеет декодеры многих протоколов передачи). Конечно, пока он приедет, вы эту задачу десять раз решить успеете, но к следующей уже будете во всеоружии.

QUOTE (demsp @ Jun 29 2018, 15:29) *
Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на DB4-DB7 "после фронта" на Е (подаём 1 на Е, задержка, подаем 1 на DB4-DB7, подаём 0 на Е (запись по спаду), задержка, подаем 0 на DB4-DB7),
Да, вы правы, а я подзабыл уже. И ноль на DB4-DB7 можно не подавать, можно сразу же следующие данные выставлять.
QUOTE (demsp @ Jun 29 2018, 15:29) *
Так правильно?
Да, на первый взгляд выглядит правильно. Задержка после E=1 не нужна - по документации задержка от установки данных до E=0 не менее 195 нс, а это меньше времени записи в порт для AVR на макисальной часоте. Длительность E=1 не менее 450 нс тоже получается автоматически без дополнительных задержек (тут я какую-то ерунду написал, не читайте. Это для PIC16F84 на 4 МГц было справедливо). Задержку после E=1 и перед E=0 достаточно сделать по 1 мкс. А вот остальные задержки маловаты. Глянул в свои исходники - после включения питания 200 мс, после первой и второй записи DB6=1, DB7=1 по 50 мс, после третьей записи DB6=1, DB7=1 и после DB6=0, DB7=1 - по 100 мкс и дальше уже по 50 мкс для всех команд кроме очистки крана и возврата курсора (они по 1.6 мс).
Сергей Борщ
Про логический анализатор перенес сюда
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.