Графический режим.
В графическом режиме имеется возможность индивидуального управления свечением каждой точки экрана независимо от остальных. Обозначение этого режима следущее:
G r (Graphics) графический;
APA (All Points Addressable) все точки адресуемы.
В графическом режиме каждой точке экрана – пикселю – соответствует ячейка специальной памяти, которая читается схемами адаптера синхронно с движением луча монитора. Процесс постоянного чтения видео памяти называется регенерацией изображения.
Количество бит памяти, отводимое на каждый пиксел, определяет возможное состояние цветов пиксела, его яркость, мерцание и др. Например, при 1 бите на пиксел возможно только 2 состояния6 светится или не светится пиксел.
При 2 битах на пиксел – 4 цвета на экране;
при 4 битах на пиксел – 16 цветов на экране;
при 8 битах на пиксел – 256 цветов на экране – цветная фотография;
В настоящее время имеем 15 или 16 бит на пиксел (режим High Color), что соответствует 65 536 цветов, а при 24 битах на пиксел (режим Tru Color) соответствует 16,7 миллиона цветов.
При 15 или 24 битах на пиксел распределение между базисными цветами К:З:С равномерное, при 16 битах – не равномерное с учетом восприятия цветов ( 5:6:5 или 6:6:4).
2.1. Принципы организации видеопамяти.
Логически видеопамять может быть организована по-разному, в зависимости от количества бит на пиксел.
В случае одного или двух бит на пиксел каждый байт памяти соответствует восьми или четырем соседним пикселам строки (рис. 3.3, а,б). При сканировании ячейка считывается в регистр сдвига, из которого информация о соседних точках последовательно поступает на выходные цепи адаптера. Такой способ отображения называется линейным — линейной последовательности пикселов соответствует линейная последовательность бит (или групп бит) видеопамяти.





В адаптере EGA количество бит на пиксел увеличили до четырех и видеопамять разбили на четыре области-слоя, называемых также и цветовыми плоскостями (рис. 3.4). В каждом слое используется линейная организация, где каждый байт содержит по одному биту восьми соседних пикселов. Слои считываются в сдвиговые регистры одновременно, в результате параллельно формируются по четыре бита на каждый пиксел. Такое решение (а именно параллельное считывание слоев) позволяет снизить частоту считывания ячеек памяти — одна операция чтения производится за время прохода лучом восьми пикселов. Снижение частоты считывания ограничивается быстродействием памяти. Ячейки слоев, отвечающие за одни и те же пикселы, имеют совпадающий адрес. Это позволяет производить параллельную запись информации сразу в несколько цветовых плоскостей (запись для каждого слоя разрешается индивидуально), что также экономит время. Считывание со стороны магистрали, конечно, возможно только послойное.
Рис. 3.3, а . Линейное отображение групп памяти 1 бит на пиксел.






Рис.3.3,б. Линейное отображение групп памяти 2 бит на пиксел.

Рис. 3.4. Многослойное отображение пикселов памяти
Таким образом, объем видеопамяти (в битах) V, требуемый для хранения образа экрана, определяется, как произведение количества пикселов p в строке на количество строк n и на количество бит на пиксел b.
Так, для режима HGC 720 х 350 с одним битом на точку он составляет 252 000 бит или около 31 Кбайт, а 800 х 600 х 256 цветов — 480 000 бит или около 469 Кбайт.
Если физический объем видеопамяти превышает объем, необходимый для отображения матрицы всего экрана, видеопамять можно разбить на страницы. Страница — это область видеопамяти, в которой умещается образ целого экрана. При многостраничной организации видеопамяти только одна из них может быть активной — отображаемой на экран. Этим страницы принципиально отличаются от слоев, которые отображаются одновременно.
Формирование битовой карты изображения в видеопамяти графического адаптера производится под управлением программы, исполняемой центральным процессором. Сама по себе задача формирования процессору вполне по силам, но при ее решении требуется пересылка большого объема информации в видеопамять, а для многих построений еще и чтение видеопамяти со стороны процессора. При этом, канал связи процессора с видеопамятью представляет собой узкое горлышко, через которое пытаются протолкнуть немалый поток данных, причем чем более высокое разрешение экрана и чем больше цветов (бит на пиксел), тем этот поток интенсивнее. Для решения вопроса обмена информацией необходимо:
Повышение быстродействия памяти.
Расширение разрядности шин графического адаптера, причем как внутренней (шины видеопамяти), так и интерфейсной.
Повышение скорости видеопостроений с помощью кэширования видеопамяти или затенением видеопамяти, что, по сути, почти одно и то же. В этом случае при записи в область видеопамяти данные будут записаны как в видеопамять, так и в ОЗУ (или даже в кэш), а при считывании из этой области обращение будет только к быстродействующему ОЗУ.
Принципиальное сокращение объема информации, передаваемой графическому адаптеру за счет наделения адаптера своим «интеллектом», т.е. процессором.
В современном компьютере используются все эти решения, причем необходимо чтобы разрядность шин видеоадаптреа полностью совпадала бы с разрядностью видеопамяти. Иначе получается не эффективное использование одного или другого.
2.2.Особенности работы видеоадаптера.
К основным типам команд «интеллектуального» видео адаптера относятся:
— Команды рисования (Drawing Commands) обеспечивают построение графических примитивов — точки, отрезка прямой, прямоугольника, дуги, эллипса. Примитивы такого типа в командах описываются в векторном виде, что гораздо компактнее, чем их растровый образ. Таким образом, удается значительно сократить объем передаваемой графической информации за счет применения более эффективного способа описания изображений. К командам рисования относится и заливка замкнутого контура, заданного в растровом виде, некоторым цветом или узором (pattern). Она ускоряется особенно эффективно: при программной реализации процессор должен просмотреть содержимое видеопамяти вокруг заданной точки, двигаясь по всем направлениям до обнаружения границы контура и изменяя цвет пикселов на своем пути.
— Копирование блока с одного места экрана на другое применяется для «прокрутки» изображения экрана в разных направлениях. Эта команда сводится к пересылке блока бит — BitBIT (Bit Block Transferring), и эта операция интеллектуальным адаптером может быть сильно ускорена.
Аппаратная поддержка окон (Hardware Windowing) упрощает и ускоряет работу с экраном в многозадачных (многооконных) системах. На традиционном графическом адаптере при наличии нескольких, возможно, перекрывающих друг друга окон программе приходится отслеживать координаты обрабатываемых точек с тем, чтобы не выйти за пределы своего окна. Аппаратная поддержка окон упрощает вывод изображений: каждой задаче выделяется свое окно — область видеопамяти требуемого размера, в котором она работает монопольно. Взаимное расположение окон сообщается интеллектуальному адаптеру, и он для регенерации изображения синхронно с движением луча по растру сканирует видеопамять не линейно, а перескакивая с области памяти одного окна на другое.
Если объем видеопамяти превышает необходимый для данного формата экрана и глубины цветов, то в ней можно строить изображение, превышающее по размеру отображаемую часть. Интеллектуальному адаптеру можно поручить панорамирование (Panning) — отображение заданной области. При этом горизонтальная и вертикальная прокрутка изображения не потребует операций блочных пересылок — для перемещения достаточно лишь изменить указатель положения.
Вышеописанные функции интеллектуального адаптера относятся к двумерной графике (2D).
Трехмерное изображение должно состоять из ряда поверхностей различной формы. Эти поверхности «собираются» из отдельных элементов-полигонов, чаще треугольников, каждый из которых имеет трехмерные координаты вершин и описание поверхности (цвет, узор). Перемещение объектов приводит к необходимости пересчета всех координат.
Ускорение построений в интеллектуальном адаптере обеспечивается несколькими факторами:
Во-первых, это сокращение объема передачи по магистрали.
Во-вторых, во время работы процессора адаптера центральный процессор свободен, что ускоряет работу программ даже в однозадачном режиме.
В-третьих, процессор адаптера ориентирован на выполнение меньшего количества инструкций, а потому способен выполнять их гораздо быстрее центрального.
В-четвертых, скорость обмена данных внутри адаптера может повышаться за счет лучшего согласования обращений к видеопамяти для операций построения с процессом регенерации изображения, а также за счет расширения разрядности внутренней шины данных адаптера.
Современные адаптеры с ЗD-акселераторами (самые критичные к производительности памяти) строятся на памяти SGRAM (SDRAM) со 128-разрядной шиной, а в самых мощных применяется память с удвоенной частотой передачи DDR SGRAM/SDRAM.
Для построения сложных трехмерных изображений графическому акселератору будет явно тесно в ограниченном объеме видеопамяти. Для обеспечения доступа к основной памяти компьютера он должен иметь возможность управления шиной (bus mastering). Специально для мощных графических адаптеров в 1996 году появился новый канал связи с памятью — AGP (Accelerated Graphic Port). Обеспечив высокую пропускную способность порта, разработчики AGP предложили технологию DIME (Direct Memory Execute). По этой технологии графический акселератор является мастером шины AGP и может пользоваться основной памятью компьютера для своих нужд при трехмерных построениях. Например, в основной памяти могут храниться текстуры, которые акселератор накладывает на трехмерные поверхности. При этом снимается ограничение на размер описания текстур, которые без AGP приходится держать в ограниченном объеме видеопамяти. На дешевое решение проблемы «тесноты» нацелена и архитектура однородной памяти UMA, которая может быть реализована с помощью AGP. Однако AGP позволяет сохранить и локальную память на графическом адаптере (видеобуфер) и расширение доступной памяти не отзывается снижением производительности.
Видеорежимы
Выделяют два вида режимов работы видеоадаптера, отличающиеся способом формирования видеосигнала: графический и текстовый. Для монитора оба режима одинаковы.
Графический режим
Для графического Gr (Graphics) или АРА (All Points Addressable – все точки адресуемы) режима видеоадаптера характерна возможность индивидуального управления каждым пикселом (точкой или триадой) выводимого на экран изображения. Каждому выводимому пикселу соответствует двоичный код, хранимый в ячейках видеопамяти. Кодированием задают количество цветов, градаций яркости или таких атрибутов, как мерцание, инверсия и др. Для кодирования пиксела используется п битов, которые определяют число возможных состояний пиксела. При выводе цветных изображений число п бит/пиксел называют глубиной цвета. При этом количество отображаемых цветов равно 2п, а размер кадрового буфера видеопамяти, необходимый для хранения цветного изображения с разрешением N х М и глубиной цвета п бит/пиксел, составит N×M×n бит.
В настоящее время используются два цветовых режима:
- • High Color с глубиной цветов:
- – 15 бит/пиксел (215 = 32 768 цветов) и распределением битов между базовыми цветами (красным, зеленым и синим) R : G : В = 5 : 5 : 5,
- – 16 бит/пиксел (65 536 цветов) и распределением битов между базовыми цветами 5:6:5 или 6:6:4;
Обычно в видеопамяти хранится полный кадр образа изображения, подготовленного центральным процессором. Объем памяти для хранения одного кадра образа изображения называется страницей. При большом объеме видеопамяти она разбивается на страницы, т.е. может содержать несколько кадровых буферов.
Ячейки памяти сканируются с частотой кадровой развертки, и за один цикл кадр выводится на экран. Процесс постоянного сканирования видеопамяти называется регенерацией изображения.
Принцип образования цветовой палитры состоит в том, что путем включения/выключения лучей с одинаковым уровнем яркости при засветке триады основных цветов (красного, зеленого и синего) возможно создание палитры из 23 = 8 цветов. Если дополнительно использовать k уровней яркости для каждого цвета, то количество цветов палитры возрастает до 23к. Кодируемый уровень каждого базового цвета с помощью ЦАП переводится в аналоговый сигнал, который подается на модулятор ЭЛТ.
В режимах High Color и True Color используется линейная организация видеопамяти, при которой для отображения цвета каждого пиксела на экране задействовано 2 или 3 байта. Растровый формат хранения изображения, при котором пикселы образа изображения на экране отображаются на биты ячеек памяти, называется битовой картой (Bit Мар).
Битовая карта формируется в видеопамяти графического адаптера под управлением программы, исполняемой центральным процессором. На первом этапе процессор готовит порцию данных, а на втором – передает их в видеопамять по каналу связи. Передача данных от процессора возможна только в те моменты, когда в монитор из видеопамяти не выводятся биты для регенерации изображения. В противном случае данные от процессора попадут на экран и создадут помехи в виде "снега". Существует несколько путей решения этой проблемы:
- • расширение разрядности шин каналов связи процессор-видеопамять и видеопамять-монитор, что позволит увеличить количество передаваемых бит за один цикл;
- • использование кэша, что позволит повысить скорость формирования битовой карты;
- • использование второго кадрового буфера в видеопамяти, что позволит разделить операции записи и считывания данных;
- • использование двухпортовой видеопамяти, что позволит одновременно записывать и считывать данные;
- • использование в видеоадаптере собственного специализированного процессора, способного формировать в видеопамяти битовую карту по командам из центрального процессора.
Графический режим является основным режимом работы видеосистемы современного персонального компьютера, поскольку в нем на экран монитора можно вывести текст, рисунок, фотографию, анимацию или видеосюжет. Для эффективной работы в графическом режиме требуются значительный объем видеопамяти и высокопроизводительный компьютер.
Графический режим
графический режим — Способность некоторых текстовых процессоров воспроизводить графику путем печати близко расположенных друг к другу символов, а не с помощью отдельных пикселей. Часто используется в графике низкого разрешения. [http://www.morepc.ru/dict/]… … Справочник технического переводчика
графический режим вывода (все точки адресуемые) — Например, о графическом режиме вывода видеографического адаптера VGA. [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN all points addresableAPA … Справочник технического переводчика
графический режим с низким разрешением — — [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN low resolution mode … Справочник технического переводчика
графический адаптер Hercules — Поддерживал черно белый графический режим с разрешением 720 х 348. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN Hercules Graphic AdapterHGA … Справочник технического переводчика
графический текстовый режим — Метод представления текстовых символов с помощью графических элементов. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN graphics text modeGTM … Справочник технического переводчика
Графический интерфейс — пользователя (ГИП), графический пользовательский интерфейс (ГПИ) (англ. Graphical user interface, GUI; сленг. ГУИ, ГУЙ) система средств для взаимодействия пользователя с компьютером, основанная на представлении всех доступных пользователю… … Википедия
Графический пользовательский интерфейс — Графический интерфейс пользователя (ГИП), графический пользовательский интерфейс (ГПИ) (англ. Graphical user interface, GUI; сленг. ГУИ, ГУЙ) система средств для взаимодействия пользователя с компьютером, основанная на представлении всех… … Википедия
Графический акселератор — Видеокарта семейства GeForce 4, с кулером Видеокарта (известна также как графическая плата, графическая карта, видеоадаптер) (англ. videocard) устройство, преобразующее изображение, находящееся в памяти компьютера, в видеосигнал для монитора.… … Википедия
Графический адаптер — Видеокарта семейства GeForce 4, с кулером Видеокарта (известна также как графическая плата, графическая карта, видеоадаптер) (англ. videocard) устройство, преобразующее изображение, находящееся в памяти компьютера, в видеосигнал для монитора.… … Википедия
Графический ускоритель — Видеокарта семейства GeForce 4, с кулером Видеокарта (известна также как графическая плата, графическая карта, видеоадаптер) (англ. videocard) устройство, преобразующее изображение, находящееся в памяти компьютера, в видеосигнал для монитора.… … Википедия
Графический и текстовый режим дисплеев Winstar
Графические дисплеи, в том числе и типа OLED, больше всего представленные на нашем рынке фирмой Winstar, имеют куда меньший спрос по отношению к строчным и публикаций по их применению также намного меньше. Между тем, именно графические OLED-дисплеи из-за отсутствия привязки к таблицам шрифтов предопределенного рисунка, предоставляют наилучший способ для получения эргономичных индикаторных устройств для самых разных надобностей. Причем оказалось, что графический режим в контроллере WS0010 иницируется проще и работает стабильнее, чем текстовый.
Прежде чем перейти к рассмотрению собственно графических дисплеев, рассмотрим вечнозеленую проблему с проблемами включения текстового режима контроллера WS0010, которая получила неожиданное и очевидное решение (ах, где были мои глаза!).
Решение проблем текстового режима WS0010
Общеизвестно, что строчные дисплеи Winstar имеют проблемы со стабильностью при инициации. Выяснилось, кстати, что характерно это совсем не только для «проклятых китайцев»: добытые мной с большими трудностями образцы Newhaven Display 16х2, находящейся на другой стороне земного шара, внешне являются полной копией Winstar, за исключением расположения некоторых надписей и названия фирмы на нашлепке (той же формы и с тем же шрифтом):

Содержащие, как написано в datasheets, некий «LCD comparable» контроллер, эти дисплеи ведут себя совершенно идентично китайским и имеют те же недостатки. Очевидно, на проверку других фирм, вроде Midas, времени тратить не стоит: судя вот по этой публикации, и там без международной кооперации не обошлось. Глобализированная экономика рулез!
Трудности текстового режима выражаются в том, что при запуске (например, при перезагрузке или ручном ресете программы управляющего контроллера) на дисплеях может появляться мусор, а строки 0 и 1 произвольно меняются местами. Эксперименты показали, что от метода включения (8-ми или 4-х битный) это не зависит. Особенно остро стоит этот вопрос при необходимости периодической софтовой перезагрузки, например, по Watchdog-таймеру.
Частично проблему решает аккуратное отношение к питанию (от отдельного источника, и ни в коем случае не от USB Arduino), и отдельная перезагрузка через выключение-включение питания дисплея после запуска управляющей программы (см. предыдущую публикацию автора). Как выяснилось, автор этих строк не единственный, кто предлагал подобное решение проблемы: автор надстройки над LuquidCrystal под названием WinstarOLED также включил в нее специальный pw_pin, с помощью которого в момент запуска программы передергивается питание дисплея.
Но это все, конечно, самодеятельность и полумеры. На радикальный способ натолкнулся некто SeregaB (см. его публикацию на easyelectronics.ru — благодарю Tomasina за наводку). Он вообще-то ставил совсем другую задачу: научиться работать как раз с графическим, а не текстовым режимом. Попытавшись попереключаться между режимами, он быстро обнаружил, что «переключение в графический режим происходило нормально, а из графического в «текстовый» — очень коряво». Тогда он вспомнил, что «когда-то, давным-давно, когда ДШ еще печатали на бумаге, в каком-то из ДШ на HD44780 я читал, что переключение режимов надо делать только при выключенном экране». И все заработало.
Из цитировавшейся публикации я тут просто воспроизведу две процедуры переключения, несколько адаптировав их под использование совместно с LuquidCrystal (экземпляр класса здесь называется OLED1).
Переключение в графический режим:
Переключение в текстовый режим:
Как мы увидим далее, первая процедура не очень-то и нужна: WS0010 переключается в графический режим с полпинка, достаточно послать в него команду 0x1F. А вот вторая последовательность команд оказалась очень по делу. Для пробы она включалась прямо в скетч с использованием LuquidCrystal в таком виде:
Затем эта функция вызывалась в setup прямо сразу после инициации библиотеки:
Если перед этим еще вставить какой-нибудь delay(500), то демонстрация оказывается очень наглядной: после нажатия кнопочки ресета платы Arduino на экране, как обычно появляется мусор, но только на мгновение: после срабатывания функции экран очищается и все строки оказываются на своих местах.
Функция работает и так, но для удобства я заменил этой последовательностью команд содержимое функции LiquidCrystalRus::clear() в файле модернизированной библиотеки LiquidCrystalRus_OLED.cpp, о которой шла речь ранее (напомню, что скачать ее можно с сайта автора). Ожидания выполнения команды в библиотеке не предусмотрено, потому для надежности после каждой команды там в общем стиле библиотеки вставлены задержки 100 мкс. В скетчах, использующих этот вариант LiquidCrystalRus_OLED, в начале setup обязательно надо вызывать функцию clear(), при этом она заодно и почистит экран.
Теперь займемся, наконец, графическим режимом.
Графический режим в текстовых дисплеях WEH001602
Для начала я попробовал имевшийся у меня текстовый дисплей WEH001602BG переключить в графический режим. Отметим, что у графического 100х16 и текстового (конфигурации 20х2, у 16х2 просто меньше точек по горизонтали) дисплеев идентичные матрицы, только у текстового они разделены промежутками на знакоместа. Это сильно ограничивает применение графического режима в текстовых дисплеях, и еще больше текстового режима в графических. Но для проверки, как это работает, можно использовать любой их них.

Дисплей вместе с часами DS1307 подключался к Arduino Nano по следующей схеме:
По этой же схеме будем подключать в дальнейшем и графические дисплеи. Серым цветом на схеме показано подключение второго дисплея, если он необходим.
Для переключения в графический режим можно использовать и усовершенствованную процедуру из предыдущего раздела, но вполне работает простая функция из одной команды:
Никакой русской таблицы нам здесь не потребуется, потому применяется стандартная (неотрихтованная) LiquidCrystal, которая в графическом режиме работает безупречно. Чтобы не возиться с отладкой всех вариантов библиотеки, в случае, когда включены параллельно текстовый и графический варианты дисплеев, то для каждого я применяю свою библиотеку (для текстового модернизированную Rus_OLED, для графического обычную). Подключение при этом можно все равно делать к одним и тем же ножкам контроллера, за исключением выводов разрешения E, согласно вышеприведенной схеме.
Далее я частично использовал наработки автора упоминавшейся библиотеки WinstarOLED (сама по себе эта надстройка над LuquidCrystal, на мой взгляд, недоработана, и применять ее as is нецелесообразно). Он ввел удобную функцию установки графического курсора (здесь исправлена ошибка оригинала в части максимального значения x):
Константа LCD_SETDDRAMADDR определена в библиотеке LiquidCrystal. Дисплей 100х16, как и текстовый, делится на две строки 0 и 1, потому y здесь может принимать только два значения. А горизонтальная координата x варьируется от 0 до 99. По установленной координате командой lcd.write() посылается байт, отдельные биты которого определяют светящиеся позиции вертикальной линии длиной в 8 точек. Крайняя левая позиция в верхней строке имеет координаты 0,0, крайняя правая в нижней — 99,1. Причем верхней точке будет соответствовать младший бит, а нижней точке — старший.
Для удобства кодирования картинок я расчертил табличку, в которой можно быстро создать нужный код вручную. Для полных таблиц шрифтов, конечно, целесообразно применять специальные редакторы (которых не меньше миллиона разной степени самодеятельности), но 10 цифр с нужным порядком бит быстрее обработать вручную, тем более, что автоматически создаваемые шрифты часто все равно приходится допиливать руками. В соответствии со сказанным выше, глиф, например, цифры 2 шрифтом 10х16 будет кодироваться следующим образом:

Все это записывается в двумерный массив вида:
Для каждой цифры 0-9 создается отдельный такой массив Data0, Data1, Data2 и так далее. Для часов, кроме цифр, потребуется еще двойная точка. Ее можно сделать покороче:
Так как в графическом режиме контролер «блинкать» не умеет, то мигать двоеточием придется программно. Гасить двойную точку можно и просто выводом нулей в соответствующие позиции, но для единообразия я сделал отдельный массив
Для вывода каждой цифры и отдельно для двойной точки пишется отдельная функция:
Все функции одинаковые, но используют разные массивы, а для двойной точки и другие пределы цикла. Получилось не слишком экономично в части объема кода (см. об этом далее), зато наглядно и легко править ошибки. Учет промежутков между символами производится на стадии вывода, указанием соответствующей позиции (для чтения часов применяется библиотека RTClib):
Десять цифр по 20 байт займут в памяти 200 байт — около 10% ее объема (а широкий шрифт 16х16, как в примере ниже, и все 16%). Полный одноязычный шрифт такого размера вместе с цифрами, без учета всяческих знаков препинания и спец. символов, содержит от 62 (английский) до 74 (русский без Ё) символов, значица, займет почти половину оперативной памяти ATmega328. Потому фокусы с массивами и функциями вывода раздельно для каждого символа придется отменить, и делать, как положено. То есть шрифты оставлять в программной памяти и загружать через PROGMEM, а все рисунки глифов оформлять в виде единого массива шрифта, и загружать для вывода по номеру символа в единой таблице. В противном случае и памяти не хватит и код программы раздуется до неуправляемого объема. Здесь мы на этом останавливаться не будем, потому что в наших простых примерах все это не потребуется — мы каждый раз будем ограничиваться небольшим строго необходимым количеством символов.
Из-за большого размера полного текста скетча GraphicOLED_DC1307 я его не привожу, скачать его можно здесь. В тексте сохранена функция resetOLED, которая передергивает питание дисплея при перезагрузке контроллера (через pwrPin D2), но она ни разу не понадобилась, так что ее можно спокойно удалить. Результат работы программы показан на фото:

К сожалению, одновременное пребывание в текстовом и графическом режиме исключено, потому, если вы хотите использовать оставшееся место, то придется рисовать свои шрифты (там остается место примерно на 7 символов шрифта 5х7 в каждой строке).
Графический дисплей WEG010016A
Когда, наконец, приехали заказанные графические дисплеи WEG010016AL, я начал с того, что попробовал их ввести в текстовый режим с целью посмотреть, что из этого выйдет.
Для проверки текстового режима была загружена программа имитации дисплея часов-календаря с датчиком внешней температуры, описанная в предыдущей публикации. Полученный результат заставил меня вспомнить, что разные дисплеи Winstar могут быть по разному ориентированы относительно разъема (в данном случае у WEG010016A разъем вверху, у текстовых WEH001602B, которые мы применяли выше — внизу, у типа С — вообще сбоку):

С ориентацией дисплея будем разбираться далее, а пока так посмотрим, что получилось. А получилось ничего хорошего: текстовый режим (разумеется, снабженный костылем, о котором речь шла в начале статьи) работает безупречно, но на практике его применять бессмысленно из-за отсутствия промежутков между символами. Потому не будем на нем задерживаться, а перейдем к рассмотрению графического режима.
Сами процедуры установки графического режима те же самые, что разбирались выше для текстового варианта. Осталось разобраться с переворотом дисплея, если у него разъем вверху относительно экрана. Конечно, можно, просто перевернуть дисплей, но положение с обращенным вниз разъемом мне кажется более естественным и удобным. Кроме того, при использовании типа с разъемом сбоку может понадобиться ориентировать разъем вправо, а не влево. Для ориентации «вверх ногами» необходимо преобразовать картинку — то есть поменять местами первую и последнюю позиции по горизонтали, строки, а также реверсировать порядок бит в байтах, составляющих массив (при этом младший бит будет соответствовать нижней точке).
Так как у меня уже были разрисованы десять цифр для предыдущего случая, то для последней задачи оставалось ввести процедуру программной реверсии:
Поменять порядок следования координат по горизонтали и строк по вертикали можно внесением изменений в функцию setGraphicCursor:
Функции вывода массива каждой цифры при этом остаются теми же самыми, только добавляется реверсия бит:
Полный скетч вывода часов GraphicOLED_DC1307_100x16 можно скачать отсюда, а результат для дисплея WEG010016AL представлен на фото:

А вот на этом фото шрифт другого типа (16х16) на дисплее WEG010016CG (дисплей также перевернут):

Если вы создадите шрифт заново, поменяв порядок бит вручную, то реверсии делать не надо и программа будет выполняться быстрее (хотя на глаз особых задержек и так не заметно). Но приведенная процедура переворота бит пригодится в любом случае — для отображения различных картинок. Например, из одной стрелки, направленной вверх-вправо, программным путем можно получить сразу четыре направления.
Картинка и код стрелки (координаты и биты в таблице инвертированы в соответствии с нижним положением разъема для дисплея WEG010016AL, см. выше):

Функции вывода разнонаправленных стрелок:
На фото ниже представлен результат программы-заготовки дисплея датчика скорости и направления ветра. Как видите, здесь оказалось очень просто реализовать в одной строке шрифты разных размеров совместно с картинками:

В заключение добавлю, что вот тут находится очень интересная библиотека для работы с WS0010 в графическом и текстовом режимах по SPI. В текстовом она большей частью копирует Liquid Crystal (а что там еще можно придумать?), а в графическом имеет функции рисования графических примитивов, встроенные шрифты (толстый, как у меня, и обычный 5х7) и еще много всего другого.