Опять здравствуйте. Вчера я захотел к своему проекту прифигачить дисплей, он на 44780, к ATmega8. Следуя инструкциям я перепробовал много вариантов, которые находил в инете, но т.к. реализовать это хотелось самому - не во всех мог легко разобраться. Да и волновал то меня только принцип работы. Сделать я это решил на 8-битной шине т.к. проще.
В официальной документации я вычитал, что если дать дисплею время на запуск, то он дефолтно выставит параметры работы. Так я и сделал. К тому же всему проверяю Busy flag. Но почему-то желанная буква так и не появляется на экране, а протеус вываливает в лог 7 сообщений "logic contention(s)". В чем же проблема? Спасибо.
P.S. Делал согласно http://easyelectroni...ya-hd44780.html
Прикрепил прошивку, проект для протеуса и доки.
Раздел: AVR
#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