Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Помогите разобраться с HD44780

Страниц (1): [1]
 

1. Veganin - 17 Января, 2009 - 13:30:29 - перейти к сообщению
Всем форумчанам доброго дня!
Только начал изучать Си. Хочу запрограммить ЖКИ и вывести хотя бы один символ.
Но не получаетсяГрустный
Ниже приведена программа.
Отладка в AVR Studio 4.14 build 589.
Почему на ЖКИ не выводится символ "A"
#include <stdlib.h>
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define F_CPU 4000000UL
unsigned char E,RS,RW,to_LCD,Value_RS;

/** Функция записи байта в драйвер LCD **
void transmit_to_LCD (void)
{
_delay_ms(10);

// устанавливаем нужное значение бита RS
PORTB|=(Value_RS<<RS);

// записываем в порт команду
PORTA=to_LCD;

// устан. E=1
PORTB= _BV(PB2);

_delay_ms(1);

// E=0
PORTB= ~_BV(PB2);

}

void init_HD44788() // иниц. HD44788
{
// будем записывать команду в регистр IR драйвера LCD поэтому Value_RS=0
Value_RS=0;

_delay_ms(25);
// будем записывать команду в регистр IR драйвера LCD поэтому Value_RS=0
Value_RS=0;
// команда $30
to_LCD=0x030;
// записываем в регистр IR
transmit_to_LCD ();

_delay_ms(7);
to_LCD=0x030;
// записываем в регистр IR
transmit_to_LCD ();

_delay_ms(1);
to_LCD=0x030;
transmit_to_LCD ();


// записываем наиболее популярную последовательность команд
////_delay_ms(1);
to_LCD=0x038;
transmit_to_LCD ();

to_LCD=0x08;
transmit_to_LCD ();

to_LCD=0x0C;
transmit_to_LCD ();

}

int main(void)

{

RS=0; // PB0
RW=1; // PB1 всегдо равен лог. 0!
E=2; // PB2

DDRA=0xFF; // выход

DDRB=0xFF; // выход

PORTB=0x00; // RS,RW,E=0

DDRD=0xFF; // светодиод

// инициируем драйвер ЖКИ
init_HD44788();

// выводим символ A на ЖКИ
// будем записывать команду в буфер ЖК поэтому RS=1
Value_RS=1;

to_LCD="A";
transmit_to_LCD ();

while (1)
{
_delay_ms(100);

PORTD ^= _BV(PD7);
}
}
2. skabio - 20 Января, 2009 - 17:22:35 - перейти к сообщению
после каждой записи команда/данные необходимо дергать строб Е чтобы контроллер lcd принял данные, тоесть устанавливать в 1 потом сбрасывать в 0, при этом необходимо определенное время "выдержки" этого сигнала, например 1 мс, хотя при активной записи в lcd это довольно большой интервал, достаточно сделать с десяток пустых операций nop в любом случае потеря тактов, например
CODE:

void flushData(void)
{
#asm
sbi $3,2 // устанавливаем в 1 ногу 2 порта B, в данном случае на порт B к ноге 2 подключен строб E LCD
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi $3,2 - с брос в 0
#endasm
}


а!, гоню, с этим в коде все нормалек, просто надо проинициалмизировать прально, добавить команду сдвига курсора записав на шину данных 00010100
3. Veganin - 20 Января, 2009 - 19:01:27 - перейти к сообщению
Спасибо! Попробую.