輕松搞定TSC2046觸摸驅(qū)動(dòng)
TSC2046簡(jiǎn)介
??????? TSC2046是一款電阻觸摸屏,電阻觸摸屏的工作原理主要是通過(guò)壓力感應(yīng)原理來(lái)實(shí)現(xiàn)對(duì)屏幕內(nèi)容的操作和控制的,這種觸摸屏屏體部分是一塊與顯示器表面非常配合的多層復(fù)合薄膜,其中第一層為玻璃或有機(jī)玻璃底層,第二層為隔層,第三層為多元樹(shù)脂表層,表面還涂有一層透明的導(dǎo)電層,上面再蓋有一層外表面經(jīng)硬化處理、光滑防刮的塑料層。在多元脂表層表面的傳導(dǎo)層及玻璃層感應(yīng)器是被許多微小的隔層所分隔電流通過(guò)表層,輕觸表層壓下時(shí),接觸到底層,控制器同時(shí)從四個(gè)角讀出相稱的電流及計(jì)算手指位置的距離。這種觸摸屏利用兩層高透明的導(dǎo)電層組成觸摸屏,兩層之間距離僅為2.5微米。當(dāng)手指觸摸屏幕時(shí),平常相互絕緣的兩層導(dǎo)電層就在觸摸點(diǎn)位置有了一個(gè)接觸,因其中一面導(dǎo)電層接通Y軸方向的5V均勻電壓場(chǎng),使得偵測(cè)層的電壓由零變?yōu)榉橇?,控制器偵測(cè)到這個(gè)接通后,進(jìn)行A/D轉(zhuǎn)換,并將得到的電壓值與5V相比,即可得觸摸點(diǎn)的Y軸坐標(biāo),同理得出X軸的坐標(biāo),這就是所有電阻技術(shù)觸摸屏共同的最基本原理。
數(shù)據(jù)手冊(cè):鏈接: 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" //觸摸讀取次數(shù)??根據(jù)實(shí)際情況修改 #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; } /* 排序函數(shù) */ 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; }