Lcd, Proteus: Logic Contention(S)

25-07-2013, 13:47 От: admin Посмотрели: 583
Опять здравствуйте. Вчера я захотел к своему проекту прифигачить дисплей, он на 44780, к ATmega8. Следуя инструкциям я перепробовал много вариантов, которые находил в инете, но т.к. реализовать это хотелось самому - не во всех мог легко разобраться. Да и волновал то меня только принцип работы. Сделать я это решил на 8-битной шине т.к. проще.


#include <avr/io.h>
#define F_CPU 8000000L
#define RW 1
#define RS 2 //сигнал управления ЖКИ
#define E 0 // сигнал управления ЖКИ
void PAUSE(unsigned long int i){
for (i;i>0;i--);
asm("nop");
}
unsigned char BUSY_FLAG(){
DDRB = 1 << RS | 1 << RW | 1 << E; //На выход
DDRD = 0x00;//На вход
PORTB |= 0 << RS; //Комманда
PORTB |= 1 << RW; //Читаем
PORTB |= 1 << E; //Сигнал
PAUSE(14); //Жем пока LCD выведет данные
PORTB |= 0 << E; //Достаточно
return PIND7; //Выдаем результат
}
void LCD_CMD(unsigned char cmd){
while(BUSY_FLAG() == 0x01); //Ждемс пока флаг занятости будет 0
DDRD = 0xFF; //На выход
PORTD = cmd; //Пишем комманду
DDRB = 1 << RS | 1 << RW | 1 << E; //На выход
PORTB |= 0 << RS; //Комманда
PORTB |= 0 << RW; //Запись
PORTB |= 1 << E; //Подаем сигнал
PAUSE(14); //Жем пока LCD примет
PORTB |= 0 << E; //Хватит
DDRD = 0x00; //На вход (где-то рекомендовали)
DDRB = 0 << RS | 0 << RW | 0 << E; // И это тоже
}
void LCD_RECIVE(unsigned char data){
while( BUSY_FLAG() == 0x01 );//Ждемс пока флаг занятости будет 0
DDRD = 0xFF; //На выход
PORTD = data; //Пишем знак
DDRB = 1 << RS | 1 << RW | 1 << E; //На выход
PORTB |= 1 << RS; //Данные
PORTB |= 0 << RW; //Запись
PORTB |= 1 << E; //Подаем сигнал
PAUSE(14); //Жем пока LCD примет
PORTB |= 0 << E; //Хватит
DDRD = 0x00; //На вход (где-то рекомендовали)
PORTB = 0 << RS | 0 << RW | 0 << E; // И это тоже
}
//Программа иниализации ЖКИ
void LCD_INIT(){
LCD_CMD(0x3c); //8-проводный интерфейс, 5x8 размер символа
LCD_CMD(0x0c); //Показать изображение, курсор не показывать
LCD_CMD(0x01); //Очистить DDRAM и установить курсор на 0x00
}
//Основная программа
int main()
{
DDRB = 0 << RW | 0 << RS | 0 << E;
DDRD = 0x00;
PAUSE(F_CPU); //Ждем секунду, чтобы запустился дисплей
LCD_INIT(); //Инициализация
LCD_RECIVE('w');//Пусть выводит букву

while(1);

return 1;
}



В официальной документации я вычитал, что если дать дисплею время на запуск, то он дефолтно выставит параметры работы. Так я и сделал. К тому же всему проверяю Busy flag. Но почему-то желанная буква так и не появляется на экране, а протеус вываливает в лог 7 сообщений "logic contention(s)". В чем же проблема? Спасибо.

P.S. Делал согласно http://easyelectroni...ya-hd44780.html

Прикрепил прошивку, проект для протеуса и доки.

Прикрепленные файлы:




Раздел: AVR

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Lcd, Proteus: Logic Contention(S) все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031