ADS7843/XPT2046触摸屏芯片8051单片机驱动程序
这两个芯片稍有不同, 我还没写出来, 芯片数据手册上面写了的, 请参考~
我的彩屏的大小是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