Дисплей TFT 1.8, купив по випадку, в магазині Ворона. Та дисплей, чомусь був закинутий в "довгий ящик". Мабуть спочатку не до кінця розібрався з ініціалізацією...Ба, навіть думав запустити його до сміт'євого бачка, та все ж магазин серйозний..., і в кінці кінців цікавість взяла гору, крім того потрібно дисплей для одного проекта, з підтримкою кирилиці. Девайс, якщо "дригати ніжками" - доволі "повільний", тому працювати наш дисплей буде по SPI. Контролер будемо використовувати STM32F103C8T6, а точніше, отримавшу "популярність" плату Maple Mini:
Підключення. Насамперед вмикаємо SPI1.
Дисплей має піни SDA(SPI1_MOSI) та SCL (SPI1_SCK), це і є наш SPI - інтерфейс. Зворотнього MISO немає..
Пін CS можна не використовувати, та посадити його на "землю". Це має сенс зробити, якщо ми маємо лише один "девайс" на шині SPI . Та ми все ж використаємо його, та зарезервуємо за ним пін.
Пін RЕS - "reset" дисплея.
Пін А0 - при значенні '0' - йде відправка команди, при значенні '1' - відправка даних.
SPI вмикаємо в режимі Transmit Only Master:
Tакож не забудемо ввімкнути Serial Wire у вкладці SYS. Крім того, налаштуємо декілька пінів на вихід (GPIO_Output), та увімкнемо USART1 для майбутнього проекта....
Підключення пінів прописано у файлі TFT_1_8.h , в моєму випадку
#define RES_PORT GPIOA
#define CS_PORT GPIOA
#define A0_PORT GPIOA
#define RES_PIN GPIO_PIN_2
#define CS_PIN GPIO_PIN_3
#define A0_PIN GPIO_PIN_4
Та SPI1 у файлі stm32fxx_hal_mcp.c, нам генерує CubeMX:
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA7 ------> SPI1_MOSI
*/
CubeMX & SPI. Для роботи з дисплеєм , найперше потрібна функція відправки даних на дисплей, звісно використовуючи SPI:
void TFT_write_byte(unsigned char value, unsigned char DC) //0-command 1-data
{
CS_LOW;
if(DC != 0){A0_HIGH;}
else{A0_LOW;}
HAL_SPI_Transmit(&hspi1, &value, 1, 5000);
CS_HIGH ;
}
Ініціалізація. Запускаємо дисплей. Для коректної роботи ця функція мабуть найголовніша. Взагалі спочатку було не зрозуміло з яким саме контролером дисплея ми маємо діло (магазин ніякої інформації не давав), та все ж методом проб та помилок вірне рішення було знайдено. Контролер дисплея виявився ST7735, а вірна ініціалізація у АВР-щиків - http://we.easyelectronics.ru/
Причому після увімкнення дисплея командою display on (0х29) потрібно налаштувати колір (0x2D):
TFT_write_byte(0x29,0); // display on
HAL_Delay(150);
TFT_write_byte(0x2D,0); //Look up table
for(c=0;c<32;c++)
TFT_write_byte(2*c,1); //Red
for(c=0;c<64;c++)
TFT_write_byte(1*c,1); //Green
for(c=0;c<32;c++)
TFT_write_byte(2*c,1); //Blue
TFT_write_byte(0x2c,0);
HAL_Delay(150);
Міняємо орієнтацію дисплея. Для цього використаємо функцію
void TFT_set_rotation(unsigned char rot);
Всі фото зробленні при значенні 0х01. Відповідно значення 0х02, 0х03 та 0х04 міняють орієнтацію дисплея та відповідні зачення ширини та висоти ( w & l ) .
Далі стандартні графічні функціі малювання лінії, прямокутника та кола - TFT_Draw_Line, TFT_Draw_Rectangle, ТFT_Draw_Circle. Тут все доволі звичайно...тому зупинятись не будемо.
Текст та кирилиця. І ось ми підійшли до самого цікавого. Використано шрифт від Arduino-проектів, його фішка в тому ,що на одному шрифтові можна використовувати різний розмір:
Та на жаль шрифт не підтримував кирилицю, І знову на допомогу прийшли "ардуінщики" ,"покрутившись" у них по форумах знайшлись необхідні коди символів кирилиці. Знову таки методом проб і помилок, вдалось добитись слідуючої "картинки", яка відповідає кодуванню UTF-8:
Для номерів з U + 0000 по U + 007F кодування UTF-8 повністю відповідає 7-бітному US-ASCII c 0 в старшому бітові і займає один байт. Вивід кириличного символа прийшлось доробляти, оскільки символ займав 2 байта і на екрані дисплея між символами "висвітлювалось" пусте місце. Прийшлось гасити його програмно
|