/**************************************** * タッチ・パネルコントローラ用ライブラリ * コントローラIC:XPT2046 "XPTEC社製" * * デバッグ年月日: 2013/6/12 N.Ishii ******************************************/ #include // PIC32 peripheral library #include "Touch_XPT2046_Lib.h" #include "colorlcd_libdsPICVH.h" // QVGAライブラリの中から遅延関数のみ使用 /***************************************** * タッチデバイスへの、コマンド書込み関数 * コントローラIC:XPT2046 * 引数:コマンド・コード *******************************************/ void XPT_Write_Byte(unsigned char num) { unsigned char count; for(count=0; count<8; count++) { if(num & 0x80) TDIN= 1; else TDIN= 0; num <<= 1; // MSBから送信し順次、次のビットにシフト TCLK= 0; // クロック約2MHz TCLK_PW; TCLK=1; TCLK_PW; } } /************************************************ * タッチポイントの座標(AD変換値)読込関数 * 引数:コマンド・コード * 戻り値:タッチポイントの座標(AD変換生データ) **************************************************/ unsigned short XPT_Read_AD(unsigned char CMD) { unsigned char count; unsigned short Num=0;// Num:読出した12bitAD変換値になる TCLK=0; TCS=0; XPT_Write_Byte(CMD); // タッチデバイスへの、コマンド書込み /// BUSYチェックタイミング追加: 130609 TCLK=0; // 最初のコマンドライトの、8クロック目の立下り // このタイミングで、BUSYチェック開始 while(BUSY){ // NOT BUSY待ち TCLK_PW; TCLK=1; // NOT BUSYになるまで、TCLK=1を維持する } for(count= 0; count< 16; count++) { Num <<= 1; TCLK= 0; // NOT BUSYになった最初の立下りクロックで、AD変換スタート 130609追加コメント TCLK_PW; TCLK= 1; TCLK_PW; if(DOUT) Num++; // DOUTが、'1'だったら+1 } Num >>= 4; // 16bit→12bit変換 TCLK= 0; TCLK_PW; // 130610追加 TCS=1; return(Num); } /*************************************************************** * タッチポイントの複数回サンプル+AD変換+座標の安定化計算関数 * 引数:コマンド・コード * 戻り値:安定化されたタッチポイントの座標(AD変換値) ****************************************************************/ unsigned short XPT_Read_XY(unsigned char xy) { unsigned short i, j; unsigned short buf[READ_TIMES]; // リードBUF(15回読込) unsigned short sum=0; unsigned short temp; /// 15回読込 for(i= 0; i buf[j]) { temp= buf[i]; buf[i]= buf[j]; // スワップ buf[j]= temp; } } } /// ソートした最初から5個と、最後から手前5個のデータは捨て、比較的安定している /// と思われる中ほど5個のデータ(buf[5]〜buf[9]の格納データ)の合計を、5で割り /// 平均化したデータ:tempとして座標データを返す sum=0; for(i=LOST_VAL;i