极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20727|回复: 5

单片机直接操控读取触摸屏"招法" 秉承“单片”之本色

[复制链接]
发表于 2017-8-27 16:57:35 | 显示全部楼层 |阅读模式
本帖最后由 zdzdzddd 于 2017-8-27 17:30 编辑

      电阻触摸屏应用时大都要用专门驱动芯片来做接口,而在许多数简单应用中却突嫌麻烦,俺以为当省就得省略。
其实STC单片机自有强上拉输出又有高速的ADC输入,原理上直接驱动和读取电阻触摸屏是冒问题的。比其专用的芯片自然会多出些许问题,若当真逐一个解决了,即会成就一“牛X”的“不用驱动芯片的单片机直接操控读取触摸屏”之招式。从而节省驱动芯片、减免外围电路,坚持践行咱“单片”之本色。
招式描述:
1、本实验用到4个I/O口直连4线触摸屏端口之超简易搞法。
2、其中单片机P36、P37(居然与彩屏数据口分时共享)兼用(分时)拉高电阻触摸屏的(x、y)对应端。
3、单片机P16、P17则专事交错的拉低(x、y)相应端与读取被触屏点的分压值。
4、由于P16、P17既要分时拉低触摸屏电极又要执行ADC读取,这在STC的ADC应用规范里是不被提倡的,确实在试验中也几曾问题连联、叫俺唠心不已。
5、因此ADC不能引用常规的整体初始化了,只能各自读取ADC时单独施行(参见俺实验通过的例程片段)。
6、现有 触屏x、触屏y以及彩屏驱动的3个(分时)状态,需要P3、P1端口状态在3个状态间进行各自的适用性设置(参见例程注释的革命原理)。
7、本实验使用IAP15L2K61S2单片机芯片,依托彩屏底板,双面胶固定,飞线连接,完成后即成独立系统,不再依赖其他外围,接电源就能运行。
8、实验的图形按键界面牵涉本俺 的“通透背景字符”之另一添彩“招法”,且待另文分解。
俺觉得5、6、条就是本实验之“命门”所在,若得不耻效法与参照,则能够让类似科学实验愉心惬意、好玩不尽,岂不善哉?

瞅瞅视频:

http://video.tudou.com/v/XMjk4OD ... m=a2hzp.8244740.0.0


这个带触摸的2.8寸彩屏,限于驱动芯片麻烦,被视同鸡肋搁置抽斗多时,今终得机缘被俺”荣誉采用“。



完成如下很到位的末梢神经训练。约为老哥哥、老妹妹延寿10年许。
单片机芯片飞线连接后,此板就成为完整的独立系统,不再依赖外围设备,接通5V电源就能运行。保留插针仅用于实验测试与监察。其中D0、D1兼用于程序载入。单片机还有若干空余I/O ,想咋用都行。



实验示明:stc单片机胜任直驱触摸屏,精度比预期的高。成本低、容易搞、好用还好玩。
显示的图片和字符库都放在SD卡里,图片每幅150K字节、空心字符与箭头标记每个510字节。



细研如下图解。不仅仅搞清俺的招式,或能够进一步深谙触摸屏“德性”,然后创念泉涌。




参考代码片段1:
#include "main.h"
#include "LCD26.H"
#include "SSDD.h"
u8 p = 0, q = 0,r,s,w=5;
u16 aa;
bit ConfigFlag=0,RevFlag=0;
int main()
{
      P1M0 = 0xff;    //推挽
      P3M0 = 0xff;      
    CSCS =0;
    Init_SPI();
    DelayMs(50);
    CSB=1;    DelayMs(50);
    RES=0;    DelayMs(50);
    RES=1;    DelayMs(50);
Initial_ST7783R();
DelayMs(50);
ClearScreen(0x0000);
DelayMs(50);
    SC_ZM1624(0, 35, 16,ZM_1624_1, 0xffff,0x000f) ;
     while(sd_reset()!=0)  ;                                //SD1.0卡   初始化
    while(sd_init()!=0 )  SC_ZM1624(50, 50, 5,ZM_1624_1, 0xe0ff,0x000f) ;
   //sd_init4(); while (Inti_Flag)                         //SD2.0卡   初始化
    SC_ZM1624(50, 200, 5,ZM_1624_1+480, Red,0x000f) ;
     SD_TX_ALL(668);
    while(1)
    {
        p = touch_xy(6);           
    if(p>40&p<60)
        {
        S_ZM1624(192, 0,ZM_1624_1+(p/100%10)*48, 0xffff,0x000f) ;//显示y坐标
        S_ZM1624(192,16,ZM_1624_1+(p/10%10)*48, 0xffff,0x000f) ;
        S_ZM1624(192,32,ZM_1624_1+(p%10)*48, 0xffff,0x000f) ;   
                    p = touch_xy(7);
                S_ZM1624(216, 0,ZM_1624_1+(p/100%10)*48, 0xffff,0x000f) ;//显示x坐标
        S_ZM1624(216,16,ZM_1624_1+(p/10%10)*48, 0xffff,0x000f) ;
        S_ZM1624(216,32,ZM_1624_1+(p%10)*48, 0xffff,0x000f) ;        
                if(p>40&p<70)   {                                      //响应左键上翻图片
            if(w<1) w=23; w--;
              SD_TX_ALL(668+(w*300));    DelayMs(500);
                          LCD_XP_ZF5180(0,0,0x051F,652+w%10);              //显示图片编号
                        LCD_XP_ZF5180(51,0,0x051F,652+w/10%10);
                                  }
                if(p>120&p<160) {                                      //响应右键下翻图片
            w++; if(w>22)w=0;   
              SD_TX_ALL((w*300)+668);     DelayMs(500);
                      LCD_XP_ZF5180(0,0,0x051F,652+w%10);              //显示图片编号
                        LCD_XP_ZF5180(51,0,0x051F,652+w/10%10);   
                        }
        }
               p = touch_xy(7);                                    //再显示y坐标
            S_ZM1624(192, 0,ZM_1624_1+(p/100%10)*48, 0xffff,0x000f) ;
        S_ZM1624(192,16,ZM_1624_1+(p/10%10)*48, 0xffff,0x000f) ;
        S_ZM1624(192,32,ZM_1624_1+(p%10)*48, 0xffff,0x000f) ;   
         CSCS=1;DelayMs(1);CSCS=0;      
               p = touch_xy(6);                                    //再显示x坐标
                S_ZM1624(216, 0,ZM_1624_1+(p/100%10)*48, 0xffff,0x000f) ;
        S_ZM1624(216,16,ZM_1624_1+(p/10%10)*48, 0xffff,0x000f) ;
        S_ZM1624(216,32,ZM_1624_1+(p%10)*48, 0xffff,0x000f) ;   
               DelayMs(1);              
              LCD_XP_ZF5180(95,160,Red,7568) ;                   //显示触摸屏方向键
        LCD_XP_ZF5180(95,255,Red,7568+1) ;                                            
          LCD_XP_ZF5180(160,206,Red,7568+2) ;
          LCD_XP_ZF5180(30,206,Red,7568+3) ;
             LCD_XP_ZF5180(96,162,0xffff,7568) ;         //错位双写触摸屏方向键
        LCD_XP_ZF5180(96,257,0xffff,7568+1) ;            //以免被同色背景淹没                              
          LCD_XP_ZF5180(161,208,0xffff,7568+2) ;
          LCD_XP_ZF5180(28,207,0xffff,7568+3) ;
  }
}
参考代码片段2:
//===========读取ADC=============================================================================
u8 GetADCResult(u8 ch)
{     
        u8 h,t=2;
        if(ch==6)ADC_CONTR = 0x8e; //0x80 ADC电源控制位,0x00 speed 540个时钟,0x08 ADC起始控制位,
            else     ADC_CONTR = 0x8f;  
      while(--t) ;                  //等待若干时钟
    while (!(ADC_CONTR & 0x10));    //等待ADC转换完成  ,0x10 ADC完成标志(ADC_FLAG)
    ADC_CONTR = 0;                  //ADC_FLAG 清零,Close ADC
    return ADC_RES;                 //返回ADC结果
}
//===========获取触摸屏数据(带初始化)    y为ox6通道 、x为ox7通道================================
u8 touch_xy(u8 ch)                                          
{
    u8 a,b,c;   
    if(ch==6) { P3M0 = 0x80; P3M1 = 0x40;  P37 = 1;  P17 = 0;  //P37推挽、P36高阻、P37拉高、P17拉低、
                P1ASF = 0x40;      }                           //设置P16口为AD口  
    if(ch==7) { P3M0 = 0x40; P3M1 = 0x80;  P36 = 1;  P16 = 0;  //P36推挽、P37高阻、P36拉高、P16拉低、
              P1ASF = 0x80;      }                           //设置P17口为AD口  
    DelayMs(0);
      ADC_RES = 0;                         //清除结果寄存器
    a = GetADCResult(ch); b = GetADCResult(ch);  c = GetADCResult(ch); //读取指定口数据,读3 次。
    if(b<a)a = b;  if(c<a)a = c;           //选取最小的
        DelayMs(1);
    P3M0 = 0xff; P3M1 = 0x00;              //恢复显示驱动设置
    P1M0 = 0xff; P1M1 = 0x00;
    return a ;
}

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2017-8-28 17:16:38 | 显示全部楼层
高手,真是高手


回复 支持 反对

使用道具 举报

发表于 2017-8-28 17:22:41 | 显示全部楼层
我也有块这种屏,麻烦可以指出哪个是触摸引脚么?资料手册没提到
回复 支持 反对

使用道具 举报

发表于 2017-8-28 17:44:30 | 显示全部楼层
确实牛,我的屏就没调通过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-28 22:39:53 | 显示全部楼层
Hackerpro 发表于 2017-8-28 17:22
我也有块这种屏,麻烦可以指出哪个是触摸引脚么?资料手册没提到

与显示屏的数据和控制线共享端口。
LCD_D7 —— Y+   
LCD_D6 —— X+
LCD_WR—— Y-
LCD_RS —— X-
回复 支持 反对

使用道具 举报

发表于 2017-8-29 08:37:23 | 显示全部楼层
zdzdzddd 发表于 2017-8-28 22:39
与显示屏的数据和控制线共享端口。
LCD_D7 —— Y+   
LCD_D6 —— X+

原来如此,多谢指导

回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 15:50 , Processed in 0.054502 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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