实现的功能效果
贴在LCD12864上,实现完整的触摸屏功能。只需接四根线,程序简单。
1、效果展示:
2、原理
如图2-1 、2-2读者应该不陌生,用过变阻器的都应该知道它的原理,即如图2-2,若在A端接个直流5V,在B端接个电池负极,那么随着中间的P的滑动,在C或者D上(C、D都是导通的)测得的电压也会跟随变化,若P从右边的B向左滑动靠近A,电压则从0V逐渐变到接近5V。掌握这个基本原理,下面的电阻屏就很好理解,下面仅以X轴做分析,Y轴一模一样。
3、代码原理
仔细观察电阻屏实物会看到明显的上下分层,即电阻层,根据这张图脑补一下,它就是一种“平面式变阻器”,当给两极通一个高低电平,再任意读取另外两极的其中一个电极的电压,根据读到的电压值(AD模拟值)不就知道此时该轴的按压位置了?同理再快速的变换极性,对另外两极也做同样操作,不也得到那轴的位置了?在程序里快速循环执行这种供电检测操作不就实时的得到按压的XY坐标了?
4、实现方法
接线方法一:需要六根线
读者手上有啥型号就用啥,不一定非得用Arduino MEGA2560
法二:需要四根线,需要四颗下拉电阻。(读者理解原理后可自行搭建)
接好线,上传程序后,打开串口检验一下接线有没有问题,正常的话,按下触摸屏就会有数值显示出来,并且会有随着x,y轴有序变化。比如你从左下角靠近原点的地方开始向右上角划动,就应该有(50,50)–至—(1000,1000)这样有规律的变化。
5、应用范例
void loop() {
if(touch())//如果触摸
{
if((coordx>280&&coordx<365) && (coordy>290&&coordy<340)) 如果在这个区域内触摸 {LED_NO;}//打开LED
if((coordx>300&&coordx<320) && (coordy>100&&coordy<207)) //同理,如果在这个区域内触摸,执行下面的语句。
{MOTOR——NO();}//打开电机 }
6、源码
/***测试程序,打开串口监视器就可以看到xy轴的值*****/
//触摸屏电源连接 从左 至 右
#define Right 7//右侧X2
#define Left 6//左端X1
#define Bottom 5//底部Y2
#define Top 4//顶部Y1
/******读取********/
#define topInput A0 //顶部Y1 (4和A0接在一起)
#define rightInput A1 //右侧X2(7和A1接在一起)
int coordx=0,coordy=0;
void setup() {
Serial.begin(9600);
}
void loop()
{
if(touch())//如果屏被触摸
{
Serial.print("x=");
Serial.print(coordx);//显示出所触摸处x轴的值
Serial.print(" Y=");
Serial.println(coordy);//显示出所触摸处y轴的值
delay(100);
}
}
/*****下面这段代码不用理,照搬进来放在loop下面即可***********/
boolean touch()
{
boolean touch = false;
pinMode(Left,OUTPUT);
digitalWrite(Left,LOW);
pinMode(Right,OUTPUT);
digitalWrite(Right,HIGH);
pinMode(Top,INPUT);
pinMode(Bottom,INPUT);
delay(3);
coordx = analogRead(topInput);
//获得垂直坐标
pinMode(Bottom,OUTPUT);
digitalWrite(Bottom,LOW);
pinMode(Top,OUTPUT);
digitalWrite(Top,HIGH);
pinMode(Right,INPUT);
pinMode(Left,INPUT);
delay(3);
coordy = analogRead(rightInput);
//如果坐标值小于1000大于0,那么屏被触摸
if(coordx<1000&&coordx>0&&coordy<1000&&coordy>0)
{
touch=true;
}
return touch;
}
©LIU