⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 touch.c

📁 采集触摸屏触摸信息
💻 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 + -