[Развлечение со встроенным экранным дисплеем] (6) Использование аппаратной функции вертикальной прокрутки ST7789 SPI LCD.
[Развлечение со встроенным экранным дисплеем] (6) Использование аппаратной функции вертикальной прокрутки ST7789 SPI LCD.

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

1. Рождение идей

Небольшой ЖК-экран платы разработки Little Bear Pi использует микросхему драйвера ST7789. У меня всегда была идея реализовать прокрутку дисплея на этом экране. Первоначальная идея заключалась в создании большой очереди на стороне MCU. передать содержимое всего экрана управлению очередью, а затем постоянно обновлять весь экран, чтобы добиться прокрутки экрана.

Теоретически такая реализация является относительно ресурсоемкой, потребляя ресурсы ЦП для работы периферийных устройств SPI и ресурсы памяти для хранения данных дисплея, поэтому она никогда не применялась.

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

Хм? Прокрутить? прокрутить? Откройте для себя новый континент!

Согласно главе 8.14 руководства, вращательная прокрутка — это только режим вертикальной прокрутки, который определяется командой определения области вертикальной прокрутки (0x33H) и командой начального адреса вертикальной прокрутки (0x77).

Оказывается, аппаратное обеспечение ST7789 поддерживает функцию, которую я всегда хотел реализовать. Я изучу, как ее реализовать, и приступим!

2. Процесс реализации

1. Подготовка

Необходимо знать драйвер SPI Основные принципы ST7789,Вы можете обратиться к этому моему уроку:STM32CubeMX_17 | Использование аппаратного SPI для управления TFT-LCD (ST7789)

2. Установите область прокрутки

Медвежий пирог на бортуLCDРазмер экрана240240,240 пикселей по горизонтали и вертикали,Но размер видеопамяти микросхемы драйвера ST7789 составляет 320.240,По вертикали 320 рядов пикселей.,По горизонтали 240 рядов пикселей.,Обычно мы используем только переднюю часть видеопамяти.

Для отображения прокрутки сначала необходимо установить область прокрутки. 320 вертикальных рядов пикселей в видеопамяти разделены на три части:

TFA — это верхняя фиксированная область отображения. Эта часть будет отображаться постоянно и не будет прокручиваться после указания. VSA — это область прокрутки. После указания этой части будет отображаться нижняя фиксированная область отображения. , он будет отображаться постоянно и не будет отображаться при прокрутке.

Потому что вся видеопамять По вертикали 320 рядов пикселей.,Очевидно, что 8 бит не могут уместиться в байт.,такВсе настройки значений трех областей TFA, VSA и BFA являются 16-битными, а сумма трех значений должна быть равна 320, иначе определение области прокатки не удастся.

Здесь я настроил прокрутку всего экрана, поэтому значения TFA и BFA установлены на 0, а значение VSA — на 320.

Команда для установки области прокрутки — 0x33, а формат настройки следующий:

Первая команда — 0x33, за ней следуют старшие 8 битов TFA, младшие 8 битов TFA, старшие 8 битов VSA, младшие 8 битов VSA, старшие 8 битов BFA и младшие 8 битов BFA. В соответствии с этим форматом в коде инициализации ЖК-дисплея в конце добавьте код для установки области прокрутки отображения:

Язык кода:javascript
копировать
/** * @brief Vertical Scrolling Definition. * @param tfa top fixed area * @param vsa scroll area * @param bta bottom fixed area * @return errcode * @retval 0 success * @retval -1 fail */
int LCD_Set_Scroll_Area(uint16_t tfa, uint16_t vsa, uint16_t bta)
{ 
   
    uint8_t data;
    
    if (tfa + vsa + bta != 320) { 
   
        return -1;
    }
    
    LCD_Write_Cmd(0x33);
    
    data = tfa >> 8;
    LCD_Write_Data(data);
    data = tfa;
    LCD_Write_Data(data);
    data = vsa >> 8;
    LCD_Write_Data(data);
    data = vsa;
    LCD_Write_Data(data);
    data = bta >> 8;
    LCD_Write_Data(data);
    data = bta;
    LCD_Write_Data(data);
    
    return 0;
}

Затем установите область прокрутки в конце функции инициализации ЖК-дисплея:

Язык кода:javascript
копировать
/* Defign Scroll Area */
LCD_Set_Scroll_Area(0, 240, 80);

3. Установите начальный адрес прокручиваемого дисплея.

Функция установки начального адреса прокрутки дисплея заключается в том, чтобы установить, с какой строки видеопамяти начнет отображаться ЖК-экран.,Пример показан ниже.,На картинке TFA=BFA=0, VSA=320.,Если начальный адрес прокрутки дисплея установлен на 3, содержимое ЖК-экрана будет начинаться с 3-й строки видеопамяти.

Команда для установки начального адреса прокручиваемого дисплея — 0x37. Формат установки следующий:

Первая команда — 0x37, за ней следуют старшие 8 бит VSP и младшие 8 бит VSP. В соответствии с этим форматом добавьте код для установки начального адреса прокручиваемого дисплея в конце кода инициализации ЖК-дисплея:

Язык кода:javascript
копировать
/** * @brief Set Vertical scroll start address of RAM. * @param vsp scroll start address of RAM * @return none */
void LCD_Set_Scroll_Start_Address(uint16_t vsp)
{ 
   
    
    LCD_Write_Cmd(0x37);
    
    LCD_Write_Data(vsp / 256);
    LCD_Write_Data(vsp % 256);
}

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

3. Примеры использования

1. Добавьте отображаемый контент

После того, как основная функция инициализирует ЖК-дисплей, добавьте содержимое ЖК-дисплея:

Язык кода:javascript
копировать
LCD_ShowCharStr(10, 0, "TencentOS tiny 1", BLACK, WHITE, 24);
LCD_ShowCharStr(10, 24, "TencentOS tiny 2", BLACK, YELLOW, 24);
LCD_ShowCharStr(10, 48, "TencentOS tiny 3", BLACK, BRRED, 24);
LCD_ShowCharStr(10, 72, "TencentOS tiny 4", BLACK, PINK, 24);
LCD_ShowCharStr(10, 96, "TencentOS tiny 5", BLACK, RED, 24);
LCD_ShowCharStr(10, 120, "TencentOS tiny 6", BLACK, BROWN, 24);
LCD_ShowCharStr(10, 144, "TencentOS tiny 7", BLACK, GRAY, 24);
LCD_ShowCharStr(10, 168, "TencentOS tiny 8", BLACK, GBLUE, 24);
LCD_ShowCharStr(10, 192, "TencentOS tiny 9", BLACK, GREEN, 24);
LCD_ShowCharStr(10, 216, "TencentOS tiny 11", BLACK, BLUE, 24);

2. Прокрутка дисплея

Выполните цикл while(1), чтобы изменить начальное положение прокрутки:

Язык кода:javascript
копировать
while(1) { 
   
    LCD_Set_Scroll_Start_Address(i);
    if (++i > 240){ 
   
        i = 0;
    }
    HAL_Delay(5);
}

3. Эффект прокрутки

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/126944.html Оригинальная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose