极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 127794|回复: 44

Arduino驱动触摸屏实验

  [复制链接]
发表于 2012-3-12 19:40:12 | 显示全部楼层 |阅读模式
本帖最后由 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显示的,自己摘吧。


  1. /*
  2. LCD  Arduino
  3. PIN1 = GND
  4. PIN2 = 5V
  5. RS(CS) = 8;
  6. RW(SID)= 9;
  7. EN(CLK) = 3;
  8. PIN15 PSB = GND;
  9. */
  10. #define xLow  17
  11. #define xHigh 15
  12. #define yLow  16
  13. #define yHigh 14

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

  15. #include "LCD12864RSPI.h"

  16. void setup()
  17. {
  18.   Serial.begin(9600);
  19.   LCDA.Initialise(); // initialize
  20.   delay(100);
  21. }

  22. void loop()
  23. {
  24.   LCDA.CLEAR();// clear screen
  25. //touch screen
  26.   pinMode(xLow,OUTPUT);
  27.   pinMode(xHigh,OUTPUT);
  28.   digitalWrite(xLow,LOW);
  29.   digitalWrite(xHigh,HIGH);

  30.   digitalWrite(yLow,LOW);
  31.   digitalWrite(yHigh,LOW);

  32.   pinMode(yLow,INPUT);
  33.   pinMode(yHigh,INPUT);
  34.   delay(10);

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

  37.   pinMode(yLow,OUTPUT);
  38.   pinMode(yHigh,OUTPUT);
  39.   digitalWrite(yLow,LOW);
  40.   digitalWrite(yHigh,HIGH);

  41.   digitalWrite(xLow,LOW);
  42.   digitalWrite(xHigh,LOW);

  43.   pinMode(xLow,INPUT);
  44.   pinMode(xHigh,INPUT);
  45.   delay(10);

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

  48. //out to display x,y
  49. splitNum(0,1,x);
  50. splitNum(1,1,y);
  51.   delay(500);
  52. }

  53. //split number and display to screen
  54. void splitNum(int dx,int dy,int sn)
  55. {
  56.   int d0=0;
  57.   int d1=0;
  58.   int d2=0;

  59.   if(sn<10){
  60.     d0=sn;
  61.     d1=0;
  62.     d2=0;
  63.   }
  64.   else if(sn<100){

  65.     d0=        sn%10;
  66.     d1=        sn/10;
  67.     d2=0;
  68.   }
  69.   else if(sn<1000){
  70.     d0=sn%10;
  71.     d1=sn%100/10;
  72.     d2=sn/100;
  73.   }
  74.   else{
  75.     d0=9;
  76.     d1=9;
  77.     d2=9;
  78.   }
  79.   LCDA.DisplaySig(dx,dy,d2+48);
  80.   LCDA.DisplaySig(dx,dy+1,d1+48);
  81.   LCDA.DisplaySig(dx,dy+2,d0+48);

  82. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2012-4-7 23:15:37 | 显示全部楼层
新鲜出炉的界面,得瑟一下。

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

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

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

选择是纵向反白显示。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2012-3-13 19:22:14 | 显示全部楼层

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

加了一段代码,void keyPress(int dx,int dy) 用来判读哪个按钮被按下。

  1. /*
  2. LCD  Arduino
  3. PIN1 = GND
  4. PIN2 = 5V
  5. RS(CS) = 8;
  6. RW(SID)= 9;
  7. EN(CLK) = 3;
  8. PIN15 PSB = GND;
  9. */
  10. #define xLow  17
  11. #define xHigh 15
  12. #define yLow  16
  13. #define yHigh 14

  14. #include "LCD12864RSPI.h"

  15. void setup()
  16. {
  17.   Serial.begin(9600);
  18.   LCDA.Initialise(); // initialize
  19.   delay(100);
  20.   LCDA.CLEAR();// clear screen
  21. }

  22. void loop()
  23. {
  24.   pinMode(xLow,OUTPUT);
  25.   pinMode(xHigh,OUTPUT);
  26.   digitalWrite(xLow,LOW);
  27.   digitalWrite(xHigh,HIGH);

  28.   digitalWrite(yLow,LOW);
  29.   digitalWrite(yHigh,LOW);

  30.   pinMode(yLow,INPUT);
  31.   pinMode(yHigh,INPUT);
  32.   delay(10);

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

  35.   pinMode(yLow,OUTPUT);
  36.   pinMode(yHigh,OUTPUT);
  37.   digitalWrite(yLow,LOW);
  38.   digitalWrite(yHigh,HIGH);

  39.   digitalWrite(xLow,LOW);
  40.   digitalWrite(xHigh,LOW);

  41.   pinMode(xLow,INPUT);
  42.   pinMode(xHigh,INPUT);
  43.   delay(10);

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

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

  49.   keyPress(x,y);
  50.   splitNum(0,1,x);
  51.   splitNum(1,1,y);
  52.   delay(500);
  53. }

  54. //split number and display to screen
  55. void splitNum(int dx,int dy,int sn)
  56. {
  57.   int d0=0;
  58.   int d1=0;
  59.   int d2=0;

  60.   if(sn<10){
  61.     d0=sn;
  62.     d1=0;
  63.     d2=0;
  64.   }
  65.   else if(sn<100){
  66.     d0=        sn%10;
  67.     d1=        sn/10;
  68.     d2=0;
  69.   }
  70.   else if(sn<1000){
  71.     d0=sn%10;
  72.     d1=sn%100/10;
  73.     d2=sn/100;
  74.   }
  75.   else{
  76.     d0=9;
  77.     d1=9;
  78.     d2=9;
  79.   }
  80.   LCDA.DisplaySig(dx,dy,d2+48);
  81.   LCDA.DisplaySig(dx,dy+1,d1+48);
  82.   LCDA.DisplaySig(dx,dy+2,d0+48);

  83. }
  84. //display which key was press
  85. void keyPress(int dx,int dy){
  86.   if(dy>145&&dy<234){
  87.     if(dx>103&&dx<220){
  88.       LCDA.DisplaySig(3,1,69);
  89.       LCDA.DisplaySig(3,2,115);
  90.       LCDA.DisplaySig(3,3,99);
  91.     }
  92.     else if(dx>300&&dx<423){
  93.       LCDA.DisplaySig(3,1,60);
  94.       LCDA.DisplaySig(3,2,60);
  95.       LCDA.DisplaySig(3,3,60);
  96.     }
  97.     else if(dx>505&&dx<625){
  98.       LCDA.DisplaySig(3,1,62);
  99.       LCDA.DisplaySig(3,2,62);
  100.       LCDA.DisplaySig(3,3,62);
  101.     }
  102.     else if(dx>702&&dx<833){
  103.       LCDA.DisplaySig(3,1,69);
  104.       LCDA.DisplaySig(3,2,110);
  105.       LCDA.DisplaySig(3,3,116);
  106.     }
  107.     delay(500);
  108.       LCDA.DisplaySig(3,1,0);
  109.       LCDA.DisplaySig(3,2,0);
  110.       LCDA.DisplaySig(3,3,0);
  111.   }  
  112. }



复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-3-14 22:03:49 | 显示全部楼层
看样子还有很长的路要走
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-14 22:42:38 | 显示全部楼层
按钮已经调好了,完美运行。菜单需要长远规划下。
这两天要滑雪,回去再调。可以确定的是,这种结构视觉效果还算不错,目前没见过同样应用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-19 22:20:18 | 显示全部楼层
本帖最后由 thomas 于 2012-3-19 22:52 编辑



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

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

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



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


计划的效果

选中后的效果

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


客串调试了一个象棋程序


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-3-19 22:21:22 | 显示全部楼层
thomas 发表于 2012-3-19 22:20
滑雪归来,一级菜单做出来了,全部字符形式绘制。
用了我最喜欢的0408字体,极为精致。

滑雪。。。。现在哪里还能滑雪呢。。。。
回复 支持 反对

使用道具 举报

发表于 2012-3-19 22:23:16 | 显示全部楼层
thomas 发表于 2012-3-19 22:20
滑雪归来,一级菜单做出来了,全部字符形式绘制。
用了我最喜欢的0408字体,极为精致。


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

使用道具 举报

 楼主| 发表于 2012-3-19 22:48:38 | 显示全部楼层
本帖最后由 thomas 于 2012-3-19 22:49 编辑

附赠工作照一张

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-21 23:42:15 | 显示全部楼层

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-4-8 10:55:13 | 显示全部楼层
{:soso_e102:}哇,太好看了
回复 支持 反对

使用道具 举报

发表于 2012-4-8 15:26:20 | 显示全部楼层
不知道这里介绍的库文件可以用在触摸屏吗?http://www.liquidware.com/wikipages/name/TouchShield
回复 支持 反对

使用道具 举报

发表于 2012-4-9 18:44:53 | 显示全部楼层
开源奉献无尚光荣
回复 支持 反对

使用道具 举报

发表于 2012-4-9 19:31:06 | 显示全部楼层
小白走琮!!
回复 支持 反对

使用道具 举报

发表于 2012-4-26 00:18:30 | 显示全部楼层
刚刚入手了步科触摸屏,不知能否实现
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 08:05 , Processed in 0.043372 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表