Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 11:41

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 12 янв 2020, 14:12 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Хопа, спросонья неправильно написал. Хотя в самом массиве правильно - 0, 1, 2, ... 9. Впрочем, если таблица кодировки перед глазами, легко всё понять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 13 янв 2020, 04:12 
Заглядывает иногда

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
Show

Воооот! Итого мы получили двухмерный массив шрифта с расположенными по порядку кодировки символами. Массив у нас начинается с символа цифры '1', ANSI-код которой = 48 (в десятичной). Изнутри массива мы не можем выкидывать неиспользуемые символы, иначе сдвинется порядок и нам придется писать перекодировку - сдвиг индексов с учетом отсутствующих элементов. В конце массива мы конечно можем убрать неиспольуземое - например оставить только до латинской заглавной 'Z'.

Поскольку начало массива у нас идет с цифры '1', ANSI-код которой = 48 (в десятичной), то весь массив сдвинут на 48 единиц относительно ANSI-кодов. Следовательно, в функции перевода ANSI в индекс массива мы должны вычесть 48.
Таким образом, пишем PrintChar('A'), а в реализации функции PrintChar мы получаем первый индекс двухмерного массива методом вычитания 48. Ну и не забываем, что массив шрифта - двухмерный.
font[ch][i],
где ch - это индекс символа, i - индекс байта в символе.
Таким образом, вывод символа в дисплей:
Show PrintChar(char ch)

в функцию SendDataByte() 6 раз подряд передается байт с индексами [ch-48][i], прочитанный из массива. Таким образом, в дисплей передаются 6 байт, составляющих символ шрифта.
Тут конечно упрощенный вариант, без установки координат вывода символа в дисплей. Можно доработать ф-цию, дописав установку координат. Координаты верхнего левого угла символа в пространстве дисплея устанавливаются командами дисплея. Причем, из-за особенностей дисплея координата Y в этом способе должна быть кратна 8.

Дальнейшим развитием будет ф-ция вывода в дисплей целой строки str[] = "Hello World" . Эта строка представляет собой одномерный массив ANSI-кодов букв. Процесс вывода строки выглядит так:
- командами дисплея устанавливаем координаты вывода верхнего левого угла первой буквы. Команды Set Page, Set Lower Column, Set Higher Column.
- последовательно в цикле выводится в дисплей каждый символ из массива str[]. Координаты следующего символа в строке инкрементируются по горизонтали автоматически дисплеем. Число выводимых букв в строке на первых порах можно подсчитать вручную.
Код:
PrintLine(str, 11)


Да, в вышепоказанном массиве шрифта я не вставил символ пробела ' ', имеющего ANSI-код 32 (десятичный). Поэтому, в начале массива надо поставить его, а затем поставить 15 элементов, в которые входят многие полезные символы, такие как '!', '+', '-', '.' и другие.

PS. Вместо двухмерного массива шрифта font[ch][byte] может стоять простой одномерный font[byte], представляющий собой просто иную запись двухмерного массива. Отличается лишь тем, что в описании массива нет внутренних { }, разделяющих символы, и тем, что индекс начала символа придется вычислять самому по формуле, и ранее приведенная функция перепишется немного иначе:
Show PrintChar(char ch)


PS2. Как видим, в показанных примерах нет никаких указателей, они тут не нужны. В примере автора темы указатели - это либо он что-то не так понял, либо автор того примера вообще неврубается, чего он пишет.

[/Spoiler]

Спасибо большое, что "разжевали". Я именно это и хотел узнать. Пример с & - это не моё, это то, что я взял за основу, но переделать решил сам под себя. С цифрами я разобрался- внутри формулы вычитаю смещение. С буквами , думаю, сделать так же, только смещение будет с условием (если цифра, то смещение такое-то, если буква, то такое-то). Про двумерность массива что-то сам не додумался: действительно, ведь, если внутренние скобки поставить, то он будет двумерным. У меня, кстати, так и есть. С выводом строки тоже, думаю, не так сложно - выводит данные пока не опустошится какой-нибудь буфер или просто выводить указанное кол-во символов. Спасибо ещё раз. Книжки-книжками, но с примерами и объяснениями намного проще и понятнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 13 янв 2020, 04:14 
Заглядывает иногда

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
demiurg1978 писал(а):
Kustenwache писал(а):
Не хотелось бы просто постоянно брать чьё-то творение и вставлять безумно в свои поделки. Хочу разобраться что к чему и делать под себя.

1 - Сесть разобраться, как будут располагаться данные. Как лучше в плане доступа, объема данных.
2 - Сесть прочитать учебник по языку си. Массивы, структуры. Указатели.
Учить и пробовать. Если затруднения тогда идти на форум.


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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB