Объяснение в любви. Подключаем LCD к микроконтроллеру по 4-х
Вот ссылочка на замечательный документ... Сам разбирался по статье, о каторой топик, с трудом, но разобрался...
http://www.atmel.ru/Articles/Atmel17.htm
Эхх, жаль я сразу не попал туда там всё предельно разжовано, и по полачкам разложено, что и как работает у дисьплея день сэкономил-бы!
http://www.atmel.ru/Articles/Atmel17.htm
Эхх, жаль я сразу не попал туда там всё предельно разжовано, и по полачкам разложено, что и как работает у дисьплея день сэкономил-бы!
Переделал схему, сделал на меге16, прогу написал (она работает-по крайней мере в протеусе)
Но на дисплее всё равно нечего не появляется, хотя во время инициализации экран мерцает.
Что не так?
Код: Выделить всё
#include <MEGA16>
#include<delay>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTA
#endasm
#include <lcd>
void main(void)
{
PORTD=0xFF;
DDRD=0xFF;
// LCD module initialization
lcd_init(16);
lcd_putsf("Initializing...");
lcd_putchar(0);
PORTD.6=1;
delay_ms(50);
PORTD.6=0;
delay_ms(50);
while (1);
}
Но на дисплее всё равно нечего не появляется, хотя во время инициализации экран мерцает.
Что не так?
- Степаныч
- Открыл глаза
- Сообщения: 68
- Зарегистрирован: Ср июн 20, 2007 18:46:54
- Откуда: Красноярск
- Контактная информация:
Добрый день! Господа можете помочь, в общем есть ATmega32 и дисплей Winstar WH1602B!Соединены они точно по схеме из данной статьи(тоесть к порту Д только естественно на Меге)!Что нужно менять в прошивке если все это на Winstare и Меге32 причем желательно чтоб мега работала на 1 Мгц внутреннего RC. Ну понятно если на мега пашет на 1 Мгц то нужно поменять задержки для перехода в 4 битный режим(тоесть уменьшить их в 10 раз т.к. частота работы протца не 10Мгц а в 10 раз меньше).Это я понял!А вот что делать с контроллером??Если просто поменять в тексте программы заголовочные файлы(at2313 def на m32def) то компилятор выдает что то типо этого : 'Constant 0x85f out of range (0x00-0xFF)
и вторая строка: ldi Temp,RamEnd !!!
Как я понимаю это указывает что константа RamEnd каким то образом не может испоьзоваться(толи из за стека то что у всех мег есть старший и младший SPH и SPL а у at90s2313 и attiny2313 только SPL ). Подскажите плиз!!!!И с LCD не все понятно в данной теме описано что принцип работы с Winstar немного отличается от МЕЛТовских дисплеев только я так и не понял чем!!!!Напишите пожалуйста а то так охота сделать устройство а опыта работы с LCD нет!!!!
и вторая строка: ldi Temp,RamEnd !!!
Как я понимаю это указывает что константа RamEnd каким то образом не может испоьзоваться(толи из за стека то что у всех мег есть старший и младший SPH и SPL а у at90s2313 и attiny2313 только SPL ). Подскажите плиз!!!!И с LCD не все понятно в данной теме описано что принцип работы с Winstar немного отличается от МЕЛТовских дисплеев только я так и не понял чем!!!!Напишите пожалуйста а то так охота сделать устройство а опыта работы с LCD нет!!!!
IN GOD WE TRUST
Re: Объяснение в любви. Подключаем LCD к микроконтроллеру по
Привет! Валерьянка закончилась, бьюсь уже второй день и никак не могу проинициализировать 16*2 дисплей в 4-х битном режиме. Хочу сделать свою библиотеку для CVAVR.
вот код
В протеусе дисплей не оживает. Не могу понять что делаю не так, перечитал и перепробовал разные варианты из сети, все равно ничего не выходит. Если использовать внутреннюю библиотеку CVAVR все работает на ура. Пробовал и задержки разные и очередность команд менял и все без толку. Инициализация проходит без ошибок в протеусе, а при попытке вывести что нить на екран, после нескольких символов пишет что контроллер дисплея занят. Частоты тактов контроллера в протеусе и проекте одинаковы. Что делаю не так?
вот код
Код: Выделить всё
void lcd_init()
{
PORTE &= (~ (1<<3));
delay_ms(15); //по даташиту, внутрение процедуры LCD
lcd_write(0x30, COMAND); //8 bit
delay_ms(6);
lcd_write(0x30, COMAND);
delay_ms(1);
lcd_write(0x30, COMAND);
delay_ms(1);
lcd_write(0x30, COMAND); //
delay_us(50);
lcd_write(0x20, COMAND); //4 bit
delay_ms(50);
lcd_write(0x28, COMAND); //4 bit 2 str, 5x7
delay_ms(50);
lcd_write(0x80, COMAND); //adrr DRAM -> 0
delay_ms(50);
lcd_write(0x08, COMAND); //выкл дисплей
delay_us(50);
lcd_write(0x06, COMAND); //сдвигать курсор вправо
delay_ms(1);
lcd_write(0x02, COMAND); // курсор в нулевую позицию
delay_ms(2);
lcd_write(0x0E, COMAND); //вкл дисплей и курсор
delay_ms(5);
lcd_write(0x01, COMAND); //очистить
delay_ms(2);
}
void lcd_write(unsigned char data, unsigned char mode)
{
if (mode) //выбор режима 1-data 0-comand
{
PORTE |= (1<<3);
}
else
{
PORTE &= (~ (1<<3));
};
SetBit (PORTE,2); // E=1
delay_us(5);
PORTD = ((PIND & 0x0F) | (data & 0xF0)); //обнул 4-7 разр старший нибл и пишем в 4-7 данные
delay_us(5);
ClearBit (PORTE,2); //E=0
delay_us(60); //что бы лсд успел переварить инфо
SetBit (PORTE,2); //E=1
delay_us(5);
PORTD = ((PIND & 0x0F) | (data <<4)); //младший нибл
delay_us(5);
ClearBit (PORTE,2); //E=0
//PORTD |= 0xF0; //1 на D4-D7 согласно описан
}В протеусе дисплей не оживает. Не могу понять что делаю не так, перечитал и перепробовал разные варианты из сети, все равно ничего не выходит. Если использовать внутреннюю библиотеку CVAVR все работает на ура. Пробовал и задержки разные и очередность команд менял и все без толку. Инициализация проходит без ошибок в протеусе, а при попытке вывести что нить на екран, после нескольких символов пишет что контроллер дисплея занят. Частоты тактов контроллера в протеусе и проекте одинаковы. Что делаю не так?