Как увеличить размер шрифта в библиотеке для Nokia 1100

hugoboss317
Offline
Зарегистрирован: 21.03.2013

axill пишет:
зачем морочиться при современной стоимости МК проще взять МК с большей памятью и вообще не поднимать вопроса ни о размере скетча ни о размере оперативной памяти

В основнов всё верно. Только както, к примеру использовать МК с флэшом 32К под исходник, скажем..10-12К ну как то жалко, как муху из пушки лупить. Более рационально использовать подходящий по объёму памяти. В данном случаи близко Атм16-168. Поэтому и возник принцип написать библиотеку под LCD на МК с RAM 1K

 

axill
Offline
Зарегистрирован: 05.09.2011

про ардуино я не писал. в ардуино выбор МК не сильно широкий.

идеального выбора нет, нужен какой-то разумный компромисс и каждый его находит для себя сам. крайности всегда плохой вариант. например практически не вижу смысла использовать tiny. по цене дешевле mega8 только tiny13. да и по размеру в общем то тоже только tiny13 в soap8 компактнее чем mega8 в tqfp32. любые другие тиньки и не меньше мега8 и не дешевле. тогда смысл?

у меня пока тоже ни одно устройство не вылезло за рамки atmega8/atmega168 но это при програмировании в atmel studio. С ардуино проект на 168-й уже требует ставить 328-ю.

axill
Offline
Зарегистрирован: 05.09.2011

hugoboss317 пишет:

В основнов всё верно. Только както, к примеру использовать МК с флэшом 32К под исходник, скажем..10-12К ну как то жалко, как муху из пушки лупить.

а здесь мы сами себя обманываем. Во первых что значит жалко? Чего жалеем? Нам кажется что будет "круче" если все будет использовано оптимально, но у этой крутости нет никакого практического смысла. Потому что во вторых сокращение числа используемых МК позволяет а. экономить на покупках (да да можно купить больше МК одного вид дешевле и универсальность всегда дешевле индивидуального подхода) б. сокращает время на разработку, потому, что по сути каждый МК это вопрос времени на накопления опыта его применения.

Ну подумаешь вы использовали 16к в 32к МК и что? Если он стоит всего на 15 центов дороже? (при покупке 10 штук мега168 стоит 13 долларов, а мега328 стоит 14.5).

все сказанное конечно справедливо только для не серийных разработок, но мы вроде про них и не говорим

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Возразить не могу ничего. Это тоже правельно. Ну рас уж так, не бросать же на пол дороги, и завалявшиеся МК надо куда то приспособить.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Hugoboss317 к вам вопрос. в работе дисплеев вы гораздо лучше разбираетесь поэтому к вам вопросы:

В дисплее пиксели это биты байтов. 9 раз по байту в высоту и 96 в ширину

то есть 9*96=864 байта

и так получается оптимальный шрифт (проще всего выводить) это 8 пикселей в высоту и любой ширины, хоть 96 пикселей

При этом получается 9 строк с точной позицией на дисплее.

Далее будем рассматривать вашу библиотеку.

У вас имеется возможность выводить в любую позицию. Тут возникает вопрос каким образом выводится текст не совпадающий с внутренней организацией памяти. например половина текста в 0 банке, а половина в 1 (для шрифта высотой 8 пикселей)

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, я тоже внимательно изучал даташит, но на самом деле в моей библиотеке текст выводится по банкам, я пока это не победил. Я знаю, координаты для текста задаются к примеру, 



LcdGotuXY(15, 25);

Но печатаются в координатах 



-Y%8

Я даже больше скажу, с пикселем тоже не всё гладко и тоже надо исправлять. При выводе пикселя печатается байт значение есть геометрическая прогрессия с множителем 2 а прогрессирующее число это 1. Т.е. чтоб вывести пиксель в первой строке банка нужно отправить 00000001, во второй строке 00000010 и т.д. А это значения 1. 2. 4. 8. 16. 32. 64. 128. Вот в той библиотеке Nokia2, пиксели выводятся чётко, один пиксель в одну координату, но мне немного не поятно что именно выводится.

 у меня пиксель выводится так:



LcdWrite(LCD_D,temp);

в Nokia2 вот так:



LCDCache[x+ (y/8)*LCD_X] |= _BV(y%8);

и еслиб кто-нибудь раскоментировал бы это, может и придумал бы что то

PS для интереса пробовал U8Glib. она и под 1100 и др с соответствующим контроллером и под 3310. 1100 не зажёгся. (запускал на АТм328)

axill
Offline
Зарегистрирован: 05.09.2011

На официальном сайте u8g нет драйвера для нокии 1100, для этого нужен драйвер контроллера pcf8814

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я не углублялся. Видил в ней команды для инициализации близкие к истине. Ещё раз повторюсь: достойных биб для pcf8814 предостаточно, нет смысла использовать U8G, хотя её функционал на высоте...

hugoboss317
Offline
Зарегистрирован: 21.03.2013

jeka_tm пишет:
У вас имеется возможность выводить в любую позицию. Тут возникает вопрос каким образом выводится текст не совпадающий с внутренней организацией памяти.

Хоть у меня такого, как я сказал, нет. Я отвечу как это делается. Перед выводом символа он разбирается по битам и если бит равет 1, то печатается точка, если 0, про пропускается увеличивая значение координаты. Зачем так!? Да потаму что пиксель можно поставить куда угодно, плюс легко реализовать функцию увеличения шрифта. Если увеличивать шрифт больше чем на 1, то печатается не точка, а закрашенный равносторонний пряпоугольник(квадрат) и значение координат добавляется на его ширину стороны (+2, +3, +4) Работаем в общем.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Делюсь опытом по шрифту, поэтому пишу сюда.

Речь пойдёт про "точку", разделяющюю целую и дробную часть выводимых значений и символов.

Соль в том, что ширина символов одинаковая и точка, выводимая между ними, как то занимает много места по ширене:

 даже если подвинуть её ближе к середине.

Неаккуратно как-то.

Я это немного подправил простым приёмчиком:

 А сэкономленное место использовал для двух пикселей между символоми (а не одного)

Работает на всё том же Atmega168 с килобайтной оперативкой (как можно заметить вывожу текст и графику) Верхние цифры - уровень воды в литрах, ниже в процентах, по бокам столбики - визуальный уровень.

А уменьшил расстояние для точки следующим образом:

Для вывода шрифта шириной 10, используется цикл for, и если адрес в массиве шрифта соответствует адресу точки т.е. 0x2e, "выпрыгиваем" из цикла. при выводе нижней части (если высота фрифта > 8) делаем то-же самое и плюс из значения координаты по Х вычитаем количество не выведеных байтов фрифта.

т.е. было так:







.............................................
for (int index = 0; index < 10; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));

  }

y_curr+=1;
.....................................................


for (int index = 10; index < 20; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));
  }
................................................

стало так:







........................................................................
for (int index = 0; index < 10; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));
	if(ch == 0x2e && index == 3) { break; }
  }
y_curr+=1;
........................................................................
for (int index = 10; index < 20; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));
	if(ch == 0x2e && index == 13) {
     x_curr-=6; break; }
  }

 

Немного доработал библиотеку перегрузив функции вывода строки символов

Тепеть вывод символов имеет такой же вид как и вывод значений переменных



LcdPrintln(Proc); //печатаем значение в роцентах
LcdPrintln("%");  //печатаем символ"%"