Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
29.01.2021
Размер:
17.94 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА 43

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

Кочин К.А

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ

Использование резистивной сенсорной панели для определения положения пера

по дисциплине: Системы сбора и предварительной обработки данных

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

Голубцов М

номер группы

подпись, дата

инициалы, фамилия

Студенческий билет №

Санкт-Петербург 2020

Цель работы:

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

Задание:

Реализовать драйвер определяющий текущее место касания сенсорного экрана и логику обработки нажатий

Листинг:

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

void test_init(void);

int my_delay(void*, int);

int my_reset(void*);

int i80_write_reg(void *, uint16_t, uint16_t);

int i80_read_reg(void*, uint16_t, uint16_t*);

int i80_write_words(void*, uint16_t, uint16_t*, size_t);

void callback_init(lcd_ili93xx_driver_t *lcd_driver);

bool read_is_touched(lcd_ili93xx_driver_t *, uint16_t, uint16_t);

uint16_t touch_read_write_value(SPI_HandleTypeDef*, uint8_t);

uint16_t threshold(SPI_HandleTypeDef*);

void read_point_pos(struct Point*, SPI_HandleTypeDef*);

uint16_t scale_x(uint16_t);

uint16_t scale_y(uint16_t);

/* USER CODE BEGIN PFP */

uint16_t touch_read_write_value(SPI_HandleTypeDef* hspi, uint8_t cmd)

{

uint8_t in_buf[3] = { cmd, 0x00, 0x00 };

uint8_t out_buf[3] = { 0x00, 0x00, 0x00 };

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

int err = HAL_SPI_TransmitReceive(hspi, in_buf, out_buf, 3, HAL_MAX_DELAY);

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

if (err != HAL_OK) {

}

return out_buf[1] << 5 | out_buf[2] >> 3;

}

uint16_t threshold(SPI_HandleTypeDef* hspi)

{

return abs(touch_read_write_value(hspi, OPEN32F3_TOUCH_CMD_MEASURE_Z1) - touch_read_write_value(hspi, OPEN32F3_TOUCH_CMD_MEASURE_Z2));

}

void read_point_pos(struct Point* p, SPI_HandleTypeDef* hspi)

{

uint16_t x = 0;

uint16_t y = 0;

uint8_t num = 5;

for (uint8_t i = 0; i < num; i++)

{

x += touch_read_write_value(hspi, OPEN32F3_TOUCH_CMD_MEASURE_X);

y += touch_read_write_value(hspi, OPEN32F3_TOUCH_CMD_MEASURE_Y);

}

p->x = scale_x(x/num);

p->y = scale_y(y/num);

}

uint16_t scale_x(uint16_t x_value)

{

return (uint16_t) x_value * 239.f / 4095.f * 1.15f - 16;

}

uint16_t scale_y(uint16_t y_value)

{

return (uint16_t) y_value * 319.f / 4095.f * 1.15f - 20;

}

bool read_is_touched(lcd_ili93xx_driver_t *lcd, uint16_t x, uint16_t y)

{

if (threshold(&hspi1) <= IS_TOUCHED)

{

read_point_pos(&point, &hspi1);

lcd_ili93xx_fill_rect_color(lcd, point.x, point.y, point.x+10, point.y+5, LCD_ILI93XX_COLOR_LIME);

HAL_Delay(10);

lcd_ili93xx_fill_rect_color(lcd, point.x, point.y, point.x+10, point.y+5, LCD_ILI93XX_COLOR_BLUE);

return true;

}

else

{

lcd_ili93xx_fill_rect_color(lcd, 0, 0, 240, 320, LCD_ILI93XX_COLOR_BLUE);

return false;

}

}

Результат выполнения:

Реализованная программа позволяет определять положение пера

Вывод:

В ходе выполнения изучен принцип работы четырехпроводных резистивных сенсорных панелей и протокол SPI интерфейса для взаимодействия с контроллером панели. Реализована программа обработки данных сенсорной панели для определения места касания.

Соседние файлы в папке СС и ПОД