Здравствуйте, несколько дней уже разбираюсь с управлением ЖКИ 16х2 на базе контроллера HD44780 по 4-битному интерфейсу. Написал по примеру несколько функций для этого. Но максимум что удалось сделать - это вывести мигающий курсор в верхнем левом углу дисплея в виде черного прямоугольника. Скорее всего в функциях есть проблема, помогите разобраться в чем дело, подключение дисплея правильное. Ниже код функций:
CODE
#include <avr/io.h>
#define F_CPU 4000000UL
#include <avr/delay.h>
#define E 0 //E = PORTC.0 - стробирующий сигнал
#define RS 1 //RS = PORTC.1 - определение типа данных: команда(RS=0) или данные(RS=1)
#define RW 2 //RW = PORTC.2 - выбор режима: запись(RW=0) или чтение(RW=1)
void lcd_SendCommand(unsigned char lcd) //функция передачи команд в дисплей
{
unsigned char temp;
temp =(lcd & ~(1<<RS)) | (1<<E); //задаём тип данных, который хотим переслать
PORTC=temp; //выводим в порт старшую тетраду команды, сигналы RS и E
PORTC=temp & ~(1<<E); //cигнал записи команды
_delay_us(5);
temp =((lcd*16) & ~(1<<RS)) | (1<<E); //задаём тип данных, который хотим переслать
PORTC=temp; //выводим в порт младшую тетраду команды, сигналы RS и E
PORTC=temp & ~(1<<E); //cигнал записи команды
_delay_us(5);
}
void lcd_SendData(unsigned char lcd) //функция передачи данных в дисплей
{
unsigned char temp;
temp =(lcd & (1<<RS)) | (1<<E); //задаём тип данных, который хотим переслать
PORTC=temp; //выводим в порт старшую тетраду данных, сигналы RS и E
PORTC=temp & ~(1<<E); //cигнал записи данных
_delay_us(5);
temp =((lcd*16) & (1<<RS)) | (1<<E); //задаём тип данных, который хотим переслать
PORTC=temp; //выводим в порт младшую тетраду данных, сигналы RS и E
PORTC=temp & ~(1<<E); //cигнал записи данных
_delay_us(5);
}
void lcd_init(void) //функция инициализации дисплея
{
lcd_SendCommand(0b00101000); //4-бит интерфейс, 2 строки, 5х8 точек
_delay_ms(10);
lcd_SendCommand(0b00000001); //очистка дисплея, указатель встал на 0x00 DDRAM
_delay_ms(10);
lcd_SendCommand(0b00000110); //адресс будет инкреминтироваться, экран не движется
_delay_ms(10);
}
int main(void)
{
DDRC =0b01111111; //настройка PORTC на выход
PORTC=0b01111011;
_delay_ms(10);
lcd_init(); //инициализация дисплея
lcd_SendCommand(0b00001100); //включаем дисплей, настраиваем курсор(режим: в виде подчеркивания)
lcd_SendData('1');
lcd_SendData('2');
lcd_SendData('3');
lcd_SendData('4');
lcd_SendData('5');
lcd_SendData('6');
lcd_SendData('7');
lcd_SendData('8');
lcd_SendData('9');
lcd_SendData('0');
lcd_SendData('A');
lcd_SendData('B');
lcd_SendData('C');
while(1);
}
Сообщение отредактировал IgorKossak - Dec 27 2012, 17:45
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!, форматирование