ADS7843/XPT2046觸摸屏芯片8051單片機(jī)驅(qū)動(dòng)程序
掃描二維碼
隨時(shí)隨地手機(jī)看文章
我的彩屏的大小是240*320~
以下是代碼
//common.h
#ifndef __COMMON_H__
#define __COMMON_H__
#include
#include
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; //時(shí)鐘
sbit TP_CS = P1^5; //片選
sbit TP_IN = P1^6; //數(shù)據(jù)輸入
//sbit TP_BUSY = P1^3; //我沒(méi)有使用忙碌標(biāo)志
sbit TP_OUT = P1^7; //數(shù)據(jù)輸出
sbit TP_IRQ = P3^2; //通過(guò)INT0通知MCU
/*
* 函數(shù):檢測(cè)觸摸屏是否處于中斷中,在中斷中調(diào)用檢測(cè)
* 參數(shù):(無(wú))
* 返回:0-沒(méi)有,非0:觸摸屏被按下
*/
uchar tp_isirq(void)
{
return !(uchar)TP_IRQ;
}
//開(kāi)啟外部中斷1,通過(guò)外部中斷通知MCU
void tp_init(void)
{
EX0 = 1;
IT0 = 1;
EA = 1;
TP_CS = 1;
TP_CLK = 1;
TP_IN = 1;
TP_CLK = 1;
}
/* 函數(shù):SPI方式寫(xiě)一個(gè)字節(jié)
* 參數(shù):ch:uchar:字節(jié)值
* 返回:(無(wú))
*/
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_();
}
}
/*
* 函數(shù):SPI方式讀函數(shù)
* 參數(shù):(無(wú))
* 返回值:12位有效數(shù)據(jù)
*/
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;
}
/*
* 函數(shù):取得X,Y的坐標(biāo),但沒(méi)有比較采樣
* 參數(shù):struct tp_point 的結(jié)構(gòu)體指針
* 返回:(無(wú))
* 注釋:外部不要調(diào)用, 有誤差
*/
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;
}
/*
* 函數(shù):取得觸摸屏坐標(biāo)函數(shù)
* 參數(shù): 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)
{
//這個(gè)計(jì)算還不清楚,資料上的
*px = 240-(pt1.x-330)*10/142;
*py = 320-(pt1.y-380)/11;
return 1;
}
return 0;
}
//TouchPad.h
/*
文件:TouchPad.h
描述:觸摸屏相關(guān)支持文件
文本: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
*/
int tp_get(int* px, int* py); //獲取當(dāng)前坐標(biāo)點(diǎn), 返回值不為零為有效
void tp_init(void); //觸摸屏初始化函數(shù)
uchar tp_isirq(void); //判斷觸摸屏是否依然在中斷中
#ifdef __TOUCHPAD_C__
//內(nèi)部結(jié)構(gòu),函數(shù)
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"
//觸摸屏通過(guò)外部中斷0方式通知MCU進(jìn)行采樣
//應(yīng)該寫(xiě)在主模塊中
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是取得的坐標(biāo)
//set_pixel是我的屏幕畫(huà)點(diǎn)的函數(shù)
//改成自己的使用方法
//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);//自己實(shí)現(xiàn)
tp_init();
while(1)
;
}