📄 touch.c
字号:
/*********************************************************************************************************
** 触摸屏驱动处理程序
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: touch.c
**创 建 人:郭伟雄
**最后修改日期: 2004年11月04日
**描 述: 触摸处理程序,采用ADS7846芯片,适合4线制触摸屏。
//1。实现模拟SPI口
2。通过标准SPI协议,当触摸屏被按下时(即有触摸事件发生)则ADS7846向CPU发中断请求,
CPU接到请求后,应延时一下再响应其请求,目的是为了消除抖动使得采样更准确。
如果一次采样不准确。
3。MCU收到数据后,封装成触摸数据包,放到发送消息队列
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
extern uint8 OS_Q_MEM_SEL SerialOutDataQ[60];
//BOOLEAN TouchDataBool=0;//默认无数据
union TouchData TouchDataX;
union TouchData TouchDataY;
uint16 TouchDataX1;
uint16 TouchDataY1;
#define refvoltage (25/10)
#define TouchScreenWidth 0x1A4 //420
#define TouchScreenHigth 0xF0 // 240
#define TouchContent 0x1000 //4096
//extern uint8 data state;
/*********************************************************************************************************
** 函数名称: void TouchInt() interrupt 0
** 功能描述: 外部中断0 用来接受触摸屏发来的数据
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#pragma disable
void TouchInt() interrupt 0
{
uint16 X=0,Y=0;
uint8 temp=0xff;
EX0=0;
while(temp--); //中断后延时以消除抖动,使得采样数据更准确
touch_spi_start(); //启动SPI
temp++;
temp--; //延时
SpiWriteByte7846(0x90); //送控制字 1001000
temp++;
temp--; //延时
DCLK=1; _nop_();_nop_();_nop_();_nop_();
DCLK=0; _nop_();_nop_();_nop_();_nop_();
X=SpiReadFrom7846();
TouchDataX1=X;
//TouchDataX.value=SpiReadFrom7846();
TouchDataX.value=((float)X/TouchContent)*TouchScreenWidth;
SpiWriteByte7846(0xD0); //送控制字 1101000
DCLK=1; _nop_();_nop_();_nop_();_nop_();
DCLK=0; _nop_();_nop_();_nop_();_nop_();
Y=SpiReadFrom7846();
TouchDataY1=Y;
//TouchDataY.value=SpiReadFrom7846();
TouchDataY.value=((float)(TouchContent-Y)/TouchContent)*TouchScreenHigth;
TOUCH_CS=1;
Set_TouchStateFlag();
//IE0=0;//INT0中断请求标志位
return;
}
/*********************************************************************************************************
** 函数名称: void TouchDealTask(void)
** 功能描述: 触摸数据处理任务
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TouchDealTask(void)
{
uint8 temp,temp1,checksum=0;
while(1)
{
#if DebubTouch
printMsg("enter touch task");
#endif
if(OSSemPend(TouchSem,0)==OS_SEM_OK) //等待触摸信号量
{ checksum=0;
OSQPost(SerialOutDataQ,StartByte1);
OSQPost(SerialOutDataQ,StartByte2);
checksum+=StartByte2;
OSQPost(SerialOutDataQ,0x04);
checksum+=0x04;
OSQPost(SerialOutDataQ,OEMID_TOUCH);
checksum+=OEMID_TOUCH;
// temp=*(TouchDataX+1);
// temp=(uint8)TouchDataX;
temp=TouchDataX.TouchValueByte[0]; //低字节
temp1=~(((temp&0xF0)<<0x04)|(temp&0x0F));
checksum+=temp1;
#if DebubTouch
printData("orign TouchX=%d",TouchDataX1);
printData("TouchX=%d",TouchDataX.value);
printData("Touchdata x low=%d",temp1);
printData("TouchData x low unchanged=%d",temp);
#endif
OSQPost(SerialOutDataQ,temp1);//取触摸x坐标数据高字节并放入
//消息队列
// temp=*TouchDataX;
// TouchDataX>>=8;
temp=TouchDataX.TouchValueByte[1];
temp1=~(((temp&0xF0)<<0x04)|(temp&0x0F));
checksum+=temp1;
#if DebubTouch
printData("Touchdata x high=%d",temp1);
printData("TouchData x high unchanged=%d",temp);
#endif
OSQPost(SerialOutDataQ,temp1);//取触摸x坐标数据高字节并 //放入消息队列
//temp=*(TouchDataY+1);
temp=TouchDataY.TouchValueByte[0];
temp1=~(((temp&0xF0)<<0x04)|(temp&0x0F));
checksum+=temp1;
#if DebubTouch
printData("orign Touchy=%d",TouchDataY1);
printData("TouchDataY =%d",TouchDataY.value);
printData("Touchdata y low=%d",temp1);
printData("TouchDatay low unchanged=%d",temp);
#endif
OSQPost(SerialOutDataQ,temp1);//取触摸y坐标数据高字节并
//放入消息队列
// temp=*TouchDataY;
// TouchDataY>>=8;
temp=TouchDataY.TouchValueByte[1];
temp1=~(((temp&0xF0)<<0x04)|(temp&0x0F));
checksum+=temp1;
#if DebubTouch
printData("Touchdata y high=%d",temp1);
printData("Touchdata y high unchanged=%d",temp);
#endif
OSQPost(SerialOutDataQ,temp1); //取触摸y坐标数据高字节并
//放入消息队列
checksum=~checksum;
OSQPost(SerialOutDataQ,checksum); //校验码
OSQPost(SerialOutDataQ,EndByte1);
OSQPost(SerialOutDataQ,EndByte2);
// OSSemPost(SerialOutSem); //封装完后通知串口发送队列,使其进入就绪状态
}
while(TouchStateFlag) //必须使串口发送任务优先于触摸任务 ,这样才会使上面构造的数据
//马上被发送出去
{ //触摸屏被按下状态,松开则退出
if(Int0State) //检测int0引脚电平,
{ //触摸屏已松开
#if DebubTouch
printMsg("touch open");
#endif
Clr_TouchStateFlag();
//构造触摸松开数据包,放入发送消息队列
checksum=0;
OSQPost(SerialOutDataQ,StartByte1);
OSQPost(SerialOutDataQ,StartByte2);
checksum+=StartByte2;
OSQPost(SerialOutDataQ,0x0);
OSQPost(SerialOutDataQ,OEMID_TOUCH_OPEN);
checksum+=OEMID_TOUCH_OPEN;
checksum=~checksum;
OSQPost(SerialOutDataQ,checksum); //校验码
OSQPost(SerialOutDataQ,EndByte1);
OSQPost(SerialOutDataQ,EndByte2);
OSSemPost(SerialOutSem); //封装完后通知
EX0=1;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -