Перейти к содержанию

Подключение LCD с контроллером ST7920 к atmega8


Рекомендуемые сообщения

Нужна библиотека для этого lcd контроллера на avr( желательно atmel studio, но и code vision пойдет). Не могу понять, как вообще с ним работать :(

Девайс https://ru.aliexpress.com/item/Free-shipping-1pcs-lot-LCD-Board-12864-128X64-5V-blue-screen-display-ST7920-LCD-module-100/32322144504.html

Изменено пользователем Анатолий Грабаров
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

почитать даташит для начала. Узнать есть ли в нем знакогенератор. Но обычно это просто вектор видеопамяти в котором можно определять области вывода определенной длинны. В эти области пишутся спрайты. Для новичка не шибко простая тема. Много нюансов. Ну и не лишним будет отметить, что для растровиков без знакогенератора мега плоховасто подходит. Слишком большой обьем отжирает этот самый знакогенератор. Шрифт 5х7 отожрет порядка 9 кило флеша сразу. Это еще если не принимать во внимание тот факт, что скорость обмена сильно ограничивает динамику смены изображений. У меня подобная железяка на SPI на скорости 9 мегабит кое как 14 кадров в секунду отрисовывала. На меге больше кадра в секунду будет уже туго. Спасает правда что можно область вывода ограничивать

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Да ну, какую-то чушь несёте. У меня какой-то знаковый тошибовский дисплей 20x8 строк выдавал не меньше 30к/сек на процессоре Z80 с его монструозными по времени исполнения инструкциями, и тактовой частоте всего в 4Мгц. И знакогенератор 5x7 отъедает не больше 1.5кБ флеша, и то если его реализовывать весь - все 256 символов, из совместимости с кодировками на "больших машинах".

С этим индикатором думаю будет не хуже, там ко всему параллельная шина и 8 бит сразу входит.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Первая же ссылка в гугле https://habrahabr.ru/post/213459/ Плюс полно обсуждений на форумах. Плюс есть даташит

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

 

26 минут назад, Alexeyslav сказал:

И знакогенератор 5x7 отъедает не больше 1.5кБ флеша

это я по памяти писал. Но все равно следует учитывать что символы имеют поля и высотность. знакоместо 5х7 отнимает примерно 22 байта, если шрифт не примитивный. Как раз в 1,5 к уложится + таблицы индексов. Не больше 2К в общем.
 Пятница, вечер. Прошу понять и простить. Дисплей у меня был 320*240 цветной. Там все немного иначе на каждый пиксель

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, mail_robot сказал:

знакоместо 5х7 отнимает примерно 22 байта

Знакоместо 5х7 это массив, состоящий из 7 элементов по 5 БИТ. Т.к. минимальный размер переменной 8 бит, то имеем 7 байт на каждый символ. Откуда вы взяли 22 байта?

Ссылка на комментарий
Поделиться на другие сайты

а оттуда. Подумайте хорошенько а лучше попробуйте создать свой не примитивный не моноширинный шрифт. Сразу вылезут и поля и выравнивание по вертикали и заглавные и подстрочные и там и появятся те самые 22 байта.

5х7 это условно примитивный еще пример. Реально это разумный минимум, а на приборах бывает надо и куда как побольше размерчики использовать. Правда это в основном цифры

вот для примера пара символов 14 пиксельного шрифта

	/* @2990 'j' (4 pixels wide) */
	0x00, //     
	0x30, //   OO
	0x30, //   OO
	0x00, //     
	0x00, //     
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0x30, //   OO
	0xF0, // OOOO
	0xE0, // OOO 

	/* @3013 'k' (10 pixels wide) */
	0x00, 0x00, //           
	0xC0, 0x00, // OO        
	0xC0, 0x00, // OO        
	0xC0, 0x00, // OO        
	0xC0, 0x00, // OO        
	0xC1, 0xC0, // OO     OOO
	0xC3, 0x80, // OO    OOO 
	0xC7, 0x00, // OO   OOO  
	0xCE, 0x00, // OO  OOO   
	0xDC, 0x00, // OO OOO    
	0xF8, 0x00, // OOOOO     
	0xFC, 0x00, // OOOOOO    
	0xEE, 0x00, // OOO OOO   
	0xC6, 0x00, // OO   OO   
	0xC3, 0x00, // OO    OO  
	0xC3, 0x80, // OO    OOO 
	0xC1, 0x80, // OO     OO 
	0xC1, 0xC0, // OO     OOO
	0x00, 0x00, //           
	0x00, 0x00, //           
	0x00, 0x00, //           
	0x00, 0x00, //           
	0x00, 0x00, //           

 

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, mail_robot сказал:

вот для примера пара символов 14 пиксельного шрифта

А для чего используется пара байт на каждую строку? Можно в личку перейти, чтобы тему не засорять

Ссылка на комментарий
Поделиться на другие сайты

потому что если символ становится шире хотябы на 1 бит, то в матрицу придется добавлять второй байт в строку. Для моноширинных шрифтов типа courier ширина символов и полей всегда одинакова, для немоноширинных для каждого символа своя. Но моноширинник во первых более громоздкий на экране, а во вторых просто не красивый. Поэтому приходится изголяться.

вот картинка того для чего этот самый шрифт использовался. Согласитесь приятненько выглядит

IMG_20160613_180804.jpg

 

вот для примера строчки разных шрифтов, которые я использую. Видно, что моноширинники самые громоздкие

2016-05-28_13-35-42.png

 

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Да, классно смотрится =)

Я делал чуть по другому. У меня шрифт минимального необходимого размера, но есть функция масштабирования. Масштаб накладывался прямо при выводе символа.

Вот тут шрифт только цифры, на обоих картинках один и тот же шрифт  (округлые цифры обычная картинка).

4-164-18.jpg4-164-47.jpg

Аналогично тут. Мелкие и крупные цифры один и тот же шрифт.

4-164-36.jpg

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

ну обычно народ чтобы не заморачиваться как раз сводит все к масштабируемой моноширинке. Однако лоска в таком решении кмк не очень. Хотя для циферок я искусственно выравниваю знакоместа, так как перетирать становится проще и единичку подгонять, она самая узкая. Короче в шрифтах и их использовании на растровых дисплеях есть нюансы. Чтобы все понять надо хотябы раз самому попробовать, иначе сложновато обьяснить

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

вот для примера процедура вывода одиночного символа из проиндексированного массива. Долго обьяснять, но разобраться можно. Там основное то, что для разной высоты символов расчитывается определенной ширины спэйсер и для определенных символов выполняется специальная обработка в виде добавления пустых бит слева и справа. Может чтото еще чего уже не помню. Символ формируется в буфере, а потом целиком отправляется на дисплей по SPI через DMA. Эту часть можно мысленно выкинуть. Буфера два, потому как пока один символ выводится, второй уже обсчитывается (готовится) так как отправка по DMA и проц свободен. Переключение указателями. Почитайте, может как то поможет

Скрытый текст

/***************************** Отрисовка символа произвольной высоты ************************************/
uint16_t TFT_Putchar_ttf(uint16_t x, uint16_t y, const char c, const font_info_t* font, uint16_t ground, uint16_t color, uint8_t underlained)
{
	static uint16_t buf[2964]; //%=36+5*46 = 1848 pixels for font GOST_24
	static uint16_t buf2[2964];
	uint16_t* buf_ptr;
	static uint8_t Buf_flag = 0;
	uint16_t _ground;
	uint16_t _color;
	
	const uint8_t* bitmap_ptr;
	uint16_t font_height_bytes, char_width, string_length;//register
	uint8_t spacer;
	uint8_t char_tmp;
	//uint16_t buf_index;
	uint8_t add_1, add_2;
	
	if (Buf_flag) buf_ptr = &buf[0];
	else buf_ptr = &buf2[0];
	
	/* Get height in bytes */
	font_height_bytes = font->font_height;
	
	/* Calculate spacer width */
	spacer = font_height_bytes/8;
	if (spacer > 6) spacer = 6;
	
	/* Get width of current character */
	char_width = font->descr_array[c - (font->start_char)].char_width;
	
	/* Get cah length in bites*/
	if (char_width % 8 > 0) string_length = char_width / 8 + 1;
	else	string_length = char_width / 8;
	
	/* Get pointer to data */	
	bitmap_ptr = &( font->font_bitmap_array[font->descr_array[ c - (font->start_char) ].char_offset] );
	
	/* Calculate addition bits for char '1'*/
	if (c == '1')
	{
		uint8_t zero_width = font->descr_array['0' - (font->start_char)].char_width;
		if ((zero_width-char_width)%2 !=1) 
		{
			add_1 = (zero_width-char_width)/2;
			add_2 = add_1;
		}
		else {
			add_1 = (zero_width-char_width)/2;
			add_2 = add_1+1;}
	}
	
	for (uint8_t i = 0; i < font_height_bytes; i++) 
	{
		// exchange ground and color if char underlained
		if (((font_height_bytes - i) == 3 || (font_height_bytes - i) == 2) && underlained)
		{
			_ground = color;
			_color = ground;
		}
		else
		{
			_ground = ground;
			_color = color;
		}
		
		uint8_t steps;
		/*insert dummy bits*/
		if (c == '1')
			for(uint8_t j=0; j<add_1; j++)
			{
				*buf_ptr = _ground;
				buf_ptr++;
			}
		// fill char bitmap	
		for (uint8_t j = 0; j < string_length; j++) 
		{
			char_tmp = *bitmap_ptr;
						
				if ((char_width-j*8)>=8) steps=8;
				else steps = char_width%8;
				for (uint8_t k = 0; k<steps; k++)
				{
					if ((char_tmp << k) & 0x80) 
					{
						*buf_ptr = _color; // цвет текста
					} 
					else 
					{
						*buf_ptr = _ground; // цвет фона под текстом
					}
					buf_ptr++;
				}
				bitmap_ptr++;
			}
			if (c == '1')
				for(uint8_t j=0; j<add_2; j++)
					{
						*buf_ptr = _ground;
						buf_ptr++;
					}
			for (uint8_t k = 0; k<spacer; k++)
			{
				*buf_ptr = _ground;
				buf_ptr++;
			}
	}
	if (c == '1')	char_width = char_width + add_1 + add_2;
	
	// exchange output char buffers
	if (Buf_flag) 
	{
			buf_ptr = &buf[0];
			Buf_flag = 0;
	}
	else 
	{
			buf_ptr = &buf2[0];
			Buf_flag = 1;
	}
	TFT_SetCursorPosition(x, y, x+char_width+spacer-1, y+font_height_bytes-1);  
	TFT_sendCMD(ILI9341_GRAM);
	
	wTransferState = TRANSFER_WAIT;
	HAL_SPI_Transmit_DMA (TFT_SPI, (uint8_t*)buf_ptr, (char_width+spacer)*font_height_bytes*2);
	return (x+char_width+spacer);
}

 

 

дополнение - функция возвращает начальные координаты следующего символа. Удобно для вывода строк. И символ подчеркивания расчитывается отдельно, если передан флаг подчеркнутого символа. Удобно для отображения курсора в произвольном месте

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

5x7 шрифт сложно сделать не моноширинным, и вообще это не 7 байт на символ, а 5.
А то что в примерах, это уже шрифт 16x10 и больше. Когда-то даже программу писал для редактирования и экспорта шрифта в код, досихпор работает и досихпор актуальна.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Alexeyslav сказал:

не 7 байт на символ, а 5.

Ну 7 байт, т.к. 5 ширина, а 7 высота. Вывод идет горизонтальными строками, а не вертикальными, чтобы использовать автомнкремент адреса

Ссылка на комментарий
Поделиться на другие сайты

вертикальные шрифты удобнее конечно использовать в плане кодинга, но в принципе что те что другие приходится все равно перекодировать в пиксели перед выводом, так что по большому счету пофик.

14 часа назад, Alexeyslav сказал:

Когда-то даже программу писал для редактирования и экспорта шрифта в код

нынче их уже завались всяких. Сам пользуюсь The Dot Factory. Нравится количество опций и формат получаемых файлов. Бонусом прога умеет спрайты в битовые массивы конвертировать. Чисто личное предпочтение конечно. Видал и более продвинутые проги за небольшие деньги

14 часа назад, Alexeyslav сказал:

5x7 шрифт сложно сделать не моноширинным

факт. Нормальная кодировка без глюков и артефактов начинается где-то от высоты 12 (не для всякого). Оптимально 14 как мне показалось. И большинство символов займут минимум 2 байта в ширину. Символ решетки самый емкий, если с латинскими сравнивать. В кириллице конечно все иначе ))

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Что-то я почитал про прогу, она НЕ ПОЗВОЛЯЕТ рисовать шрифт, она конвертирует уже существующий в системе в битовую маску. И нафига такое нужно? По этой причине, первыми строчками написано что прога не умеет делать шрифт 5x7 и 8x8 ибо "результат сжатия шрифтов до этого размера ужасает".

Вот, немоноширинный шрифт конечно хорош, НО только для отображения больших простынь текста. Выглядит он замечательно, но когда пытаешься показать динамически меняющиеся значения картинка начинает прыгать туда-сюда, в колонках цифр(это видно даже по скриншоту выше) одни и те же разряды занимают разные смещения что выглядит просто ужасно, и вдвойне ужасней когда они начнут прыгать при изменении!

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Alexeyslav сказал:

она НЕ ПОЗВОЛЯЕТ рисовать шрифт

вот же какая незадача. А я то думал это очевидно. Вот бы я еще сидел и руками вырисовывал готовый шрифт

2 часа назад, Alexeyslav сказал:

картинка начинает прыгать туда-сюда, в колонках цифр(это видно даже по скриншоту выше)

чтото видимо со зрением. На моем скриншоте ширина поля для чисел везде одинаковая. Он фактически моноширинный в части отображения именно числовых символов. Об этой особенности я уже писал кстати, так что стоит все таки вернуться к вопросу зрения

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Со зрением в порядке, у вас цифры хоть и одинаковой ширины, но между ними затесалась запятая(точка)... которая сильно уже и сдвигает остальные цифры. Тогда уж, надо предусмотреть место под разделитель после каждой цифры.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Даже если порядок меняется, цифры не скачут. Точка то всегда одна. Я понимаю что не моноширинный шрифт имеет свои недостатки, но все таки он приятнее смотрится. С чем то приходится мириться, где-то хитрить, что-то обходить (например коварная единичка). Если короче - за красоту приходится платить. Я в общем то не настаиваю, каждый волен применять те инструменты какие именно ему нравятся. Мне нравится так, как подходит к конкретной задаче. Понадобится моноширинка, буду делать ей, не проблема.

Библиотеку автор запросто найдет в гугле, если мозги включит

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...