這兩個芯片稍有不同, 我還沒寫出來, 芯片數據手冊上面寫了的, 請參考~
我的彩屏的大小是240*320~
以下是代碼
//common.h #ifndef __COMMON_H__ #define __COMMON_H__ #include <reg52.h> #include <intrins.h> typedef unsigned int uint; typedef unsigned char uchar; #endif// !__COMMON_H__
//TouchPad.c #define __TOUCHPAD_C__ #include "TouchPad.h" //我的屏幕接口 //#include "gdi.h" sbit TP_CLK = P1^4; //時鍾 sbit TP_CS = P1^5; //片選 sbit TP_IN = P1^6; //數據輸入 //sbit TP_BUSY = P1^3; //我沒有使用忙碌標志 sbit TP_OUT = P1^7; //數據輸出 sbit TP_IRQ = P3^2; //通過INT0通知MCU /* * 函數:檢測觸摸屏是否處於中斷中,在中斷中調用檢測 * 參數:(無) * 返回:0-沒有,非0:觸摸屏被按下 */ uchar tp_isirq(void) { return !(uchar)TP_IRQ; } //開啟外部中斷1,通過外部中斷通知MCU void tp_init(void) { EX0 = 1; IT0 = 1; EA = 1; TP_CS = 1; TP_CLK = 1; TP_IN = 1; TP_CLK = 1; } /* 函數:SPI方式寫一個字節 * 參數:ch:uchar:字節值 * 返回:(無) */ void tp_write(uchar ch) { uchar k; TP_CLK = 0; for(k=0; k<8; k++){ ch <<= 1; TP_IN = CY; TP_CLK = 0; _nop_(); TP_CLK = 1; _nop_(); } } /* * 函數:SPI方式讀函數 * 參數:(無) * 返回值:12位有效數據 */ uint tp_read(void) { uchar k; uint ret = 0; for(k=0; k<12; k++){ ret <<= 1; TP_CLK = 1; _nop_(); TP_CLK = 0; _nop_(); if(TP_OUT) ret++; } return ret; } /* * 函數:取得X,Y的坐標,但沒有比較采樣 * 參數:struct tp_point 的結構體指針 * 返回:(無) * 注釋:外部不要調用, 有誤差 */ void tp_get_pt(struct tp_point* pt) { TP_CS = 0; tp_write(0x90);//讀取Y TP_CLK = 1; _nop_(); TP_CLK = 0; _nop_(); pt->y = tp_read(); tp_write(0xd0);//讀取X TP_CLK = 1; _nop_(); TP_CLK = 0; _nop_(); pt->x = tp_read(); TP_CS = 1; } /* * 函數:取得觸摸屏坐標函數 * 參數: int型的x,y的指針 * 返回值: * 返回0-采樣失敗 * 返回非0-有效采樣 */ int tp_get(int* px, int* py) { struct tp_point pt1; struct tp_point pt2; int x,y; //兩次取值並采樣 tp_get_pt(&pt1); tp_get_pt(&pt2); x = pt1.x-pt2.x; y = pt1.y-pt2.y; //誤差不是很大則有效 if(x<2 && y<2) { //這個計算還不清楚,資料上的 *px = 240-(pt1.x-330)*10/142; *py = 320-(pt1.y-380)/11; return 1; } return 0; }
//TouchPad.h /* 文件:TouchPad.h 描述:觸摸屏相關支持文件 時間:2012-11-02 作者:女孩不哭 Q--Q:191035066 文本:ts=4, sw=4, sts=4 */ #ifndef __TOUCHPAD_H__ #define __TOUCHPAD_H__ #include "common.h" //common.h /* typedef unsigned char uchar; typedef unsigned int uint; #include <reg52.h> */ int tp_get(int* px, int* py); //獲取當前坐標點, 返回值不為零為有效 void tp_init(void); //觸摸屏初始化函數 uchar tp_isirq(void); //判斷觸摸屏是否依然在中斷中 #ifdef __TOUCHPAD_C__ //內部結構,函數 struct tp_point{ int x; int y; }; void tp_get_pt(struct tp_point* pt); uint tp_read(void); void tp_write(uchar ch); #undef __TOUCHPAD_C__ #endif #endif // !__TOUCHPAD_H__
//示例使用方法 //main.c #include "common.h" #include "TouchPad.h" //觸摸屏通過外部中斷0方式通知MCU進行采樣 //應該寫在主模塊中 void int0(void) interrupt 0 { int x=0,y=0; EA = 0; while(1){ if(tp_isirq()){ if(!tp_get(&x, &y)) continue; //x,y是取得的坐標 //set_pixel是我的屏幕畫點的函數 //改成自己的使用方法 //set_pixel(x,y, 0xaaaa); //set_pixel(x+1,y, 0xaaaa); //set_pixel(x,y+1, 0xaaaa); //set_pixel(x+1,y+1, 0xaaaa); }else{ break; } } EA = 1; } void main(void) { //delay_ms(200);//自己實現 tp_init(); while(1) ; }
女孩不哭(QQ:191035066)@2012-11-26 14:40:46 http://www.cnblogs.com/nbsofer