轻松搞定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 <> 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; }