Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
1

Посоветуйте библиотеку для LCD hd44780

06.04.2020, 11:13. Просмотров 1956. Ответов 49

Использоваться будет Atmel Studio 7. В основном, библиотека будет применяться при изготовлении амперметров, вольтметров и т.п, вывод данных с АЦП на дисплей 1602 - 1604. Основное, чтобы присутствовала возможность преобразования чисел с плавающей точкой (запятой) и вывода результата через строку, не используя Float. Те библиотеки, которые я нашел в интернете написаны лет 20 назад, Atmel Studio 7 при попытке использования вываливает кучу ошибок. Если есть необходимость, то могу выложить результаты своих мучений.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2020, 11:13
Ответы с готовыми решениями:

Инициализация lcd на HD44780
Здравствуйте! Пытаюсь освоить lcd на HD44780. Понимаю, что есть много уже готовых библиотек, я их...

Библиотерка LCD на контроллере HD44780
Для работы на си с данным дисплеем в winAVR есть библиотека "lcd_lib". Возьмем к примеру функцию...

О выводе на дисплей LCD HD44780
Пишу программу на Atmego32A. Столкнулся с проблемкой при выводе на дисплей. Функции вывода на...

Мигающий текст на LCD HD44780
Всем привет! А как проще всего сделать часть текста выводимого на LCD типа HD44780 мигающим? Именно...

49
Тутошний я
1848 / 995 / 182
Регистрация: 03.11.2009
Сообщений: 3,321
Записей в блоге: 2
13.04.2020, 20:41 21
Цитата Сообщение от gogaze Посмотреть сообщение
какая разница, в какой программе написана прошивка.
дело не программе.
работа с float занимает больше памяти и времени. а там ещё и библиотека к дисплею будет память занимать.
порой приходится более мощный контроллер ставить.
но для вольтметра разница не большая.
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
20.04.2020, 17:35  [ТС] 22
Цитата Сообщение от Grey Посмотреть сообщение
дело не программе.
работа с float занимает больше памяти и времени.
В общем, я все-таки сделал. Остался один нерешенный момент: убрать с дисплея ненужные нули.
Вывожу так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// DISPLAY n-DIGIT INTEGER NUMER
void lcd_num_to_str(uint16_t value, uint8_t nDigit)
{
 switch(nDigit)
 {
  case 5: lcd_dat((value/1000)+'0');
  case 4: lcd_dat(((value/100)%10)+'0');
  case 3: lcd_string(".", 1); // я добавил
  case 2: lcd_dat(((value/10)%10)+'0');
  case 1: lcd_dat((value%10)+'0');
      
  }
 }

На LCD так:
0
Изображения
 
Тутошний я
1848 / 995 / 182
Регистрация: 03.11.2009
Сообщений: 3,321
Записей в блоге: 2
20.04.2020, 19:24 23
так попробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// DISPLAY n-DIGIT INTEGER NUMER
void lcd_num_to_str(uint16_t value, uint8_t nDigit)
{
 switch(nDigit)
 {
  case 5: lcd_dat((value/1000)+'0');
  case 4: int t = ((value/100)%10);
         if(t > 0) lcd_dat(t + '0');
  case 3: lcd_string(".", 1); // я добавил
  case 2: lcd_dat(((value/10)%10)+'0');
  case 1: lcd_dat((value%10)+'0');
      
  }
 }
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
21.04.2020, 10:28  [ТС] 24
Цитата Сообщение от Grey Посмотреть сообщение
так попробуй
Не проходит! Ошибка - error a label can only be part of a statement and a declaration is not a statement
0
Тутошний я
1848 / 995 / 182
Регистрация: 03.11.2009
Сообщений: 3,321
Записей в блоге: 2
21.04.2020, 12:22 25
похоже забыл скобки убрать
C++
1
2
3
4
5
6
7
8
9
10
11
12
// DISPLAY n-DIGIT INTEGER NUMER
void lcd_num_to_str(uint16_t value, uint8_t nDigit)
{
 switch(nDigit)
 {
  case 5: lcd_dat((value/1000)+'0');
  case 4: int t = (value/100)%10;
          if(t > 0) lcd_dat(t + '0');
          else lcd_string ("",1);
  case 3: lcd_string(".", 1); // я добавил
  case 2: lcd_dat(((value/10)%10)+'0');
  case 1: lcd_dat((value%10)+'0');
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
22.04.2020, 10:30  [ТС] 26
Попробую.
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
22.04.2020, 16:19  [ТС] 27
Цитата Сообщение от Grey Посмотреть сообщение
похоже забыл скобки убрать
Снова облом.
0
Миниатюры
Посоветуйте библиотеку для LCD hd44780  
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
23.04.2020, 00:49  [ТС] 28
Цитата Сообщение от ValeryS Посмотреть сообщение
тему видел, в чем проблема не понял
Убрать ненужные (ведущие) нули.

Добавлено через 6 минут
Вывожу на дисплей с помощью void lcd_num_to_str(uint16_t value, uint8_t nDigit)
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
// DISPLAY n-DIGIT INTEGER NUMER
void lcd_num_to_str(uint16_t value, uint8_t nDigit)
{
 switch(nDigit)
 {
  case 5: lcd_dat((value/1000)+'0');
  case 4: lcd_dat(((value/100)%10)+'0');
  case 3: lcd_string(".", 1); // я добавил
  case 2: lcd_dat(((value/10)%10)+'0');
  case 1: lcd_dat((value%10)+'0');
      
  }
 }

На дисплее - 05.25 а хочется чтобы было 5.25
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
23.04.2020, 06:15 29
Цитата Сообщение от gogaze Посмотреть сообщение
Убрать ненужные (ведущие) нули.
ну тут два пути
или использовать чужую функцию со всеми недостатками и достоинствами
или писать свою со своими хотелками
для начала используй стандартный sprintf

Добавлено через 5 минут
в качестве костыля
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// DISPLAY n-DIGIT INTEGER NUMER
void lcd_num_to_str(uint16_t value, uint8_t nDigit)
{
 switch(nDigit)
 {
  case 5:{
      if((value/1000)!=0)
       lcd_dat((value/1000)+'0');
      else
        lcd_dat(' ');
 
     }
  case 4: lcd_dat(((value/100)%10)+'0');
  case 3: lcd_string(".", 1); // я добавил
  case 2: lcd_dat(((value/10)%10)+'0');
  case 1: lcd_dat((value%10)+'0');
      
  }
 }
1
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
23.04.2020, 10:31 30
я тоже задавался вопросом - как по-быстрее/проще выводить . Ничего умнее не придумал - заполнять несколько нулей (знаков нуля) в буфер, а потом заполнять его справа налево, начиная с наименьшего разряда ). В этом случае достаточно выполнять одно деление (в цикле) на 10, и выделять остаток от деления вычитанием (потому что эта операция "стоит" довольно дорого в Си, как оказалось). Слева направо заполнять довольно громоздко и дорого в плане вычислений - требуется больше действий.
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
23.04.2020, 11:46  [ТС] 31
Цитата Сообщение от ValeryS Посмотреть сообщение
использовать чужую функцию со всеми недостатками и достоинствами
Сначала так и хотел сделать.
Цитата Сообщение от ValeryS Посмотреть сообщение
писать свою со своими хотелками
Тяму не хватает.
Цитата Сообщение от ValeryS Посмотреть сообщение
для начала используй стандартный sprintf
Так размер прошивки будет раза в 2,5 больше. Я делал подобные приборы в CVAVR с использованием Float -4560 bytes. А здесь всего 1346 bytes.
Цитата Сообщение от ValeryS Посмотреть сообщение
в качестве костыля
А за "костыль" огромная человеческая благодарность! Работает!
0
Миниатюры
Посоветуйте библиотеку для LCD hd44780  
Grey
24.04.2020, 17:04
  #32

Не по теме:

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

0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
26.04.2020, 21:06  [ТС] 33
ValeryS, С Вашей и божьей помощью дело близится к завершению. Добавил счетчик ампер-часов еще и часы втолкал в LCD. Не знаю, правильно ли я выводил часы, но по-другому не получилось.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
//показания часов ==============================
        lcd_gotoxy(0,0);
        lcd_num_to_str(hour,2);//Выводим 2 знака часы
        lcd_gotoxy(2,0);
        lcd_dat(':'); //Выводим :
        lcd_gotoxy(3,0);
        lcd_num_to_str(min,2); // Выводим 2 знака минуты
        lcd_gotoxy(5,0);
        lcd_dat(':'); //Выводим :
        lcd_gotoxy(6,0);
        lcd_num_to_str(sek,2); // Выводим 2 знака секунды

В Proteuse все красиво, осталось на макетке в железе попробовать.
0
Миниатюры
Посоветуйте библиотеку для LCD hd44780  
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
02.05.2020, 22:16 34
...скорее не "А/h", а "A*h"...
И "V", "A" пишутся всегда с большой буквы, если вы используете систему Си.
1
ValeryS
04.05.2020, 07:42
  #35
 Комментарий модератора 
дальнейшее развитие темы перенесено сюда
https://www.cyberforum.ru/avr/thread2634106.html
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
04.05.2020, 08:06  [ТС] 36
ValeryS, Очень правильно сделали! Спасибо!
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
05.06.2020, 16:58  [ТС] 37
Хочу снова воскресить тему вот с какой целью: наткнулся недавно на библиотеку с возможностью использования кириллицы для "русскоговорящих" дисплеев на базе HD44780. А можно ли из нее "выкусить" функцию конвертирования в отдельный модуль, чтобы потом использовать совместно с другими библиотеками? Например с этой HD44780_AVR_Lib.zip (ссылка на архив на стр. 1.
Прикрепляю архив с проектом.
0
Миниатюры
Посоветуйте библиотеку для LCD hd44780  
Вложения
Тип файла: rar Test_MEGA_lcd.rar (66.9 Кб, 1 просмотров)
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
05.06.2020, 18:30 38
Цитата Сообщение от gogaze Посмотреть сообщение
А можно ли из нее "выкусить" функцию конвертирования в отдельный модуль, чтобы потом использовать совместно с другими библиотеками?
там нет никакой конвертации
используется встроенный в дисплей кодогенератор
0
Тутошний я
1848 / 995 / 182
Регистрация: 03.11.2009
Сообщений: 3,321
Записей в блоге: 2
05.06.2020, 20:52 39
была библиотека для вывода кирилицы на дисплеи её не поддерживающие.
она подставляла латинские буквы схожие по написанию. буквы которых нет в латинице выводились через пользовательский знакогенератор. й, ъ, наверно ё и ещё какие то редкие не выводились.
0
5 / 5 / 4
Регистрация: 09.12.2017
Сообщений: 208
05.06.2020, 21:35  [ТС] 40
Цитата Сообщение от ValeryS Посмотреть сообщение
там нет никакой конвертации
используется встроенный в дисплей кодогенератор
Вот как автор пишет:
"В итоге чтоб удобно было работать с кирилицей, надо всего навсего в библиотеку вывода данных вмонтировать функцию перекодировки символов. Что я и сделал."
Я попытался вытащить в отдельный файл эту функцию, но видимо что-то не доделал.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <avr/pgmspace.h>
static uint8_t lcd_rus(uint8_t);
//Таблица перекодировки в русские символы.
static const unsigned char PROGMEM convert_HD44780[64] =
{
    0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,
    0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,
    0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,
    0xAC,0xE2,0xAD,0xAE,0xAD,0xAF,0xB0,0xB1,
    0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,
    0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE,
    0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,
    0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7
};
static uint8_t lcd_rus(uint8_t c)
{
 
    if  (c > 191)
    {
        c -=192;
        c= pgm_read_byte(&convert_HD44780[c]);
    }
 
    return c;
}
Компилируется с варнингом- Warning 'lcd_rus' defined but not used [-Wunused-function]
Ну и если делать так
C
1
2
const uint8_t PROGMEM text_1[]="Мир не без доб-";
const uint8_t PROGMEM text_2[]="рых людей!!!";
C
1
2
copy_string_to_lcd(text_1, 0, 0);
copy_string_to_lcd(text_2, 0, 1);
то на дисплее крякозябры.

Добавлено через 4 минуты
Цитата Сообщение от Grey Посмотреть сообщение
для вывода кирилицы на дисплеи её не поддерживающие.
А я так понял, что это для дисплея с кириллицей.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2020, 21:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вывод на LCD HD44780 HEX кода
Доброго времени суток, господа. Прошу Вашей помощи в решение одной проблемы. Имею UHF RFID...

Работа с LCD дисплеем HD44780 из МК Atmega16 (GCC)
Здравствуйте, пытаюсь подключить LCD дисплей к микроконтроллеру, скачал библиотеку, но уже на...

Проблема с подключением lcd WD-C2002T (HD44780 + HD44100)
Имеется atmega8 и lcd WD-C2002T, даташита так и не нашел, единственное что есть...

ATMega8. Вывод данных с UART на LCD дисплей HD44780
Помогите разобраться с приемом данных с UART и выводом их на LCD-дисплей ...многое перепробовал, но...

LCD на базе HD44780+I2C+Atmega8 какие преимущества?
В общем-то в заголовке темы практически все есть. Небольшое уточнение вопроса: - какие...

Подключение LCD на HD44780 через I2C расширитель PCF8574 к Atmega8
Ребятки, срочно нужна помощь, голова скоро лопнет(( Нужно подключить сие чудо (lcd) к atmega8. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.