thomas 发表于 2012-3-12 19:40:12

Arduino驱动触摸屏实验

本帖最后由 thomas 于 2012-3-21 15:33 编辑

买了12864液晶屏后,总觉得少点儿什么,似乎应该有个配套的触摸屏会更漂亮。
结果taobao了半天,根本买不到带触摸屏的12864模块。
我开始怀疑我的脑袋是不是不正常了,这应该是个基础需求吧。有触摸屏的话可以省去很多按钮,面板设计会更简洁。
量了一下,我买的12864属于低端产品,大概3.2吋的屏幕。淘宝搜了下,唯一的3.2吋触摸屏是手机专用的,不敢冒险,所以买了一块最常见的“4线电阻式触摸屏” 3.4吋的屏,已经粘好了面板。又同时买了个配套的插座。
本次是初步联合调试,液晶屏是传统的SPI接法,可以参照弘毅的帖子arduino学习笔记15 - 12864液晶实验。
3.4吋的屏和液晶屏宽度一样,高度长出一些,很难看。突发灵感,把空白位置做成了固定的按钮。
激光机打了一张,开始为了追求质感,怕漏光,用的卡片纸。后来发现纯属画蛇添足,改用普通白纸答应更漂亮。

自己写了个类,分两行做实时动态显示。第一次上手,代码有些笨拙。
网上找了个触摸屏程序,直接用来看看。
接线:非常简单。触摸屏1234脚接 ANALOG IN 0,1,2,3 然后所有4个引脚各挂一个10k电阻连接到GND


(未完待续)
加精了,怎么也得补个连接图吧。第一次用Fritzin,不熟练,自己做了一个TouchScreen的原件。
















代码,就几行,其余都是LCD显示的,自己摘吧。

/*
LCDArduino
PIN1 = GND
PIN2 = 5V
RS(CS) = 8;
RW(SID)= 9;
EN(CLK) = 3;
PIN15 PSB = GND;
*/
#define xLow17
#define xHigh 15
#define yLow16
#define yHigh 14

//将触摸屏连接到ANALOGIN 0~4

#include "LCD12864RSPI.h"

void setup()
{
Serial.begin(9600);
LCDA.Initialise(); // initialize
delay(100);
}

void loop()
{
LCDA.CLEAR();// clear screen
//touch screen
pinMode(xLow,OUTPUT);
pinMode(xHigh,OUTPUT);
digitalWrite(xLow,LOW);
digitalWrite(xHigh,HIGH);

digitalWrite(yLow,LOW);
digitalWrite(yHigh,LOW);

pinMode(yLow,INPUT);
pinMode(yHigh,INPUT);
delay(10);

//xLow has analog port -14 !!
int x=analogRead(yLow -14);

pinMode(yLow,OUTPUT);
pinMode(yHigh,OUTPUT);
digitalWrite(yLow,LOW);
digitalWrite(yHigh,HIGH);

digitalWrite(xLow,LOW);
digitalWrite(xHigh,LOW);

pinMode(xLow,INPUT);
pinMode(xHigh,INPUT);
delay(10);

//xLow has analog port -14 !!
int y=analogRead(xLow - 14);

//out to display x,y
splitNum(0,1,x);
splitNum(1,1,y);
delay(500);
}

//split number and display to screen
void splitNum(int dx,int dy,int sn)
{
int d0=0;
int d1=0;
int d2=0;

if(sn<10){
    d0=sn;
    d1=0;
    d2=0;
}
else if(sn<100){

    d0=        sn%10;
    d1=        sn/10;
    d2=0;
}
else if(sn<1000){
    d0=sn%10;
    d1=sn%100/10;
    d2=sn/100;
}
else{
    d0=9;
    d1=9;
    d2=9;
}
LCDA.DisplaySig(dx,dy,d2+48);
LCDA.DisplaySig(dx,dy+1,d1+48);
LCDA.DisplaySig(dx,dy+2,d0+48);

}

thomas 发表于 2012-4-7 23:15:37

新鲜出炉的界面,得瑟一下。

u8glib出了更新,终于可以画斜线了,以后曲线显示方便多了。

按照我最初的设计理念完成了界面显示。

每屏显示5行,超出部分横向滚动,

选择是纵向反白显示。

第二屏选择有点儿问题,今天太晚了,明天再弄

thomas 发表于 2012-3-13 19:22:14


刚才把液晶屏和触摸屏的保护膜都揭掉了,用胶水粘在一起。这样就成了一个新的组件,方便调试。

加了一段代码,void keyPress(int dx,int dy) 用来判读哪个按钮被按下。
/*
LCDArduino
PIN1 = GND
PIN2 = 5V
RS(CS) = 8;
RW(SID)= 9;
EN(CLK) = 3;
PIN15 PSB = GND;
*/
#define xLow17
#define xHigh 15
#define yLow16
#define yHigh 14

#include "LCD12864RSPI.h"

void setup()
{
Serial.begin(9600);
LCDA.Initialise(); // initialize
delay(100);
LCDA.CLEAR();// clear screen
}

void loop()
{
pinMode(xLow,OUTPUT);
pinMode(xHigh,OUTPUT);
digitalWrite(xLow,LOW);
digitalWrite(xHigh,HIGH);

digitalWrite(yLow,LOW);
digitalWrite(yHigh,LOW);

pinMode(yLow,INPUT);
pinMode(yHigh,INPUT);
delay(10);

//xLow has analog port -14 !!
int x=analogRead(yLow -14);

pinMode(yLow,OUTPUT);
pinMode(yHigh,OUTPUT);
digitalWrite(yLow,LOW);
digitalWrite(yHigh,HIGH);

digitalWrite(xLow,LOW);
digitalWrite(xHigh,LOW);

pinMode(xLow,INPUT);
pinMode(xHigh,INPUT);
delay(10);

//xLow has analog port -14 !!
int y=analogRead(xLow - 14);

Serial.print(x,DEC);   
Serial.print(",");   
Serial.println(y,DEC);

keyPress(x,y);
splitNum(0,1,x);
splitNum(1,1,y);
delay(500);
}

//split number and display to screen
void splitNum(int dx,int dy,int sn)
{
int d0=0;
int d1=0;
int d2=0;

if(sn<10){
    d0=sn;
    d1=0;
    d2=0;
}
else if(sn<100){
    d0=        sn%10;
    d1=        sn/10;
    d2=0;
}
else if(sn<1000){
    d0=sn%10;
    d1=sn%100/10;
    d2=sn/100;
}
else{
    d0=9;
    d1=9;
    d2=9;
}
LCDA.DisplaySig(dx,dy,d2+48);
LCDA.DisplaySig(dx,dy+1,d1+48);
LCDA.DisplaySig(dx,dy+2,d0+48);

}
//display which key was press
void keyPress(int dx,int dy){
if(dy>145&&dy<234){
    if(dx>103&&dx<220){
      LCDA.DisplaySig(3,1,69);
      LCDA.DisplaySig(3,2,115);
      LCDA.DisplaySig(3,3,99);
    }
    else if(dx>300&&dx<423){
      LCDA.DisplaySig(3,1,60);
      LCDA.DisplaySig(3,2,60);
      LCDA.DisplaySig(3,3,60);
    }
    else if(dx>505&&dx<625){
      LCDA.DisplaySig(3,1,62);
      LCDA.DisplaySig(3,2,62);
      LCDA.DisplaySig(3,3,62);
    }
    else if(dx>702&&dx<833){
      LCDA.DisplaySig(3,1,69);
      LCDA.DisplaySig(3,2,110);
      LCDA.DisplaySig(3,3,116);
    }
    delay(500);
      LCDA.DisplaySig(3,1,0);
      LCDA.DisplaySig(3,2,0);
      LCDA.DisplaySig(3,3,0);
}
}



文具盒 发表于 2012-3-14 22:03:49

:(看样子还有很长的路要走

thomas 发表于 2012-3-14 22:42:38

按钮已经调好了,完美运行。菜单需要长远规划下。
这两天要滑雪,回去再调。可以确定的是,这种结构视觉效果还算不错,目前没见过同样应用。

thomas 发表于 2012-3-19 22:20:18

本帖最后由 thomas 于 2012-3-19 22:52 编辑



滑雪归来,心情无比舒畅~工作效率高多了。

一级菜单做出来了,全部字符形式绘制。

用了我最喜欢的0403字体,极为精致。还是英文菜单能容纳内容更多一点儿。简单操作一个鱼缸,够用了。



另外,用纯图形方式测了一下,图片太多会溢出乱码。看来没法做的太华丽。


计划的效果

选中后的效果

估计上面的效果很难实现了。


客串调试了一个象棋程序


弘毅 发表于 2012-3-19 22:21:22

thomas 发表于 2012-3-19 22:20 static/image/common/back.gif
滑雪归来,一级菜单做出来了,全部字符形式绘制。
用了我最喜欢的0408字体,极为精致。



:funk:滑雪。。。。现在哪里还能滑雪呢。。。。

弘毅 发表于 2012-3-19 22:23:16

thomas 发表于 2012-3-19 22:20 static/image/common/back.gif
滑雪归来,一级菜单做出来了,全部字符形式绘制。
用了我最喜欢的0408字体,极为精致。



悄悄的说。。。我也觉得uno的328P芯片ram太小,容易溢出,所以把AVR里ram最大的芯片。。。准备装arduino的bootloader玩玩,貌似有16K的ram~~~

thomas 发表于 2012-3-19 22:48:38

本帖最后由 thomas 于 2012-3-19 22:49 编辑

附赠工作照一张

崇礼,北大湖都可以,而且刚下了大雪

thomas 发表于 2012-3-21 23:42:15


每天进步一点点。
貌似今天是世界睡眠日,又熬夜了。
图形显示。
以后分屏显示鱼缸的水温、流量、光照强度等。

三水 发表于 2012-4-8 10:55:13

{:soso_e102:}哇,太好看了

悠然小调 发表于 2012-4-8 15:26:20

不知道这里介绍的库文件可以用在触摸屏吗?http://www.liquidware.com/wikipages/name/TouchShield

piaozhiling 发表于 2012-4-9 18:44:53

开源奉献无尚光荣

bogoo 发表于 2012-4-9 19:31:06

小白走琮!!

文具盒 发表于 2012-4-26 00:18:30

刚刚入手了步科触摸屏,不知能否实现
页: [1] 2 3
查看完整版本: Arduino驱动触摸屏实验