stm32F407在触摸屏上显示7X7格子的配置和LL库程序
时间: 2024-03-10 08:45:51 浏览: 20
首先,需要确认您使用的触摸屏是否支持7X7的格子配置,如果支持,那么您可以按照以下步骤进行配置:
1. 配置GPIO口
```c
/* Configure PB12, PB13, PB14 and PB15 as input mode */
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
```
2. 配置ADC
```c
/* Configure the ADC peripheral */
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.ScanConvMode = DISABLE;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.NbrOfDiscConversion = 0;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.NbrOfConversion = 1;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
/* Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */
sConfig.Channel = ADC_CHANNEL_12;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
```
3. 配置触摸屏控制器
```c
/* Configure the Touchscreen controller */
/* Initialize the Touchscreen controller */
if(BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()) == TS_ERROR)
{
Error_Handler();
}
/* Configure the TS interrupt */
HAL_NVIC_SetPriority(TS_INT_EXTI_IRQn, 0x0F, 0);
HAL_NVIC_EnableIRQ(TS_INT_EXTI_IRQn);
```
4. 实现触摸屏中断处理函数
```c
void TS_INT_EXTI_Callback(void)
{
/* Get X and Y position of the touch post calibrated */
BSP_TS_GetState(&TS_State);
x_cal = Touchscreen_Get_Calibrated_X(TS_State.TouchX);
y_cal = Touchscreen_Get_Calibrated_Y(TS_State.TouchY);
/* Set flag */
flag = 1;
}
```
5. 实现计算触摸坐标的函数
```c
static uint16_t Touchscreen_Get_Calibrated_X(uint16_t x)
{
uint32_t ret = 0;
if(x >= TOUCH_AD_LEFT)
{
ret = ((x - TOUCH_AD_LEFT) * BSP_LCD_GetXSize()) / (TOUCH_AD_RIGHT - TOUCH_AD_LEFT);
}
return (uint16_t)ret;
}
static uint16_t Touchscreen_Get_Calibrated_Y(uint16_t y)
{
uint32_t ret = 0;
if(y >= TOUCH_AD_TOP)
{
ret = ((y - TOUCH_AD_TOP) * BSP_LCD_GetYSize()) / (TOUCH_AD_BOTTOM - TOUCH_AD_TOP);
}
return (uint16_t)ret;
}
```
6. 在主函数中实现触摸屏的显示
```c
while (1)
{
/* 检查触摸屏是否按下 */
if (flag == 1)
{
flag = 0;
/* 计算当前按下的格子 */
grid_x = x_cal / grid_w;
grid_y = y_cal / grid_h;
/* 显示当前按下的格子 */
sprintf(str, "Grid(%d,%d)", grid_x, grid_y);
BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)str, CENTER_MODE);
}
}
```
希望以上内容可以帮助您完成7X7格子的触摸屏配置。此外,您需要根据自己的具体情况进行适当的调整和修改。