想在将来实现触摸板类似点击按钮的操作。根据原子的示例,修改了些代码,并实现。
首先,定义三个状态的标志位。
[mw_shl_code=c,true]#define TOUCH_STATE_DOWN 0x80 // 按下
#define TOUCH_STATE_HOLD 0x40 // 按住
#define TOUCH_STATE_UP 0x20 // 抬起[/mw_shl_code]
然后,重新定义了 TouchDevice,由于是电阻屏,所以简化了下
[mw_shl_code=c,true]//触摸屏控制器
typedef struct
{
u16 CurrentX; // 当前坐标
u16 CurrentY;
u16 DownX; // 第一次按下时的坐标
u16 DownY;
u8 State; // 笔的状态
// b7:是否首次按下
// b6:是否保持按住
// b5:抬起
} TouchDeviceTypeDef;
TouchDeviceTypeDef gTouchDevice;[/mw_shl_code]
之后,重新定义了 TOUCH_Scan
[mw_shl_code=c,true]
#define TOUCH_COORD_SCREEN 0 // 屏幕坐标
#define TOUCH_COORD_PHYSICAL 1 // 物理坐标
void TOUCH_Scan(u8 aType)
{
if(PEN == 0) // 如果按住触屏
{
bool lOk = TOUCH_ReadXY2(&gTouchDevice.CurrentX, &gTouchDevice.CurrentY); // 读取物理坐标
if(aType == TOUCH_COORD_SCREEN && lOk == TRUE) // 如果希望读取的是屏幕坐标,则进行转换
{
// 将结果转换为屏幕坐标
gTouchDevice.CurrentX = gEnvironment.TouchFactorX * gTouchDevice.CurrentX + gEnvironment.TouchOffsetX;
gTouchDevice.CurrentY = gEnvironment.TouchFactorY * gTouchDevice.CurrentY + gEnvironment.TouchOffsetY;
}
// 如果还未按下过
if((gTouchDevice.State & TOUCH_STATE_DOWN) == 0)
{
// 清除可能的抬起状态(刚抬起瞬间,再按下),并标记为按下
gTouchDevice.State &= ~TOUCH_STATE_UP;
gTouchDevice.State |= TOUCH_STATE_DOWN;
// 同时在首次按下时,记录按下的坐标到 x[4] 和 y[4]。
gTouchDevice.DownX = gTouchDevice.CurrentX;
gTouchDevice.DownY = gTouchDevice.CurrentY;
}
else // 上次扫描时,已经按下过了
{
// 在按下基础上,标记为按住
gTouchDevice.State |= TOUCH_STATE_HOLD;
}
}
else // 如果没有按住触屏
{
// 如果上次扫描是按下或按住状态
if((gTouchDevice.State & (TOUCH_STATE_DOWN | TOUCH_STATE_HOLD)) != 0)
{
// 清除按下或按住标记,并标记为抬起
gTouchDevice.State &= ~(TOUCH_STATE_DOWN | TOUCH_STATE_HOLD);
gTouchDevice.State |= TOUCH_STATE_UP;
}
else if((gTouchDevice.State & TOUCH_STATE_UP) != 0) // 如果上次是抬起状态
{
// 本次已为空闲状态,清空所有已扫描信息
gTouchDevice.State &= ~TOUCH_STATE_UP;
gTouchDevice.CurrentX = 0;
gTouchDevice.CurrentY = 0;
gTouchDevice.DownX = 0xffff;
gTouchDevice.DownY = 0xffff;
}
}
}
[/mw_shl_code]
最后,采用 TIM3 100ms 扫描一次按键(TIM3初始化很简单,就不贴了),将状态调试输出。当然,以后就可以改成想要调用的代码了。
[mw_shl_code=c,true]void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TOUCH_Scan(TOUCH_COORD_SCREEN);
if((gTouchDevice.State & TOUCH_STATE_DOWN) != 0 && (gTouchDevice.State & TOUCH_STATE_HOLD) == 0) // 第一次按下
{
oDebug("按下  %3d, %3d)\r\n", gTouchDevice.CurrentX, gTouchDevice.CurrentY);
}
else if((gTouchDevice.State & TOUCH_STATE_DOWN) != 0 && (gTouchDevice.State & TOUCH_STATE_HOLD) != 0) // 按住
{
oDebug("按住  %3d, %3d)\r\n", gTouchDevice.CurrentX, gTouchDevice.CurrentY);
}
else if((gTouchDevice.State & TOUCH_STATE_UP) != 0)
{
oDebug("抬起  %3d, %3d)\r\n", gTouchDevice.CurrentX, gTouchDevice.CurrentY);
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
[/mw_shl_code]
|