Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Небольшой ЖК-экран платы разработки Little Bear Pi использует микросхему драйвера ST7789. У меня всегда была идея реализовать прокрутку дисплея на этом экране. Первоначальная идея заключалась в создании большой очереди на стороне MCU. передать содержимое всего экрана управлению очередью, а затем постоянно обновлять весь экран, чтобы добиться прокрутки экрана.
Теоретически такая реализация является относительно ресурсоемкой, потребляя ресурсы ЦП для работы периферийных устройств SPI и ресурсы памяти для хранения данных дисплея, поэтому она никогда не применялась.
Сегодня, когда я просматривал руководство по данным ST7789 и писал статью, я случайно обнаружил руководство ST7789:
Хм? Прокрутить? прокрутить? Откройте для себя новый континент!
Согласно главе 8.14 руководства, вращательная прокрутка — это только режим вертикальной прокрутки, который определяется командой определения области вертикальной прокрутки (0x33H) и командой начального адреса вертикальной прокрутки (0x77).
Оказывается, аппаратное обеспечение ST7789 поддерживает функцию, которую я всегда хотел реализовать. Я изучу, как ее реализовать, и приступим!
Необходимо знать драйвер SPI Основные принципы ST7789,Вы можете обратиться к этому моему уроку:STM32CubeMX_17 | Использование аппаратного SPI для управления TFT-LCD (ST7789)。
Медвежий пирог на борту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. В соответствии с этим форматом в коде инициализации ЖК-дисплея в конце добавьте код для установки области прокрутки отображения:
/** * @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;
}
Затем установите область прокрутки в конце функции инициализации ЖК-дисплея:
/* Defign Scroll Area */
LCD_Set_Scroll_Area(0, 240, 80);
Функция установки начального адреса прокрутки дисплея заключается в том, чтобы установить, с какой строки видеопамяти начнет отображаться ЖК-экран.,Пример показан ниже.,На картинке TFA=BFA=0, VSA=320.,Если начальный адрес прокрутки дисплея установлен на 3, содержимое ЖК-экрана будет начинаться с 3-й строки видеопамяти.。
Команда для установки начального адреса прокручиваемого дисплея — 0x37. Формат установки следующий:
Первая команда — 0x37, за ней следуют старшие 8 бит VSP и младшие 8 бит VSP. В соответствии с этим форматом добавьте код для установки начального адреса прокручиваемого дисплея в конце кода инициализации ЖК-дисплея:
/** * @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);
}
После однократной установки этой функции достигается статическая прокрутка. Эффект от видеокарт,Но оно не двигалось,Таким образом, мы можем продолжать звонить, чтобы добиться желаемого эффекта.。
После того, как основная функция инициализирует ЖК-дисплей, добавьте содержимое ЖК-дисплея:
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);
Выполните цикл while(1), чтобы изменить начальное положение прокрутки:
while(1) {
LCD_Set_Scroll_Start_Address(i);
if (++i > 240){
i = 0;
}
HAL_Delay(5);
}
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/126944.html Оригинальная ссылка: https://javaforall.cn