2 курс. 1 семестр / СС и ПОД / лаб6
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА 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 интерфейса для взаимодействия с контроллером панели. Реализована программа обработки данных сенсорной панели для определения места касания.