轻松搞定TSC2046触摸驱动

  • TSC2046简介

        TSC2046是一款电阻触摸屏,电阻触摸屏的工作原理主要是通过压力感应原理来实现对屏幕内容的操作和控制的,这种触摸屏屏体部分是一块与显示器表面非常配合的多层复合薄膜,其中第一层为玻璃或有机玻璃底层,第二层为隔层,第三层为多元树脂表层,表面还涂有一层透明的导电层,上面再盖有一层外表面经硬化处理、光滑防刮的塑料层。在多元脂表层表面的传导层及玻璃层感应器是被许多微小的隔层所分隔电流通过表层,轻触表层压下时,接触到底层,控制器同时从四个角读出相称的电流及计算手指位置的距离。这种触摸屏利用两层高透明的导电层组成触摸屏,两层之间距离仅为2.5微米。当手指触摸屏幕时,平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层接通Y轴方向的5V均匀电压场,使得侦测层的电压由零变为非零,控制器侦测到这个接通后,进行A/D转换,并将得到的电压值与5V相比,即可得触摸点的Y轴坐标,同理得出X轴的坐标,这就是所有电阻技术触摸屏共同的最基本原理。

电阻式触摸屏
数据手册:链接: http://pan.baidu.com/s/1pLxmr2b 密码: j8uq

  • 代码
TSC2046.h
#ifndef _TSC2046_H_
#define _TSC2046_H_

#include "lpc17xx.h"
#include "Common.h"

#define TSC2046_CS_GPIO		LPC_GPIO1
#define TSC2046_CS_PIN		19
#define TSC2046_DCLK_GPIO	LPC_GPIO1	
#define TSC2046_DCLK_PIN	18
#define TSC2046_DIN_GPIO	LPC_GPIO1	
#define TSC2046_DIN_PIN		20
#define TSC2046_DOUT_GPIO	LPC_GPIO1	
#define TSC2046_DOUT_PIN	22
#define TSC2046_PENING_GPIO	LPC_GPIO1	
#define TSC2046_PENING_PIN	23

#define TSC2046_CS_HIGH()						TSC2046_CS_GPIO   	->FIOSET = _BV(TSC2046_CS_PIN  )	
#define TSC2046_CS_LOW()						TSC2046_CS_GPIO   	->FIOCLR = _BV(TSC2046_CS_PIN  )
#define TSC2046_DCLK_HIGH()						TSC2046_DCLK_GPIO 	->FIOSET = _BV(TSC2046_DCLK_PIN)	
#define TSC2046_DCLK_LOW()						TSC2046_DCLK_GPIO 	->FIOCLR = _BV(TSC2046_DCLK_PIN)
#define TSC2046_DIN_HIGH()		    			TSC2046_DIN_GPIO  	->FIOSET = _BV(TSC2046_DIN_PIN )	
#define TSC2046_DIN_LOW()						TSC2046_DIN_GPIO  	->FIOCLR = _BV(TSC2046_DIN_PIN )
#define GET_TSC2046_DOUT()						(TSC2046_DOUT_GPIO	->FIOPIN & _BV(TSC2046_DOUT_PIN ))
#define GET_TSC2046_PENING()					(TSC2046_PENING_GPIO->FIOPIN & _BV(TSC2046_PENING_PIN))

#define TSC2046_MEASURE_X						0xD0
#define TSC2046_MEASURE_Y						0x90
#define TSC2046_MEASURE_Z1						0xB0
#define TSC2046_MEASURE_Z2						0xC0

void TSC2046_GPIO_Init(void);
void TSC2046_Init(void);
uint32_t TSC2046_ReadWithFilter(uint8_t cmd);


#endif



TSC2046.c
#include "TSC2046.h"
#include "Delay.h"

//触摸读取次数  根据实际情况修改
#define TSC2046_READ_TIMES 5
//丢弃值
#define TSC2046_LOST_Val   1

void TSC2046_GPIO_Init(void)
{
	TSC2046_CS_GPIO		->FIODIR |= _BV(TSC2046_CS_PIN);
	TSC2046_DCLK_GPIO	->FIODIR |= _BV(TSC2046_DCLK_PIN);
	TSC2046_DIN_GPIO	->FIODIR |= _BV(TSC2046_DIN_PIN);
	TSC2046_DOUT_GPIO	->FIODIR &= (~_BV(TSC2046_DOUT_PIN));
	TSC2046_PENING_GPIO	->FIODIR &= (~_BV(TSC2046_PENING_PIN));
}

void Send_One_byte(uint8 data)
{
	uint8 i = 0;
	for(i = 0;i < 8;i ++)
	{
		if(data & 0x80)
		{
			TSC2046_DCLK_LOW();
			TSC2046_DIN_HIGH();
		}
		else
		{
			TSC2046_DCLK_LOW();
			TSC2046_DIN_LOW();
		}
		DelayUS(10);
		TSC2046_DCLK_HIGH();
		DelayUS(10);
		data =	( data<< 1);
	}
}

uint8 Read_One_byte()
{
	uint8 i = 0;
	uint8 rec_data = 0;
	for(i = 0;i < 8;i ++)
	{
		TSC2046_DCLK_LOW();
		DelayUS(10);
		rec_data = (rec_data << 1);
		if(GET_TSC2046_DOUT() != 0)
		{
			rec_data |= 0x01;
		}
		TSC2046_DCLK_HIGH();
		DelayUS(10);
	}
	return rec_data;
}

/*
排序函数
*/
void SortBigToSmallUint16(uint16_t *ptr, uint8_t n)
{
	uint8_t i;
	uint16_t *p;
	uint16_t temp;

	if(n)
	{
		for(--n; n; --n)
		{
			p = ptr;
			for(i = 0; i < n; ++i)
			{
				if(*p < *(p + 1))
				{
					temp = *p;
					*p = *(p + 1);
					*(p + 1) = temp;
				}
				++p;
			}
		}
	}
}


void TSC2046_Init(void)
{
	TSC2046_GPIO_Init();
	TSC2046_CS_HIGH();
	
	DelayUS(10);
	
	TSC2046_CS_LOW();
	
	Send_One_byte(TSC2046_MEASURE_X);
	DelayUS(5);
	Send_One_byte(0);
	Send_One_byte(0);
	
	TSC2046_CS_HIGH();
}


uint16_t TSC2046_Read(uint8_t cmd)
{
	uint16 data;

	TSC2046_CS_LOW();
	Send_One_byte(cmd);
	DelayUS(5);
	data = Read_One_byte();
	data <<= 8;
	data |= Read_One_byte();
	
	TSC2046_CS_HIGH();
	return (data >> 3);
}


uint32_t TSC2046_ReadWithFilter(uint8_t cmd)
{
	uint8_t i;
	uint16_t buf[14];
	uint32_t temp;

	if(GET_TSC2046_PENING())
	{
		return 0;
	}
		
	for(i = 14; i; --i)
	{
		buf[i] = TSC2046_Read(cmd);
	}
	
	SortBigToSmallUint16(&buf[0], 14);

	temp = 0;
	for(i = 5; i < 9; ++i)
	{
		temp += buf[i];
	}
	temp >>= 2;
	return temp;
}





  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值