[文件名]touch.c
[功能]8051单片机驱动ads7846/ads7843芯片
[简介]ads7846/7843芯片适合用在4线制触摸屏,它通过标准spi协议和cpu通信,操作简单,精度高,当触摸屏被按下时(即有触摸事件发生)则ads7846向cpu发中断请求,cpu接到请求后,应延时一下再响应其请求,目的是为了消除抖动使得采样更准确。如果一次采样不准确,可以尝试多次采样取最后一次结果为准,目的也是为了消除抖动。
[原作者]鞠春阳
[版本]v1.8
[最后修改时间]2004年6月23日下午
[版权]哈尔滨众邦龙科技开发有限公司单片机坐标网:www.mcuzb.com
*/
#include"reg51.h"
#include"intrins.h"
sbitdclk=p1^6;//根据用户自己的定义
sbitcs=p2^2;
sbitdin=p2^3;
sbitdout=p2^4;
sbitbusy=p2^5;
delay(unsignedchari--)
{
while(i--);
}
voidstart()//spi开始
{
dclk=0;
cs=1;
din=1;
dclk=1;
cs=0;
}
writecharto7843(unsignedcharnum)//spi写数据
{
unsignedcharcount=0;
dclk=0;
for(count=0;count<8;count++)
{
num<<=1;
din=cy;
dclk=0;_nop_();_nop_();_nop_();//上升沿有效
dclk=1;_nop_();_nop_();_nop_();
}
}
readfromcharfrom7843()//spi读数据
{
unsignedcharcount=0;
unsignedintnum=0;
for(count=0;count<12;count++)
{
num<<=1;
dclk=1;_nop_();_nop_();_nop_();//下降沿有效
dclk=0;_nop_();_nop_();_nop_();
if(dout)num++;
}
return(num);
}
voidzhongduan()interrupt0//外部中断0用来接受键盘发来的数据
{
unsignedintx=0,y=0;
delay(10000);//中断后延时以消除抖动,使得采样数据更准确
start();//启动spi
//while(busy);//如果busy信号不好使可以删除不用
delay(2);
writecharto7843(0x90);//送控制字10010000即用差分方式读x坐标详细请见有关资料
//while(busy);//如果busy信号不好使可以删除不用
delay(2);
dclk=1;_nop_();_nop_();_nop_();_nop_();
dclk=0;_nop_();_nop_();_nop_();_nop_();
x=readfromcharfrom7843();//读x轴坐标
writecharto7843(0xd0);//送控制字11010000即用差分方式读y坐标详细请见有关资料
dclk=1;_nop_();_nop_();_nop_();_nop_();
dclk=0;_nop_();_nop_();_nop_();_nop_();
y=readfromcharfrom7843();//读y轴坐标
cs=1;
}
main()
{
tmod=0x11;//记数器0计数器1都以16位记数
tcon=0x00;
ie=0x83;//10000001ea=1中断允许,
ip=0x01;
while(1);//等待触摸中断
}