Функции работы с Touch Panel в mikroC. Пример использования.

  • Печать

В предыдущей статье были рассмотрены функции работы с сенсорной панелью, реализованные в компиляторах языка C, предлагаемого Mikroelektronika. Ниже будет рассмотрен пример использования данных функций.

Текст программы на языке С для компилятора mikroC приведен в конце статьи. При старте процессора, программа настраивает оборудование и запускает калибровку сенсорной панели. Значения калибровочных констант отображаются на экране. В рабочем режиме, на дисплее выводятся координаты точки нажатия. Некоторые замечания по работе с сенсорной панелью приведены ниже. 

Настройка оборудования.

Настройка оборудования призвана показать компилятору, куда подключены линии, используемые для сенсорной панели. Пример предназначен для платы mikromedia Board for STM32M3, поэтому использованы соответствующие настройки. Для других плат, процессоров и экранов они должны быть изменены. 

Калибровка

Одной из самых сложных задач при настройке Touch Panel становится калибровка. Ее задачей является совмещение выходных сигналов сенсорной панели и координат дисплея. При калибровке применяются вызовы функций TP_TFT_Calibrate_Min() и TP_TFT_Calibrate_Max(). Особенностью функций является необходимость нажатия в соответствующий угол панели, после вызова каждой из них. В приведенном примере, для процедуры калибровки использован код функции Calibrate, разработанной производителем.

Некоторым неудобством использования функции калибровки становится  необходимость ее проведения каждый раз, при старте программы. В противном случае, сенсорная панель не будет возвращать требуемые координаты. В приложениях, где вызов калибровки панели не соответствует задачам, можно применять программное задание констант. Для этого, после проведения калибровки, с помощью функции TP_TFT_Get_Calibration_Consts необходимо определить значения АЦП в левом верхнем и правом нижнем углу дисплея. Данные значения индивидуальны для каждого устройства и должны быть сохранены программно. Далее, при каждом старте программы можно использовать полученные данные с помощью TP_TFT_Set_Calibration_Consts. Это избавит от необходимости запуска калибровки. Необходимо только учесть возможный дрейф параметров, и периодически повторно получать калибровочные константы. 

Пример программы работы с TouchPanel

// Объявление линий TFT

unsigned int TFT_DataPort at GPIOE_ODR;

sbit TFT_RST at GPIOE_ODR.B8;

sbit TFT_RS at GPIOE_ODR.B12;

sbit TFT_CS at GPIOE_ODR.B15;

sbit TFT_RD at GPIOE_ODR.B10;

sbit TFT_WR at GPIOE_ODR.B11;

sbit TFT_BLED at GPIOE_ODR.B9;

// Объявление линий Touch Panel

sbit DriveX_Left at GPIOB_ODR.B1;

sbit DriveX_Right at GPIOB_ODR.B8;

sbit DriveY_Up at GPIOB_ODR.B9;

sbit DriveY_Down at GPIOB_ODR.B0;

// Параметры Touch Panel

unsigned int x_coord, y_coord; // Координаты нажатия

const ADC_THRESHOLD = 750;   // Разрешение АЦП

 

/* Инициализация TFT и Touch Panel */

void TFT_Init_Prog(){

  // Инициализация TFT

  GPIO_Config(&GPIOE_BASE, _GPIO_PINMASK_9, _GPIO_CFG_DIGITAL_OUTPUT);

  TFT_BLED = 1;       // Включение подсветки

  TFT_Set_Default_Mode();   //Режим TFT по умолчанию

  TP_TFT_Set_Default_Mode(); //Touch Panel по умолчанию

  ADC_Set_Input_Channel(_ADC_CHANNEL_8 | _ADC_CHANNEL_9); //Настройка  линий Touch Panel

  ADC1_Init();  //Запуск АЦП

  Delay_ms(100); // Задержка 100 мсек

  TFT_Init(320, 240);   //Инициализация TFT

  TP_TFT_Init(320, 240, 8, 9);                 // Инициализация Touch panel

  TP_TFT_Set_ADC_Threshold(ADC_THRESHOLD);     // Установка разрешения АЦП

}

 

/* Калибровка TP */

void Calibrate() {

  TFT_Set_Pen(CL_WHITE, 3);

  TFT_Set_Font(TFT_defaultFont, CL_WHITE, FO_HORIZONTAL);

  TFT_Write_Text("Touch selected corners for calibration", 50, 80);

  TFT_Line(315, 239, 319, 239);

  TFT_Line(309, 229, 319, 239);

  TFT_Line(319, 234, 319, 239);

  TFT_Write_Text("first here",235,220);

 

  TP_TFT_Calibrate_Min();                      // Calibration of bottom left corner

  Delay_ms(500);

  TFT_Write_Text("Min Ok",100,20);

  TFT_Set_Pen(CL_BLACK, 3);

  TFT_Set_Font(TFT_defaultFont, CL_BLACK, FO_HORIZONTAL);

  TFT_Line(315, 239, 319, 239);

  TFT_Line(309, 229, 319, 239);

  TFT_Line(319, 234, 319, 239);

  TFT_Write_Text("first here",235,220);

 

  TFT_Set_Pen(CL_WHITE, 3);

  TFT_Set_Font(TFT_defaultFont, CL_WHITE, FO_HORIZONTAL);

  TFT_Write_Text("now here ", 20, 5);

  TFT_Line(0, 0, 5, 0);

  TFT_Line(0, 0, 0, 5);

  TFT_Line(0, 0, 10, 10);

  TP_TFT_Calibrate_Max();                      // Calibration of bottom left corner

  Delay_ms(500);

}

 

/***** Main  *****/

void main() {

  unsigned int x_min, x_max, y_min, y_max;

  char txt_message[6];

  TFT_Init_Prog();       // Вызов процедуры инициализации TFT и

  Delay_ms(100);

  TFT_Fill_Screen(0);    // Черный экран

  Calibrate();           // Calibrate TFT

  TFT_Fill_Screen(0);    // Черный экран

  TFT_Set_Pen(CL_White, 1);   //Настройка карандаша

  TFT_Set_Font(TFT_defaultFont, CL_White, FO_VERTICAL); // Настройка шрифта

  TFT_Write_Text("Touch Panel DEMO", 10, 160);

  TP_TFT_Get_Calibration_Consts(&x_min, &y_min, &x_max, &y_max); // Получение калибровочных констант

  // Вывод калибровочных констант

  WordToStr(x_min, txt_message);

  TFT_Write_Text("x_min:", 30, 230);

  TFT_Write_Text(txt_message, 30, 180);

  WordToStr(y_min, txt_message);

  TFT_Write_Text("y_min:", 40, 230);

  TFT_Write_Text(txt_message, 40, 180);

  WordToStr(x_max, txt_message);

  TFT_Write_Text("x_max:", 50, 230);

  TFT_Write_Text(txt_message, 50, 180);

  WordToStr(y_max, txt_message);

  TFT_Write_Text("y_max:", 60, 230);

  TFT_Write_Text(txt_message, 60, 180);

  TFT_Set_Brush(1, 0, 0, LEFT_TO_RIGHT,0,0);        //Настройка кисти

  // Бесконеный цикл

  while (1) {

  if (TP_TFT_Press_Detect()) {       //Определение события нажатия на экран

    if (TP_TFT_Get_Coordinates(&x_coord, &y_coord) == 0) {  //Получение координат

      TFT_Set_Pen(0, 1);   //Настройка карандаша

      TFT_Rectangle(100, 60, 135, 185);                          //Стирание старых значений

      // Вывод новых координат

      TFT_Set_Pen(CL_White, 1);   //Настройка карандаша

      WordToStr(x_coord, txt_message);

      TFT_Write_Text("x_pressed:", 100, 180);

      TFT_Write_Text(txt_message, 100, 100);

      WordToStr(y_coord, txt_message);

      TFT_Write_Text("y_pressed:", 115, 180);

      TFT_Write_Text(txt_message, 115, 100);

      Delay_ms(250); //Задержка

    }

  }

 }

}

Еще по теме:

Первый проект для mikromedia board for STM32