STM32 触摸屏初始化函数解析 - TP_Init() 功能详解
该函数是用来初始化触摸屏的,根据 LCD 的 ID 判断是电容触摸屏还是电阻触摸屏。
如果是电容触摸屏,则调用 'OTT2001A_Init()' 函数进行初始化,并将扫描函数指向 'CTP_Scan()' 函数;如果是电阻触摸屏,则配置 GPIO 的输入输出模式以及上拉电阻,然后进行触摸屏的校准,如果已经校准过则直接返回,否则进行屏幕校准并保存校准参数。最后返回一个标志位,表示触摸屏是否进行过校准。
代码解析:
//触摸屏初始化
//返回值:0,没有进行校准
// 1,进行过校准
u8 TP_Init(void)
{
if(lcddev.id==0X5510) //电容触摸屏
{
OTT2001A_Init();
tp_dev.scan=CTP_Scan; //扫描函数指向电容触摸屏扫描
tp_dev.touchtype|=0X80; //电容屏
tp_dev.touchtype|=lcddev.dir&0X01;//横屏还是竖屏
return 0;
}else
{
//注意,时钟使能之后,对 GPIO 的操作才有效
//所以上拉之前,必须使能时钟.才能实现真正的上拉输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//使能相关时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_0|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
TP_Read_XY(&tp_dev.x[0],&tp_dev.y[0]);//第一次读取初始化
AT24CXX_Init();//初始化 24CXX
if(TP_Get_Adjdata())return 0;//已经校准
else //未校准?
{
LCD_Clear(WHITE);//清屏
TP_Adjust(); //屏幕校准
TP_Save_Adjdata();
}
TP_Get_Adjdata();
}
return 1;
}
代码功能:
- 判断触摸屏类型: 根据 LCD 的 ID
lcddev.id判断是电容触摸屏还是电阻触摸屏。 - 电容触摸屏初始化: 如果
lcddev.id == 0X5510,则调用OTT2001A_Init()函数进行电容触摸屏的初始化,并设置扫描函数为CTP_Scan()。 - 电阻触摸屏初始化: 否则,进行电阻触摸屏的初始化:
- 使能 GPIO 时钟
- 配置 GPIO 的输入输出模式
- 初始化 24CXX
- 读取一次触摸屏坐标
- 触摸屏校准:
- 判断是否已经校准过:
- 如果已经校准,则直接返回
0。 - 如果没有校准,则进行屏幕校准并保存校准参数。
- 如果已经校准,则直接返回
- 判断是否已经校准过:
- 返回标志位: 函数最后返回
1表示触摸屏已经校准过,返回0表示没有进行校准。
原文地址: https://www.cveoy.top/t/topic/mF0b 著作权归作者所有。请勿转载和采集!