Работа с ЖКИ на контроллере HD44780 и его аналогах

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Ну как то так.
Изображение
Вообще желательно, чтобы силовая часть была разведена широкими дорожками. И как можно ближе к микросхемам чтобы стояли керамические кондеры. Но это уже в тему Вопросы по питанию.
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 939
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Сообщение Ghost in shell »

Доброго времени суток!
Тяжко осилить 61 страницу на 95% ненужной информации, поэтому прошу сильно не ругать за оффтоп.
Работаю с PIC на С с помощью HI-TECH компилятора. Насколько я понял, для работы с LCD либо нужна библиотека, либо самописные функции. В комплект библиотек компилятора входит lcd.h. Но по ее функциям документации нет. Их можно как-то выяснить? Потому что искать библиотеку под компилятор...
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Для любимого хайтека в самплах есть библиотека, которая работает на всех 44780 дисплеях.
Ты не поверишь - на всех, которые мне встречались до этого времени.
Последний раз редактировалось urry Пн мар 25, 2013 08:56:39, всего редактировалось 1 раз.
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 939
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Сообщение Ghost in shell »

Аватар, как аватар... Даже без анимации.
Я насчет функций беспокоюсь, как они в библиотеке называются?
У меня есть хелп по микроС, там написано:
Lcd_Config - Инициализирует порт (port) для работы LCD с заданным распределением разрядов по назначению. Аргументы RS, EN, WR, D7 .. D4 должны быть комбинацией значений 0–7 (например: 3,6,0,7,2,1,4).
Lcd_Init - Инициализирует порт (port) для работы с LCD со стандартным
Lcd_Out - Выводит text на LCD в заданную строку и позицию (аргументы row и col). В качестве аргумента text могут использоваться как строковые переменные, так и литералы
Lcd_Out_Cp - Выводит text на LCD с текущей позиции курсора. В качестве аргумента text могут использоваться как строковые переменные, так и литералы.
Lcd_Chr - Выводит символ character на LCD в заданную строку и позицию (аргументы row и col). В качестве аргумента character может быть использована как переменная, так и литерал.
Lcd_Chr_Cp - Выводит символ character на LCD в текущую строку и позицию. В качестве аргумента character может быть использована как переменная, так и литерал.
Lcd_Cmd - Посылает команду command в LCD. В качестве аргумента можно передавать предопределенные константы. Полный список команд приведен ниже.
Попробую - не бомба, взрыва не будет от ошибки.
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

мы точно говорим об одном и том же ?
C:\Program Files\HI-TECH Software\PICC\std\9.60\samples\LCDemo

lcd.h
=======

extern void lcd_write(unsigned char);

/* Clear and home the LCD */

extern void lcd_clear(void);

/* write a string of characters to the LCD */

extern void lcd_puts(const char * s);

/* Go to the specified position */

extern void lcd_goto(unsigned char pos);

/* intialize the LCD - call before anything else */

extern void lcd_init(void);

extern void lcd_putch(char);
===============

зы
ничего особо умного в инициализации - выводе на дисплей нет - по шиту несложно написать самостоятельно - просто хайтековцы умудрились вывести задержки при инициализации такие, которые удовлетворяют большинство как hd, так и ks - мне не встречались такие, которые бы не заводились от этих стандартных функций. А так - даташит читать нужно, да...
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 939
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Сообщение Ghost in shell »

urry да, об этом.
Бибилиотека подключается по-моему так

Код: Выделить всё

#include <lcd.h>
Можно примеры использования функций? С комментариями, пожалуйста.
Особенно мне интересна работа в 4-битном режиме и произвольное назначение линий порта на RS, E, DB4, DB5, DB6 и DB7.
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 23, 2009 16:30:23
Откуда: Санкт-Петербург

Сообщение scrappy »

Добрый день=)
В продолжении вот этой темы
http://radiokot.ru/forum/viewtopic.php?f=24&t=34407
напомню, до сих пор лежат без дела два ваккумнолюминисцентных дисплея, 20 знаков 2 строки.
даташит на дисплей
http://yadi.sk/d/0xaHTm7B3wlTF

дисплей подключается только по 8-битной шине, причем интерфейс INTEL-8080, имеется Outpit сигнал BUSY.
так же имеются пины под названием WR\ SEL\

То-есть на сколько я понял, в отличии от HD44780, где режим команд и режим данных четко разделяются, тут комманды и данные идут одним потоком. только команды имеют свои адреса...

вот, я думаю, нет ли уже готовой библиотеки на С?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Товарищи, обязательно ли проверять Busy Flag в 4-х битном режиме после печати каждого символа?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Сообщения: 18
Зарегистрирован: Ср мар 06, 2013 01:24:25
Откуда: Ukraine

Сообщение pelia »

я - не проверяю, и ножка RW у меня на земле
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Пт апр 12, 2013 21:54:42

Сообщение Dmitrich_163 »

Залил в Atmega8 прошивку из примеров CodeVisionAVR, теперь дисплей кроме "Hello World" ничего не показывает, помогите разобраться новичку.
Исходный код.

Код: Выделить всё

#ifndef _LCD_INCLUDED_ 
#define _LCD_INCLUDED_ 

#pragma used+ 

void _lcd_ready(void); 
void _lcd_write_data(unsigned char data); 
// write a byte to the LCD character generator or display RAM 
void lcd_write_byte(unsigned char addr, unsigned char data); 
// read a byte from the LCD character generator or display RAM 
unsigned char lcd_read_byte(unsigned char addr); 
// set the LCD display positiоn x=0..39 y=0..3 
void lcd_gotoxy(unsigned char x, unsigned char y); 

// clear the LCD 
void lcd_clear(void); 
void lcd_putchar(char c); 
// write the string str located in SRAM to the LCD 
void lcd_puts(char *str); 
// write the string str located in FLASH to the LCD 
void lcd_putsf(char flash *str); 
// initialize the LCD controller 
unsigned char lcd_init(unsigned char lcd_columns); 
// writes a control byte to the LCD 
void lcd_control (unsigned char control); 

#pragma used- 
#pragma library lcd.lib 

#endif
Родился
Сообщения: 18
Зарегистрирован: Ср мар 06, 2013 01:24:25
Откуда: Ukraine

Сообщение pelia »

Сама программа должна выглядеть приблизительно так:

Код: Выделить всё

/*
.Проект: Простой термометр для дома с двумя датчиками ds18b20
.Автор:Гаркуша Антон
.E-mail:gam-raingers@mail.ru
.Дата:29.06.2008
.Проект: Простой термометр для дома с двумя датчиками ds18b20 на дисплее 16х1 и одновременным показанием двух датчиков V1.16.1
.Rebuild by Pelia
.E-mail:pelia@smtp.ru
.Дата:15.03.2013
.При программировании посредством PonyProg поставить SPIEN=1, SUT0=1. Остальные снять! Внешний кварц=10MHz 
*/
#define F_CPU 1000000L // Pelia дописал внешний кварц 10МГц
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#include <stdbool.h>
#define RS PB0
#define E  PB1

unsigned char i=0,j=0,z=0;
unsigned char was_conflict=0; //Признак наличия конфликта битов
unsigned char temperature=0;  //Значение t в целых числах
int grand_temperature=0; //Значение t со знаком,полученное от датчика(16 бит)
unsigned char des_temperature=0; //Значение t в десятых долях
unsigned char cifra=0; //Вспомогательная переменная для индикации t
unsigned char znak=0;  //Знак температуры: 0 - "+";1 - "-"
unsigned char precense_ds18b20=0; //Признак присутствия датчика
unsigned char buffer[16]={'P','e','l','i','a','@','s','m','t','p','.','r','u',' ',' ',' '}; //Pelia было 8 знаков
unsigned char ROM1[8]={0,0,0,0,0,0,0,0};
unsigned char ROM2[8]={0,0,0,0,0,0,0,0};
bool get_for_two=false;
//======================
void send_command(unsigned char command);
void send_data(unsigned char data);
void ini_LCD(void);
void nosig(void);
void LCD_pause(void);
unsigned char show_cifra(unsigned char i);
void reset_ds1820(void);
void send_ds1820_command(unsigned char command);
void receive_ds1820(void);
unsigned char create_des(void);
void search_ds1820_ROM(void);
void send_ROM_ds1820(unsigned char ROM);
void send_E1(void);
void send_E2(void);
void send_0(void);
void send_1(void);
void zapros_bita(void);


int main(void)
{
DDRB=0xFF;
DDRD=0x00;           // Шина изначально свободна
PORTD=0x20;
TIMSK=0x80;
SREG=0x80;
TCNT1=0x48E5;
sei();
ini_LCD();
TCCR1B=0x04;

while(1)
{
if(z==0) ////Pelia дописал: для получения двух значений
 {
 z=1;
 }
 else 
 {
 z=0;
 } 
//Получение от датчиков значений температуры
 search_ds1820_ROM(); //получение кода для 1-го
 search_ds1820_ROM(); //получение кода для 2-го
 reset_ds1820();
 send_ds1820_command(0x55);  //Адресация ROM
 send_ROM_ds1820(z);
 send_ds1820_command(0x44);  //Команда измерения t

  for(j=0;j<80;j++)          //Временная пауза 800 мс
    {   _delay_loop_2(25000);    }

 reset_ds1820();
 send_ds1820_command(0x55);  //Адресация ROM
 send_ROM_ds1820(z);
 send_ds1820_command(0xBE);
 receive_ds1820();
  
 	
}
};
Процедуры - вырезаны для экономии места...
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Пт апр 12, 2013 21:54:42

Сообщение Dmitrich_163 »

Спасибо, поробывал, но все тоже самое. Я подозреваю что в энергонезависимую память дисплея записал фразу "Hello World". Пытаюсь вывести другие слова но ничего не получается, постоянно горит "Hello World".
Как очистить памят дисплея???
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Там нет энергонезависимой памяти, которую можно было бы прошить в обычном режиме.
Для вывода используется ОЗУ, которое очищается после отключения питания. А также в составе команд инициализации содержится команда очистки дисплея.
Вы привели не весь исходник, а только часть с описаниями функций.
Ставим плюсы: )
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Dmitrich_163 писал(а):Спасибо, поробОвал, но все тоже самое. Я подозреваю что в энергонезависимую память дисплея записал фразу "Hello World". Пытаюсь вывести другие слова но ничего не получается, постоянно горит "Hello World".
Как очистить памят дисплея???
Подозреваю что у вас из-за ошибки не компилируется новый код и вы просто видите старую прошивку.
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Пт апр 12, 2013 21:54:42

Сообщение Dmitrich_163 »

Спасибо, разобрался, действительно программа новая не прописывалась и я видел старую прошивку... :?
Нашел транзистор. Понюхал.
Сообщения: 155
Зарегистрирован: Вс июн 27, 2010 17:24:13

Сообщение Бар-Барсик »

Написал программу для atmega16 и WH0802. использовал три разные готовые библиотеки. в протеусе на лсд 2х16 всё прекрасно работает. Зашиваю в реальный мк - WH0802 ничего не отображает. пробовал 4 и 8 битный режим, три разных библиотеки. я так понял что ST7066IC и HD44780 аналоги. В чём может быть проблема, Дисплею настала крышка или проблема в коде? ломаю голову 4 дня.
Вложения
mega16_LCD - копия.rar
(29.36 КБ) 173 скачивания
hidro.rar
(14.85 КБ) 145 скачиваний
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

При включении без МК дисплей квадратики показывает?
Контрастность покрутить пробовали?
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

JTAG отключить fuse-битом JTAGEN не забыли?
Нашел транзистор. Понюхал.
Сообщения: 155
Зарегистрирован: Вс июн 27, 2010 17:24:13

Сообщение Бар-Барсик »

Спасибо большое, проблема была в JTAG
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

обязательно ли проверять Busy Flag в 4-х битном режиме после печати каждого символа?
Вообще - обязательно. Но если у тебя есть уверенность что дисплей точно успеет выполнить команду перед тем как ты пошлешь ему другую - можно не проверять. Обычно такая гарантия дается если вставить жесткую задержку в коде после передачи в дисплей каждой команды.
Контактная информация:
Ответить

Вернуться в «Периферия»