q-dex q-dex

Программируем TFT дисплей

В современном мире информационных технологий все больший интерес вызывают микроконтроллеры. Этому способствовало как снижение цены, так и повышение доступности информации по таким устройствам. Однако данная область разработок несет в себе много трудностей. Прежде всего, начинающий разработчик столкнется со сложностями отображения информации.

В данной статье хотелось бы поведать вам, уважаемый читатель, об использовании дисплея TFT SPI 128x160 на базе графического чипа ST7735R. Подключать мы его будем к макетной плате на базе микроконтроллера (МК) STM32F407VET6 через SPI. Данную модель МК мы выбрали не случайно. По соотношениям цена/качество он значительно превосходит оппонентов. Предел по тактовой частоте составляет 160 МГц, при стоимости около 500 рублей. Для подключения использовали девятипиновый шлейф (ЖЖ).

На рисунке 2 изображены пины устройства. Как можем видеть, здесь также расположен дополнительный слот для SD-карты. В данной статье его мы использовать не будем. Их можно распределить по трем основным группам: для работы с подсветкой экрана, для работы с самим экраном и для работы с SD-картой.

Группа Пин Описание
Подсветка VCC Плюс питания 3.3в/5в
GND Минус питания
Дисплей SCL Синхросигнал
SDA Линия данных
RS/DC Выбор режима: команда/данные
RES Перезапуск контроллера
CS Активация контроллера
SD-карта MISO Ведущий ввод, ведомый вывод (SPI)
SCLK Синхронизация (SPI)
MOSI Ведущий вывод, ведомый ввод (SPI)
CS (SD) Активация чипа SD-карты

На рисунке 3 изображено подключение, используемое нами. Здесь два пина от подсветки подключены к 3.3 вольтам, а основное питание к 5 вольтам. Оставшиеся 5 пинов используем для подключение SPI к какому либо свободному порту, в нашем случае порт А. Надо запомнить и записать в начале программного кода соответствующие пины. Их названия могут варьироваться, но суть неизменна.

Таким образом, мы можем пользоваться данными значениями при подключении пинов к портам или же изменить их на более удобные. Рассмотрим более детально процедуру инициализации экрана. Для этого нам понадобится определить 3 вспомогательные процедуры: ClearBit, SetBit, Write_Byte. Первые две как следует из названий, выставляют и обнуляют соответствующий бит на порте (который мы подключили к экрану). Третья процедура передает один байт данных. По сути эти процедуры реализуют программный SPI.

  1. procedure CBx ( A : integer ) ; //0
  2. begin
  3. GPIOA_ODR : = GPIOA_ODR and not ( 1 shl A ) ;
  4. end ;
  5. procedure SBx ( A : integer ) ; //1
  6. begin
  7. GPIOA_ODR : = GPIOA_ODR or ( 1 shl A ) ;
  8. end ;
  9. procedure Write_Byte ( c , com : byte ) ;
  10. var i : byte ;
  11. begin
  12. CBx ( CS ) ;
  13. if ( com = 0 ) then
  14. CBx ( RS2 )
  15. else
  16. SBx ( RS2 ) ;
  17. SBx ( SCK ) ;
  18. for i : = 0 to 7 do
  19. begin
  20. if ( ( c shr ( 7 - i ) and 1 ) = 1 ) then
  21. SBx ( MOSI )
  22. else
  23. CBx ( MOSI ) ;
  24. CBx ( SCK ) ;
  25. SBx ( SCK ) ;
  26. end ;
  27. SBx ( CS ) ;
  28. end ;
  29. procedure ResetTFT ;
  30. begin
  31. CBx ( RST ) ;
  32. delay_ms ( 5 ) ;
  33. SBx ( RST ) ;
  34. delay_ms ( 5 ) ;
  35. end ;
  36. procedure TFTinitx ;
  37. var i : byte ;
  38. begin
  39. Write_Byte ( 0x01 , 0 ) ;
  40. // сбрасываем состояние экрана и переключаем его в режим сна
  41. delay_ms ( 200 ) ;
  42. // ждем 200 мс для инициализации регистров
  43. Write_Byte ( 0x11 , 0 ) ;
  44. // переходим в сон
  45. delay_ms ( 200 ) ;
  46. // ждем 200 мс для инициализации драйверов
  47. Write_Byte ( 0x29 , 0 ) ;
  48. // включаем дисплей !
  49. Write_Byte ( 0x3A , 0 ) ;
  50. Write_Byte ( 0x05 , 1 ) ;
  51. Write_Byte ( 0x2D , 0 ) ; // проход с поиском
  52. for i : = 0 to 31 do
  53. Write_Byte ( 2 * i , 1 ) ; // RED
  54. for i : = 0 to 63 do
  55. Write_Byte ( i , 1 ) ; // GREEN
  56. for i : = 0 to 31 do
  57. Write_Byte ( 2 * i , 1 ) ; // BLUE
  58. end ;

Цвет будет храниться в 2х байтовом формате (5 бит на красный, 6 бит на зеленый, 5 бит на синий). Для перевода из 3х байтовых значений будем использовать следующую процедуру:

И, наконец, определим процедуры для вывода примитивов на экран:

  1. procedure OutColor ( color : word ) ; // выводит цвет
  2. begin
  3. write_byte ( Hi ( col ) , 1 ) ;
  4. write_byte ( lo ( col ) , 1 ) ;
  5. end ;
  6. procedure Area ( x0 , y0 , x1 , y1 : byte ) ; // задает область рисования
  7. begin
  8. write_byte ( 0x2a , 0 ) ;
  9. write_byte ( 0 , 1 ) ;
  10. write_byte ( x0 , 1 ) ;
  11. write_byte ( 0 , 1 ) ;
  12. write_byte ( x1 , 1 ) ;
  13. write_byte ( 0x2b , 0 ) ;
  14. write_byte ( 0 , 1 ) ;
  15. write_byte ( y0 , 1 ) ;
  16. write_byte ( 0 , 1 ) ;
  17. write_byte ( y1 , 1 ) ;
  18. end ;
  19. procedure DrawPixel ( x0 , y0 : byte ; color : word ) ; //пиксель
  20. begin
  21. Area ( 127 - x0 , 159 - y0 , 127 - x0 , 159 - y0 ) ;
  22. write_byte ( 0x2c , 0 ) ;
  23. OutColor ( color ) ;
  24. end ;
  25. procedure DrawLine ( x0 , y0 , x1 , y1 : byte ; color : word ) ; //линия
  26. var signX , signY , deltaX , deltaY , error , error2 : integer ;
  27. begin
  28. if ( x0 < x1 ) then
  29. signX : = 1
  30. else
  31. signX : = - 1 ;
  32. if ( y0 < y1 ) then
  33. signY : = 1
  34. else
  35. signY : = - 1 ;
  36. deltaX : = abs ( x1 - x0 ) ;
  37. deltaY : = abs ( y1 - y0 ) ;
  38. error : = abs ( deltaX - deltaY ) ;
  39. DrawPixel ( x1 , y1 , color ) ;
  40. while ( ( x0 < > x1 ) or ( y0 < > y1 ) ) do
  41. begin
  42. DrawPixel ( x0 , y0 , color ) ;
  43. error2 : = error * 2 ;
  44. if ( error2 > ( - deltaY ) ) then
  45. begin
  46. error : = error - deltaY ;
  47. x0 : = x0 + signX ;
  48. end ;
  49. if ( error2 < deltaX ) then
  50. begin
  51. error : = error + deltaX ;
  52. y0 : = y0 + signY ;
  53. end ;
  54. end ;
  55. end ;
  56. Procedure Bar ( x1 , y1 , x2 , y2 , col : Word ) ; //прямоугольник
  57. var K , A , B , i : LongInt ;
  58. WrOn , WrOff : Word ;
  59. begin
  60. Area ( 127 - x0 , 159 - y0 , 127 - x0 , 159 - y0 ) ;
  61. write_byte ( 0x2c , 0 ) ;
  62. A : = ( 1 + x2 - x1 ) ;
  63. B : = ( 1 + y2 - y1 ) ;
  64. K : = A * B ;
  65. for i : = 0 to K - 1 do
  66. OutColor ( col ) ;
  67. end ;

Все описанные выше процедуры мы объединили в модуль с названием graphx.mpas. Пример использования в программе:


206

Регистрационная форма

логин
фамилия
имя
отчество
e-mail
пароль
еще раз
пол

Сколько углов у фигуры?

Q-DEX, авторы: Кураев С.В. Саруханян С.К. © 2016г.-2019г.