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

 
 
> Проблема с управлением 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
Ответов
ARV
сообщение Dec 27 2012, 15:55
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



и была охота велосипед изобретать? полно ведь готовых работающих библиотек...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
S17
сообщение Dec 27 2012, 20:11
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 22-06-05
Пользователь №: 6 228



Может поможет:
hd44780 online simulator: http://www.dinceraydin.com/djlcdsim/djlcdsim.html

Цитата(ARV @ Dec 27 2012, 19:55) *
и была охота велосипед изобретать? полно ведь готовых работающих библиотек...

Мне бы не помешали ссылки на работающие библиотеки...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 28 2012, 17:47
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(S17 @ Dec 28 2012, 00:11) *
Мне бы не помешали ссылки на работающие библиотеки...


http://forum.cqham.ru/viewtopic.php?t=17803, там архив с исходниками - файл с именем hd44780.c - для ускорения работы используется проверка готовности дисплея чтением его регистра состояни (т.е., вывод WR задействован).
Go to the top of the page
 
+Quote Post
endasm
сообщение Dec 29 2012, 13:17
Сообщение #5


Участник
*

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



Цитата(Genadi Zawidowski @ Dec 28 2012, 20:47) *
http://forum.cqham.ru/viewtopic.php?t=17803, там архив с исходниками - файл с именем hd44780.c - для ускорения работы используется проверка готовности дисплея чтением его регистра состояни (т.е., вывод WR задействован).

Там всё очень сложно и запутано для меня. Ситуация такая что знакомый написал мне прошивку для проверки работоспособности LCD (выводит русский текст) - и всё нормально вывелось, т.е. косяк точно в моей программе.
Один например уже нашел:
Вместо - temp =(lcd & ~(1<<RS)) | (1<<E); //задаём тип данных, который хотим переслать
Нужно было - temp =(lcd | ~(1<<RS)) | (1<<E);
Теперь я могу вывести на экран всякую белеберду, но не то что мне нужно и не там где мне нужно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 29 2012, 22:52
Сообщение #6


Гуру
******

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



QUOTE (endasm @ Dec 29 2012, 15:17) *
Нужно было - temp =(lcd | ~(1<<RS)) | (1<<E);
Сократите это выражение до temp =lcd | ~(1<<RS) и подумайте - вы действительно этого хотели?


--------------------
На любой вопрос даю любой ответ
"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
сообщение Dec 30 2012, 07:53
Сообщение #7


Участник
*

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



Цитата(Сергей Борщ @ Dec 30 2012, 01:52) *
Сократите это выражение до temp =lcd | ~(1<<RS) и подумайте - вы действительно этого хотели?

Я ошибся когда писал сообщение, на самом деле там: PORTC =(lcd & ~(1<<RS)) | (1<<E);
Go to the top of the page
 
+Quote Post
Marian
сообщение Dec 30 2012, 14:08
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Цитата(endasm @ Dec 30 2012, 10:53) *
Я ошибся когда писал сообщение, на самом деле там: PORTC =(lcd & ~(1<<RS)) | (1<<E);

Посмотрите LCD library for HD44870 based LCD's

Как что установить помощь

в lcd.h назначаете порты и выводы.

Код
#define LCD_PORT         PORTA        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_RS_PIN       4            /**< pin  for RS line         */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_RW_PIN       5            /**< pin  for RW line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_E_PIN        6            /**< pin  for Enable line     */


Используете так
Код
#include "lcd.h"

// main
int main(void)
{
    lcd_init(LCD_DISP_ON);                    // инициализация LCD
    lcd_clrscr();                            // очищаем индикатор
    
    lcd_puts("Proba Linia1");
    lcd_gotoxy(0,1);
    lcd_puts("      Linia2");
    while(1)
    {
    }
}


Сообщение отредактировал Marian - Dec 30 2012, 14:24
Go to the top of the page
 
+Quote Post
ARV
сообщение Dec 30 2012, 15:28
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Marian @ Dec 30 2012, 18:08) *
именно об этой библиотечке шла речь, когда я давал свою ссылку. только я дал ссылку на статью с библиотечкой, в которой я уже исправил найденные ошибки, и плюс ко всему по-русски описал основные макросы и функции. так же в виде бонуса рассказал о том, как использовать стандартные функции вывода а-ля printf вместе с этой библиотечкой.


--------------------
Я бы взял частями... но мне надо сразу.
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   Цитата(S17 @ Dec 28 2012, 00:11) Мне бы н...   Dec 28 2012, 08:10
||- - S17   Цитата(ARV @ Dec 28 2012, 12:10) их есть ...   Dec 28 2012, 10: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
- - endasm   Вообщем переделал я немного функции и дисплей почт...   Dec 30 2012, 21:16
|- - S17   Цитата(endasm @ Dec 31 2012, 01:16) Подск...   Dec 30 2012, 21:54
|- - _Артём_   Цитата(endasm @ Dec 30 2012, 23:16) а вот...   Dec 30 2012, 21:55
|- - endasm   Цитата(_Артём_ @ Dec 31 2012, 00:55) Види...   Dec 30 2012, 22:18
|- - Сергей Борщ   QUOTE (endasm @ Dec 31 2012, 00:18) подск...   Dec 30 2012, 22:55
- - 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 Текстовая версия Сейчас: 22nd July 2025 - 14:56
Рейтинг@Mail.ru


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