роботы робототехника микроконтроллеры


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

> Описание: Инициализация ЖК
Veganin Post Id


Рядовой


Сообщений всего: 2
Дата рег-ции: Янв. 2009  



Всем форумчанам доброго дня!
Только начал изучать Си. Хочу запрограммить ЖКИ и вывести хотя бы один символ.
Но не получаетсяГрустный
Ниже приведена программа.
Отладка в 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);
}
}
 
 Top
skabio Post Id


Рядовой


Сообщений всего: 1
Дата рег-ции: Янв. 2009  



после каждой записи команда/данные необходимо дергать строб Е чтобы контроллер 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

(Отредактировано автором: 20 Января, 2009 - 18:09:58)

 
 Top
Veganin Post Id


Рядовой


Сообщений всего: 2
Дата рег-ции: Янв. 2009  



Спасибо! Попробую.
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru