реклама на сайте
подробности

 
 
> Проблема с управлением HD44780, Не удается должным образом вывести на дисплей необходимую информацию
endasm
сообщение Dec 27 2012, 12:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-07-12
Пользователь №: 72 673



Здравствуйте, несколько дней уже разбираюсь с управлением ЖКИ 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] - для короткого!!!, форматирование
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
endasm
сообщение Dec 30 2012, 21:16
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-07-12
Пользователь №: 72 673



Вообщем переделал я немного функции и дисплей почти корректно заработал, но вот проблема походу кроется ещё в моем компиляторе: латиницу он нормально кодирует в соответствии ACSII, а вот вместо цифр и кириллицы на дисплее отображается всякие левые символы, к примеру я программирую что бы было "абвгдеёжз", а на дисплее "аЦЩдфцищ'". с цифрами всё ещё хуже - там вообще какие то вертикальные полосочки и крестики вместо них( например int i=1; lcd_SendData(i); - на дисплее две вертикальные палочки с черточкой посередине). Судя по таблице знакогенератора () - мой компилятор не корректно кодирует ACSII в двоичный код, так как если я ввожу в программе тупо код нужного мне символа - то всё прекрасно выводится на ЖКИ. Программирую в AtmelStudio 6.0.1863. Подскажите что бы такое изменить и где в студии или же как в программе переназначить кодировки символов (цифр и кириллицы).
Вот работающий код:
CODE
#define E 4 //E = PORTC.4 - стробирующий сигнал
#define RS 5 //RS = PORTC.5 - определение типа данных: команда(RS=0) или данные(RS=1)
#define RW 6 //RW = PORTC.6 - выбор режима: запись(RW=0) или чтение(RW=1)

void lcd_SendCmd(unsigned char lcd) //функция передачи команд в дисплей
{
_delay_us(15);
PORTC = (lcd>>4 & ~(1<<RS) & ~(1<<RW)) | (1<<E);
//задаём тип данных, который хотим переслать, выводим в порт старшую тетраду команды, сигналы RS и E
_delay_us(15);
PORTC &= ~(1<<E);
//cигнал записи команды

_delay_us(15);
PORTC = (lcd & ~(1<<RS) & ~(1<<RW)) | (1<<E);
//задаём тип данных, который хотим переслать, выводим в порт младшую тетраду команды, сигналы RS и E
_delay_us(10);
PORTC &= ~(1<<E); //cигнал записи команды
_delay_us(15);
}

void lcd_SendData(unsigned char lcd) //функция передачи данных в дисплей
{
_delay_us(15);
PORTC = ((lcd>>4) | (1<<RS) | (1<<E)) & ~(1<<RW);
//задаём тип данных, который хотим переслать, выводим в порт старшую тетраду данных, сигналы RS и E
_delay_us(15);
PORTC &= ~(1<<E); //cигнал записи данных

_delay_us(15);
PORTC = (lcd | (1<<RS) | (1<<E)) & ~(1<<RW);
//задаём тип данных, который хотим переслать, выводим в порт младшую тетраду данных, сигналы RS и E
_delay_us(15);
PORTC &= ~(1<<E); //cигнал записи данных
_delay_us(15);
}

void lcd_init(void) //функция инициализации дисплея
{
lcd_SendCmd(0b00101000); //4-бит интерфейс, 2 строки, 5х8 точек
_delay_ms(3);
lcd_SendCmd(0b00000110); //адресс будет инкреминтироваться, экран не движется
_delay_ms(3);
lcd_SendCmd(0b00000001); //очистка дисплея, указатель встал на 0x00 DDRAM
_delay_ms(5);
lcd_SendCmd(0b00001100); //включаем ЖКИ, без отображения курсора
_delay_ms(3);
}


Сообщение отредактировал IgorKossak - Dec 31 2012, 18:06
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!, форматирование
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 30 2012, 21:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(endasm @ Dec 30 2012, 23:16) *
а вот вместо цифр и кириллицы на дисплее отображается всякие левые символы, к примеру я программирую что бы было "абвгдеёжз", а на дисплее "аЦЩдфцищ'".

Видимо производитель LCD закодировал символы как ему вздумалось, а не в соответствии с существующими кодировками (а может какой-то и соответствует?).

Цитата(endasm @ Dec 30 2012, 23:16) *
с цифрами всё ещё хуже - там вообще какие то вертикальные полосочки и крестики вместо них( например int i=1; lcd_SendData(i); - на дисплее две вертикальные палочки с черточкой посередине).

А что вы там ждёте? Задали дисплею выдать байт 0x00 - он и выдал что-то непечатное. Вам надо преобразовать число к печатному виду. Или вы думаете в дисплее printf реализован который за вас это сделает?

Цитата(endasm @ Dec 30 2012, 23:16) *
мой компилятор не корректно кодирует ACSII в двоичный код, так как если я ввожу в программе тупо код нужного мне символа - то всё прекрасно выводится на ЖКИ.

Создайте таблицу перекодировки в соответствии с рисунком. Латиницу перекодировать не надо - только то что после 0x7F.
Go to the top of the page
 
+Quote Post
endasm
сообщение Dec 30 2012, 22:18
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-07-12
Пользователь №: 72 673



Цитата(_Артём_ @ Dec 31 2012, 00:55) *
Видимо производитель LCD закодировал символы как ему вздумалось, а не в соответствии с существующими кодировками (а может какой-то и соответствует?).


А что вы там ждёте? Задали дисплею выдать байт 0x00 - он и выдал что-то непечатное. Вам надо преобразовать число к печатному виду. Или вы думаете в дисплее printf реализован который за вас это сделает?


Создайте таблицу перекодировки в соответствии с рисунком. Латиницу перекодировать не надо - только то что после 0x7F.

Да, вы правы на счет цифр. Сейчас делаю таким макаром: int i=1; lcd_SendData(i+48); - подскажите всегда ли это будет работать с цифрами и какие недостатки таит в себе такой подход?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 30 2012, 22:55
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (endasm @ Dec 31 2012, 00:18) *
подскажите всегда ли это будет работать с цифрами и какие недостатки таит в себе такой подход?
Если дисплей воспринимает цифры в кодировке ASCII - всегда. Из недостатков только нечитаемость исходника. lcd_SendData(i+'0'); выглядит более понятно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- endasm   Проблема с управлением HD44780   Dec 27 2012, 12:34
- - Dust112   Советую проверить функцию инициализации, в частнос...   Dec 27 2012, 13:18
- - endasm   Проверил, всё правильно, биты: DL=0, N=1, F=0 lcd...   Dec 27 2012, 13:47
- - Dust112   После 5 секудного гугления: Необходимо помнить, ч...   Dec 27 2012, 14:08
|- - Ruslan1   Цитата(Dust112 @ Dec 27 2012, 16:08) Посл...   Dec 27 2012, 15:47
- - endasm   Сейчас поправлю и отпишусь. Не помогло.   Dec 27 2012, 14:54
- - Dust112   Значит затык в задержках. Какой конкретно ЖКИ испо...   Dec 27 2012, 15:07
- - endasm   WINSTAR WH1602B   Dec 27 2012, 15:15
- - Dust112   А мануал на HD44780 читали? Там же есть пример ини...   Dec 27 2012, 15:37
- - ARV   и была охота велосипед изобретать? полно ведь гото...   Dec 27 2012, 15:55
|- - S17   Может поможет: hd44780 online simulator: http://ww...   Dec 27 2012, 20:11
|- - ARV   Цитата(S17 @ Dec 28 2012, 00:11) Мне бы н...   Dec 28 2012, 08:10
||- - S17   Цитата(ARV @ Dec 28 2012, 12:10) их есть ...   Dec 28 2012, 10:28
|- - Genadi Zawidowski   Цитата(S17 @ Dec 28 2012, 00:11) Мне бы н...   Dec 28 2012, 17:47
|- - endasm   Цитата(Genadi Zawidowski @ Dec 28 2012, 20...   Dec 29 2012, 13:17
|- - Сергей Борщ   QUOTE (endasm @ Dec 29 2012, 15:17) Нужно...   Dec 29 2012, 22:52
|- - endasm   Цитата(Сергей Борщ @ Dec 30 2012, 01:52) ...   Dec 30 2012, 07:53
|- - Marian   Цитата(endasm @ Dec 30 2012, 10:53) Я оши...   Dec 30 2012, 14:08
|- - ARV   Цитата(Marian @ Dec 30 2012, 18:08) Посмо...   Dec 30 2012, 15:28
- - endasm   Инициализировал как в даташите - не помогло: курсо...   Dec 27 2012, 16:46
|- - Ruslan1   Цитата(endasm @ Dec 27 2012, 18:46) Иници...   Dec 27 2012, 20:08
- - hd44780   А незабываемый AVRLib - http://www.procyonengineer...   Dec 28 2012, 16:03
|- - ARV   Цитата(hd44780 @ Dec 28 2012, 20:03) У ме...   Dec 28 2012, 17:18
- - vgo1   Лет 7 назад я использовал ЖКИ модуль с Mega8. Прог...   Dec 28 2012, 17:33
|- - S17   Цитата(endasm @ Dec 31 2012, 01:16) Подск...   Dec 30 2012, 21:54
- - endasm   Вообщем всё наконец таки заработало как надо, спас...   Dec 30 2012, 23:02
- - S17   Цитата(endasm @ Dec 31 2012, 03:02) Вообщ...   Dec 31 2012, 16:29


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 01:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016