Перейти к содержанию

lcd 4470 avr

Можно ли инициализиовать дисплей 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

 

post-102435-1530212143_thumb.png

Изменено пользователем demsp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея

Запросто, лишь бы подавать их в соответствии с временной диаграммой, нарисованной в даташите. Только зачем ? В CodeVision этот дисплей, насколько я помню, поддерживается, все уже написано и отлажено ...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея
Можно. Задержка нужна, согласно документации не менее 450 нс.

PORTD = 0b0011 0000;   //PD4=1; PD5=1;
PORTD = 0b0000 1000;   //E=1;

Вот только тут второй строчкой вы сбросили PD4 и PD5, а они должны удерживаться пока E=1.

 

Только зачем ? В CodeVision этот дисплей,
Может затем, что автор использует gcc, а не компилятор "языка, похожего на Си"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, но пока не работает ((

Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на 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;
...
}

 

Так правильно?

Изменено пользователем demsp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Спасибо, но пока не работает ((
Такое бывает. Могу порекомендовать купить на али 8-канальный логический анализатор, он рублей 300 стоит сейчас. Очень помогает в подобных случаях - записал диаграмму и сиди себе, рассматривай, времянки измеряй или даже передаваемые данные рассматривай (софт имеет декодеры многих протоколов передачи). Конечно, пока он приедет, вы эту задачу десять раз решить успеете, но к следующей уже будете во всеоружии.

 

Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на DB4-DB7 "после фронта" на Е (подаём 1 на Е, задержка, подаем 1 на DB4-DB7, подаём 0 на Е (запись по спаду), задержка, подаем 0 на DB4-DB7),
Да, вы правы, а я подзабыл уже. И ноль на DB4-DB7 можно не подавать, можно сразу же следующие данные выставлять.

Так правильно?
Да, на первый взгляд выглядит правильно. Задержка после 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 мс).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти