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);
}
新鲜出炉的界面,得瑟一下。
u8glib出了更新,终于可以画斜线了,以后曲线显示方便多了。
按照我最初的设计理念完成了界面显示。
每屏显示5行,超出部分横向滚动,
选择是纵向反白显示。
第二屏选择有点儿问题,今天太晚了,明天再弄
刚才把液晶屏和触摸屏的保护膜都揭掉了,用胶水粘在一起。这样就成了一个新的组件,方便调试。
加了一段代码,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);
}
}
:(看样子还有很长的路要走 按钮已经调好了,完美运行。菜单需要长远规划下。
这两天要滑雪,回去再调。可以确定的是,这种结构视觉效果还算不错,目前没见过同样应用。 本帖最后由 thomas 于 2012-3-19 22:52 编辑
滑雪归来,心情无比舒畅~工作效率高多了。
一级菜单做出来了,全部字符形式绘制。
用了我最喜欢的0403字体,极为精致。还是英文菜单能容纳内容更多一点儿。简单操作一个鱼缸,够用了。
另外,用纯图形方式测了一下,图片太多会溢出乱码。看来没法做的太华丽。
计划的效果
选中后的效果
估计上面的效果很难实现了。
客串调试了一个象棋程序
thomas 发表于 2012-3-19 22:20 static/image/common/back.gif
滑雪归来,一级菜单做出来了,全部字符形式绘制。
用了我最喜欢的0408字体,极为精致。
:funk:滑雪。。。。现在哪里还能滑雪呢。。。。 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:49 编辑
附赠工作照一张
崇礼,北大湖都可以,而且刚下了大雪
每天进步一点点。
貌似今天是世界睡眠日,又熬夜了。
图形显示。
以后分屏显示鱼缸的水温、流量、光照强度等。 {:soso_e102:}哇,太好看了 不知道这里介绍的库文件可以用在触摸屏吗?http://www.liquidware.com/wikipages/name/TouchShield 开源奉献无尚光荣 小白走琮!! 刚刚入手了步科触摸屏,不知能否实现