Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 00:54

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



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

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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
Всех приветствую. Может мне кто-нибудь объяснить одну вещь. В детстве занимался на Бейсике, сейчас решил освоить МК и Си. Так вот. Создал шрифт для SSD1306, разместил в массиве. Вывод из массива по номеру символа в массиве работает, отображает. Но! Как сделать, чтоб выводился символ из массива не по номеру этого символа в массиве (как у меня, например: Print (0)), а вот так: Print ('A')? Я так понимаю, что шрифты, которые создаются в специальных программах, все символы размещают по строго определённым адресам, вывод типа Print 'A' передаёт в функцию указатель на этот символ в массиве. Или я что-то не так понимаю? Извиняюсь, что много и сумбурно написал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 10 янв 2020, 15:40 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
Надо просто завести еще один массив, в котором будет прописано соответствие между кодовой таблицей и символами из шрифта. И в этом случае font[koi8['A']] даст нам как раз адрес буквы 'A' в массиве шрифтов согласно кодовой таблице КОИ8-Р.


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

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3492
'A' и есть номер, 'A' == 65.

Eddy_Em писал(а):
И в этом случае font[koi8['A']] даст нам как раз адрес буквы 'A' в массиве шрифтов согласно кодовой таблице КОИ8-Р.

а это уже может зависеть от того в какой кодировке сам текст исходного кода программы схоранён.


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
_pv писал(а):
'A' и есть номер, 'A' == 65.

Eddy_Em писал(а):
И в этом случае font[koi8['A']] даст нам как раз адрес буквы 'A' в массиве шрифтов согласно кодовой таблице КОИ8-Р.

а это уже может зависеть от того в какой кодировке сам текст исходного кода программы схоранён.

В том-то и дело, А у меня = 65. Посмотрел в дизассемблере. Просто у других в шрифтах один массив. Вот и подумал, что символом как-то передаётся информация о том, какой символ нужно отобразить (типа указатель).


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
Eddy_Em писал(а):
Надо просто завести еще один массив, в котором будет прописано соответствие между кодовой таблицей и символами из шрифта. И в этом случае font[koi8['A']] даст нам как раз адрес буквы 'A' в массиве шрифтов согласно кодовой таблице КОИ8-Р.

Просто у других в шрифтах один массив.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 10 янв 2020, 16:45 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
Если в шрифте один-единственный массив, то он за яйца притянут к кодировке. Например, вот так. Такой подход имеет два больших минуса: очень много тратится флеша на запись нулей в неопределенные символы, а при переходе к другой кодировке всю таблицу придется перетасовывать.
Поэтому удобней-таки в отдельной таблице хранить шрифт — только те символы, что определены. А в другой таблице, которая в любой кодировке будет иметь длину 256 байт (и таким образом экономить прилично флеша), прописывать соответствие. В итоге если понадобится нарисовать букву 'Б' (ее код равен 0xe2), берем из индексной таблицы элемент с номером 0xe2 и получаем номер символа в таблице шрифтов. Если вдруг кодировка не КОИ8-Р, а, скажем, cp866, то делаем другую индексную таблицу. Вуаля!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 10 янв 2020, 17:33 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3051
enum?

EDIT: Хотя кириллицу в enum придется заменять каким-то обозначением латиницей. Понять бы тогда что у автора сейчас и что он хочет. И что в "других местах только один массив" - где?


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
NStorm писал(а):
enum?

EDIT: Хотя кириллицу в enum придется заменять каким-то обозначением латиницей. Понять бы тогда что у автора сейчас и что он хочет. И что в "других местах только один массив" - где?

Автор посмотрел массивы других товарисчей в разных разных их устройствах. Там, как правило, одномерный массив с кириллицей, латиницей всем, чем можно. Мне же достаточно цифр и нескольких букв. Вот я их нарисовал, сохранил в массиве. Дисплей SSD1306 (он мне подходит под моё изделие). На как, например, мне показать давление на этом дисплее увязав функцию вывода давления с цифрами в массиве.


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
Eddy_Em писал(а):
Если в шрифте один-единственный массив, то он за яйца притянут к кодировке. Например, вот так. Такой подход имеет два больших минуса: очень много тратится флеша на запись нулей в неопределенные символы, а при переходе к другой кодировке всю таблицу придется перетасовывать.
Поэтому удобней-таки в отдельной таблице хранить шрифт — только те символы, что определены. А в другой таблице, которая в любой кодировке будет иметь длину 256 байт (и таким образом экономить прилично флеша), прописывать соответствие. В итоге если понадобится нарисовать букву 'Б' (ее код равен 0xe2), берем из индексной таблицы элемент с номером 0xe2 и получаем номер символа в таблице шрифтов. Если вдруг кодировка не КОИ8-Р, а, скажем, cp866, то делаем другую индексную таблицу. Вуаля!

Вот это мне и нужно. У меня только цифры и несколько букв будет. Я их сделал. Потому что брать чей-то шрифт со всеми буквами и знаками мне ни к чему. Я и думал, что у них каждый символ каким-то образом привязан к кодировке. А когда в функции пишешь 'А', например, то передаёшь адрес этого символа, верно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 10 янв 2020, 18:11 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
(сарказм) я канешна не спецыалистъ, но мне так кааацца, чта 'A' имеет вполне определенное числовое значение в таблице ANSI. Конкретно для латинской заглавной 'A' = 65 (0x41).

Есть несколько способов хранения массива шрифта. Самый простой:
font[кол-во символов][кол-во байт в символе] = {{байты первого символа}, {байты второго символа}, ...и так далее };
Первый индекс хранит номер символа. По нему организуется выбор начала для считывания данных символа. Например, ANSI-коды цифр начинаются с 0x30 (48 в десятичной). Таким образом, для символа '2' можно получить первый индекс в массиве вот так: ch - 48 или даже вот так: ch - '0', где ch = '2' или 50 в десятичной.
Вообще, таблица печатаемых ANSI-символов начинается со значения 0x20 (32 в десятичной). Поэтому можно иметь двухмерный массив шрифта, а первый индекс вычислять методом вычитания 32 из передаваемого ANSI-кода символа.

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


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
BusMaster писал(а):
(сарказм) я канешна не спецыалистъ, но мне так кааацца, чта 'A' имеет вполне определенное числовое значение в таблице ANSI. Конкретно для латинской заглавной 'A' = 65 (0x41).

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

Я вот про этот вариант и думал, наверное. Только не пойму как реализовать это? Когда-то взял библиотеку стороннюю, там были все символы, включая непечатные. И вот там в функции вывода строка: (pgm_read_byte (&(OLED_Buff [c*5+x]))). Так вот тут вместо "с" можно как 'A' в аргументе использовать, так и просто 65. Выведет букву А. Я хочу такую же функцию сделать. Не пойму, как компилятор (функция) вычисляет в массиве именно ту букву, какую нужно. Перечитал кучу всего- нигде об этом не написано. &- это ж указатель? Следовательно, адрес каким-то образом "зафиксирован"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 10 янв 2020, 22:25 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Быть может, будет проще, если вначале прочитать книжку Ритчи "Язык программирования Си"? Потому что значок & в данном случае означает операцию получения числового значения адреса хранения переменной. Есть переменная var, в процессе работы или компилирования у нее появился физический адрес хранения. Команда &var выдает числовое значение адреса хранения переменной var. Аналогично с массивом. Есть массив элементов array[]. Получить адрес i-того элемента массива можно вот так: &array[i].
Поэтому, в записанной выше ф-ции в параметр передается числовое значение адреса хранения элемента массива под индексом, вычисляемым по формуле c*5+x.

Кстати, показанный вами пример хранения шрифта относится к разновидности первого варианта: обычный линейный массив. Индекс первого элемента символа просто вычисляется по формуле 5*ch, где 5 - это число байт в символе, ch - порядковый номер символа.
В этом варианте для перевода ANSI-кода в порядковый номер нужно вычесть ANSI-код первого символа в массиве шрифта.


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
BusMaster писал(а):
Быть может, будет проще, если вначале прочитать книжку Ритчи "Язык программирования Си"? Потому что значок & в данном случае означает операцию получения числового значения адреса хранения переменной. Есть переменная var, в процессе работы или компилирования у нее появился физический адрес хранения. Команда &var выдает числовое значение адреса хранения переменной var. Аналогично с массивом. Есть массив элементов array[]. Получить адрес i-того элемента массива можно вот так: &array[i].
Поэтому, в записанной выше ф-ции в параметр передается числовое значение адреса хранения элемента массива под индексом, вычисляемым по формуле c*5+x.

Кстати, показанный вами пример хранения шрифта относится к разновидности первого варианта: обычный линейный массив. Индекс первого элемента символа просто вычисляется по формуле 5*ch, где 5 - это число байт в символе, ch - порядковый номер символа.
В этом варианте для перевода ANSI-кода в порядковый номер нужно вычесть ANSI-код первого символа в массиве шрифта.


Спасибо, книгу я давно купил+на планшете она же. С указателями и взятиями адреса (разыменованием) затык пока. Я подумал, что мой пример относится ко второму варианту. Написал, как вы сказали (вроде, я так понял): (pgm_read_byte (&SIT_BIG[sym-0x30][i])). Теперь цифры выводятся правильно, если даже их так записать '0','2' и т.д. Осталось с буквами решить. Спасибо вам, хоть кто-то доходчиво объяснил. Только всё равно не пойму: откуда в приведёном примере компилятор "узнаёт" адрес порядкового номера символа ch? Может туплю, конечно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 10 янв 2020, 23:30 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Ой, с указателями не вы один испытывали проблемы. Половина начинающих об них спотыкались.
В данном примере адрес узнает не компилятор, а МК в процессе работы вычисляет адрес сам - работает механизм косвенной адресации.

С буквами решается точно так же, как и с цифрами. Таблица ANSI-кодов в помощь!


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
BusMaster писал(а):
Ой, с указателями не вы один испытывали проблемы. Половина начинающих об них спотыкались.
В данном примере адрес узнает не компилятор, а МК в процессе работы вычисляет адрес сам - работает механизм косвенной адресации.

С буквами решается точно так же, как и с цифрами. Таблица ANSI-кодов в помощь!


Таблицу я, конечно же, смотрю. У меня только пара вопросов осталась, если можно: 1. Я правильно понимаю, что если я в любой функции указываю, например, 'А', 'О', то МК автоматически понимает, что 'А'- это 0х65 (для другой кодировки что-то другое). 2. Мне просто не нужны все символы, только цифры и несколько латинских букв. Я их размещу в массиве, а в функции останется только учесть их смещение, верно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 11 янв 2020, 12:06 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2629
Это не от контроллера зависит, а от того - в какой кодировке документ (исходники) сохраняются.
Некоторые кодировки имеют от двух и более байт на символ.

С латиницей и цифрами проблем быть не должно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 11 янв 2020, 15:07 
Старожил

Зарегистрирован: 11 фев 2013, 01:54
Сообщения: 375
Kustenwache писал(а):
Print (0))


Этот самый "принт" откуда взялся?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 11 янв 2020, 15:18 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1181
Откуда: Brussels
Kustenwache писал(а):
Таблицу я, конечно же, смотрю. У меня только пара вопросов осталась, если можно: 1. Я правильно понимаю, что если я в любой функции указываю, например, 'А', 'О', то МК автоматически понимает, что 'А'- это 0х65 (для другой кодировки что-то другое). 2. Мне просто не нужны все символы, только цифры и несколько латинских букв. Я их размещу в массиве, а в функции останется только учесть их смещение, верно?


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 11 янв 2020, 16:03 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3693
Откуда: Новосибирск
Будем исходить из примера дисплея на семисегментных индикаторах. На семисегментный индикатор можно вывести числа от 0 до 9 и несколько букв. В своем последнем проекте я сделал так. Таблица из элементов структур число, символ-сегменты. В проекте пишу print_buf ('a'); print_str ("0123"); print_str ("TEST") ; Конечно, это перебор таблицы, но нет заморочек. Можно делать так: от 0 до 9 отнимаем 0x30, дальше по индексу, а символы уже перебором.
В вашем же случае придётся делать таблицу с сегментами. Каждый символ обзывается. Название символа адрес. Получается таблица с элементами структур символ - адрес. Это выгодно при ограниченном количестве символов в таблице. Ещё один пример. Пусть будет рваная таблица. Но куски линейные. В этом случае чтобы получить индекс, производятся вычисления. Скажем от 0 до 9. Отнимаем 0x30.

Show


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
Tester500 писал(а):
Kustenwache писал(а):
Print (0))


Этот самый "принт" откуда взялся?


Да это из чужой библиотеки. Там так функция вывода символа так называется.


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
//Mt писал(а):
Kustenwache писал(а):
Таблицу я, конечно же, смотрю. У меня только пара вопросов осталась, если можно: 1. Я правильно понимаю, что если я в любой функции указываю, например, 'А', 'О', то МК автоматически понимает, что 'А'- это 0х65 (для другой кодировки что-то другое). 2. Мне просто не нужны все символы, только цифры и несколько латинских букв. Я их размещу в массиве, а в функции останется только учесть их смещение, верно?


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


Да я понимаю про линейность) Пытаюсь разобраться,, как у того человека просто при вводе символа в кавычках в качестве аргумента выводится именно этот символ. Да, думаю придумать какую-нибудь структуру. Не хотелось бы просто постоянно брать чьё-то творение и вставлять безумно в свои поделки. Хочу разобраться что к чему и делать под себя. А так, спасибо, конечно, за ответ.


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

Зарегистрирован: 17 июн 2018, 22:05
Сообщения: 39
demiurg1978 писал(а):
Будем исходить из примера дисплея на семисегментных индикаторах. На семисегментный индикатор можно вывести числа от 0 до 9 и несколько букв. В своем последнем проекте я сделал так. Таблица из элементов структур число, символ-сегменты. В проекте пишу print_buf ('a'); print_str ("0123"); print_str ("TEST") ; Конечно, это перебор таблицы, но нет заморочек. Можно делать так: от 0 до 9 отнимаем 0x30, дальше по индексу, а символы уже перебором.
В вашем же случае придётся делать таблицу с сегментами. Каждый символ обзывается. Название символа адрес. Получается таблица с элементами структур символ - адрес. Это выгодно при ограниченном количестве символов в таблице. Ещё один пример. Пусть будет рваная таблица. Но куски линейные. В этом случае чтобы получить индекс, производятся вычисления. Скажем от 0 до 9. Отнимаем 0x30.

Show



Спасибо) Пытаюсь разобраться в вашем примере) Пока на службе, до компа доберусь - проверю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си, массивы, SSD1306
СообщениеДобавлено: 11 янв 2020, 17:51 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3693
Откуда: Новосибирск
Kustenwache писал(а):
Не хотелось бы просто постоянно брать чьё-то творение и вставлять безумно в свои поделки. Хочу разобраться что к чему и делать под себя.

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


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Kustenwache писал(а):
Пытаюсь разобраться,, как у того человека просто при вводе символа в кавычках в качестве аргумента выводится именно этот символ. .

Ну это же просто, уже ж объясняли выше.
На уровне компилирования проекта буквы в кавычках преобразуются в числа по таблице кодировки компилятора. Это число - есть порядковый номер первого индекса (индекса символа) в двухмерном массиве шрифта.
Вот пусть есть шрифт 8х6 пикс. размером. 8 пикс по вертикали упакованы в байт. И 6 пикс.по горизонтали представляют собой 6 байт. Таким образом, один символ размером 8х6 - это 6 байт.
Хорошо, напишем массив этих символов, начиная с цифр. В таблице кодировок порядок символов:
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', ... 'Z', [аналогичный промежуток в 7 символов] 'a', 'b', 'c', 'd', ... 'z'.
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. Как видим, в показанных примерах нет никаких указателей, они тут не нужны. В примере автора темы указатели - это либо он что-то не так понял, либо автор того примера вообще неврубается, чего он пишет.


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

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3693
Откуда: Новосибирск
Цифры вообще то от нуля идут. 0х30 и далее...


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


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


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

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


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

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

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