搜索
bottom↓
回复: 27

16键电容触摸按键QT60160芯片资料

[复制链接]

出0入0汤圆

发表于 2011-9-29 11:46:40 | 显示全部楼层 |阅读模式
数据手册和 ATmel Demo板资料:点击此处下载 ourdev_680693VN2ZYL.zip(文件大小:1.46M) (原文件名:qt60xxx_designs.zip)

我现正在使用这颗芯片做项目,本来打算使用ATmel提供QTouch库直接做在主控芯片里,后来经过评估发现MCU的资源还是太少了点,我要做12个按键由其是IO不够。后来改成了这颗固定芯片的方案。其实这颗芯片还是很好用的,可以通过IIC接口和主控芯片连结,QT60160的change引脚接到主控芯片的外部中断引脚上,只要有键被触摸change引脚就会产生一个高电平触发MCU,然后MCU读走键值后change又会回到低电平。整个芯片基本上不要做做太多的配置,你只要根据你的面板厚度配置好每个键的触摸阀值就好。

上部分源码:

/************************************************
文件:TWI.c
用途:TWI操作函数
注意:

************************************************/
//器件地址格式: 0 0 1 0 0 0 1 R/W  即(17+R/W位)
#define W_ADD  0x22     //写从地址
#define R_ADD  0x23     //读从地址
#define SLAW   0x18
#define ERR_SLAW 1


//-----函数声明-----------------------------------
void i2cstart(void);
uchar i2cwt(uchar data);
uchar i2crd(void);
void i2cstop(void);
void WriteQT(uchar mem_add,uchar con_dat);
uchar Read_key(void);
uchar key_switch(uchar key_num);

///////////////////////////////////////////////////////////////////////
//   Qt60160初始化
///////////////////////////////////////////////////////////////////////
void Init_Qt60160(void)
{
     uchar temp;
     WriteQT(130,0x55);//配置解锁         
     WriteQT(179,0x52);//启用0键
     WriteQT(180,0x52);//启用1键
         WriteQT(181,0x52);//启用2键
         WriteQT(182,0x52);//启用3键
         WriteQT(183,0x52);//启用4键     
         WriteQT(184,0x52);//启用5键     
         WriteQT(185,0x52);//启用6键   
         WriteQT(186,0x52);//启用7键     
         WriteQT(187,0x52);//启用8键   
         WriteQT(188,0x52);//启用9键     
         WriteQT(189,0x52);//启用10键   
         WriteQT(190,0x52);//启用11键   
         WriteQT(191,0x00);//禁用12键  
         WriteQT(192,0x00);//禁用13键   
         WriteQT(193,0x00);//禁用14键     
         WriteQT(194,0x00);//禁用15键
//------设置阀值------------------------------
         WriteQT(131,0xa3);//启用0键 NTHR=3,NDRIFT=10
           WriteQT(132,0xa3);//启用1键
         WriteQT(133,0xa3);//启用2键
         WriteQT(134,0xa3);//启用3键
         WriteQT(135,0xa3);//启用4键     
         WriteQT(136,0xa3);//启用5键     
         WriteQT(137,0xa3);//启用6键   
         WriteQT(138,0xa3);//启用7键     
         WriteQT(139,0xa3);//启用8键   
         WriteQT(140,0xa3);//启用9键     
         WriteQT(141,0xa3);//启用10键   
         WriteQT(142,0xa3);//启用11键   
//------------------------------------
         WriteQT(251,3);//awake  
         WriteQT(252,25);//awake   
         WriteQT(253,10);//awake   
         WriteQT(125,0x55);//Recalibrate All
}
///////////////////////////////////////////////////////////////////////
//   开关按键通道
///////////////////////////////////////////////////////////////////////
void switch_key(uchar contl)
{
    uchar temp;
        WriteQT(130,0x55);//配置解锁.
        NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();
    if(contl)
        {
       
       WriteQT(179,0x52);//启用0键
       NOP();
           WriteQT(180,0x52);//启用1键
       NOP();
           WriteQT(181,0x52);//启用2键
       NOP();
           WriteQT(182,0x52);//启用3键
       NOP();
           WriteQT(183,0x52);//启用4键
       NOP();
           WriteQT(184,0x52);//启用5键
       NOP();
           WriteQT(185,0x52);//启用6键
       NOP();
           WriteQT(186,0x52);//启用7键
       NOP();
           WriteQT(187,0x52);//启用8键
       NOP();
           WriteQT(188,0x52);//启用9键
       NOP();
           WriteQT(189,0x52);//启用10键
       NOP();
           WriteQT(190,0x52);//启用11键
           NOP();
           WriteQT(191,0x00);//禁用12键
       NOP();
           WriteQT(192,0x00);//禁用13键
       NOP();
           WriteQT(193,0x00);//禁用14键
       NOP();
           WriteQT(194,0x00);//禁用15键
  }
  else
  {   
       WriteQT(179,0x00);//禁用0键
       NOP();
           WriteQT(180,0x00);//禁用1键
       NOP();
           WriteQT(181,0x00);//禁用2键
           NOP();
       WriteQT(182,0x52);//启用3键------------------------
       NOP();
           WriteQT(183,0x00);//禁用4键
       NOP();
           WriteQT(184,0x00);//禁用5键
       NOP();
           WriteQT(185,0x00);//禁用6键
       NOP();
           WriteQT(186,0x00);//禁用7键
       NOP();
           WriteQT(187,0x00);//禁用8键
       NOP();
           WriteQT(188,0x00);//禁用9键
       NOP();
           WriteQT(189,0x00);//禁用10键
       NOP();
           WriteQT(190,0x00);//禁用11键
       NOP();
           WriteQT(191,0x00);//禁用12键
       NOP();
           WriteQT(192,0x00);//禁用13键
       NOP();
           WriteQT(193,0x00);//禁用14键
       NOP();
           WriteQT(194,0x00);//禁用15键
   }  
   temp=Read_key();//读取键值
   //WriteQT(125,0x55);//Recalibrate All
}
/*************************************************************************
** 函数名称: i2cstart(void)
** 功能描述: i2c通信开始
**************************************************************************/
void i2cstart(void)
{
    uint temp;
       
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
        temp=0;
           while (!(TWCR & (1<<TWINT)))
        {
            if((++temp)>6000)
                break;
        }
}

/*************************************************************************
** 函数名称: unsigned char i2cwt(unsigned char data)
** 功能描述: i2c写数据,返回TWI状态
** 输 入:
** 输  出: TWI状态
**************************************************************************/
uchar i2cwt(uchar data)
{
    uint temp;
        TWDR = data;
           TWCR = (1<<TWINT) | (1<<TWEN);
        temp=0;
           while (!(TWCR & (1<<TWINT)))
        {
            if((++temp)>6000)
                break;
        }       
           return(TWSR&0b11111000);
}

/*************************************************************************
** 函数名称: unsigned char i2crd(void)
** 功能描述: i2c读数据
** 输 入:
** 输出         : 读取的数据
**************************************************************************/
uchar i2crd(void)
{
    uint temp;
           TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
        temp=0;
           while (!(TWCR & (1<<TWINT)))
        {
            if((++temp)>6000)
                break;
        }
           return(TWDR);
}

/*************************************************************************
** 函数名称: i2cstop(void)
** 功能描述: i2c停止
**************************************************************************/
void i2cstop(void)
{
   TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
}


/*************************************************************************
** 函数名称: WriteQT(uchar mem_add,uchar con_dat) //写数据程序
** 功能描述: 向QT60160写入配置数据
** 输 入 unsigned mem_add  :需要写入的内存地址
** 输 入 unsigned con_dat  :需要写入的数据
** 输出         : 无
**************************************************************************/
void WriteQT(uchar mem_add,uchar con_dat)
{
   i2cstart();
   NOP();
   if(i2cwt(W_ADD)==SLAW)
   {
          i2cwt(mem_add);//写内存地址
          i2cwt(con_dat);//写配置数据
   }
   //else syserr=ERR_SLAW;
   i2cstop();
}

/*************************************************************************
** 函数名称: uchar Read_key(void); //读按键状态程序
** 功能描述: 读取地址0,1,键状态
** 输 入 无
** 输出          返回键值 (0xff为未找到按键)
**************************************************************************/
uchar Read_key(void)
{
   uchar sta_buf[3];
   uchar i,j,key_num;
   
  //---------------读QT60160按键状态---------------------
   
   i2cstart();//启动I2C
   NOP();NOP();NOP();
   if(i2cwt(W_ADD)==SLAW)//发送写器件地址
   {
          i2cwt(0x01);//发送要读取的QT内存地址
          _NOP();
          i2cstop();  //I2C停止
          _NOP();  
          i2cstart();   //启动I2C
          NOP();
          i2cwt(R_ADD);  //发送读器件地址
          sta_buf[0]=i2crd();//读取QT内存0x01的值
          sta_buf[1]=i2crd();//读取QT内存0x02的值
          sta_buf[2]=i2crd();//读取QT内存0x02的值
          _NOP();
          i2cstop();
          sta_buf[1]&=0b00011111;//屏蔽12以上的键
          
          //---------------查找按下的键--------------------------
       key_num=0;
       for(i=0;i<2;i++)
       {
          if(sta_buf!=0x00)
              {
                 for(j=0;j<8;j++)
                     {
                     if(sta_buf&0x01)
                         {
                    key_num=key_switch(key_num);
                                        i2cstop();
                            return key_num;
                         }
                             key_num++;
                         sta_buf=sta_buf>>1;
                     }
              }
          else key_num+=0x08;
       }
   }
   else i2cstop();
   return 0xff;
}
/************************************************************************
** 函数名称: key_switch(key_num); //键值转换
** 功能描述: 按键盘布局转换成对应的值
** 输 入 key_num
** 输出          key_num
*************************************************************************/
uchar key_switch(uchar key_num)
{
   uchar temp;
   switch (key_num)
   {
      case 0:temp=1; break;
      case 1:temp=4; break;
          case 2:temp=7; break;
          case 3:temp=10; break;
          case 4:temp=3; break;
          case 5:temp=6; break;
          case 6:temp=9; break;
          case 7:temp=11; break;
          case 8:temp=2; break;
          case 9:temp=5; break;
          case 10:temp=8; break;
          case 11:temp=0; break;
          default:temp=0xff;  break;
   }
   return temp;
}


最后面有个问题还要求助于各位大虾,由于我的应用比较特殊,因为是电池供电所以对功耗要求特别严。所以在待机的情况下MCU是睡觉的而且为了省电QT芯片也只留一个按键在工作,其它都关闭。当有人操作时必须象手机解锁一样,先按工作着的按键唤醒MCU,然后MCU再调用void switch_key(uchar contl)
打开所有通道的按键。操作完毕再次进入睡觉之前又要关闭所有的按键通道只留一个。

问题:现在逻缉功能上可以实现,让人受不了的是每次按下唤醒键打开所有通道后要等3秒左右所有按键才可以响引,就是说配置一次通道要3秒才可以使用。找过代理商的FAE,也是一问三不知。不知各位大虾有没这方面的经验?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-9-29 17:46:39 | 显示全部楼层
没一个人回答?大家是不是要砸“万能的坛”这块招牌啊!莫老爷快来啊他们要砸你的坛-----!

出0入0汤圆

发表于 2011-9-29 18:35:56 | 显示全部楼层
笑而不语

出0入0汤圆

发表于 2011-9-29 19:28:19 | 显示全部楼层
如此冷门的芯片,居然连手册都不主动提供

出0入0汤圆

发表于 2011-9-29 19:34:30 | 显示全部楼层
触摸芯片?

出0入0汤圆

 楼主| 发表于 2011-9-30 08:26:34 | 显示全部楼层
回复【3楼】packer
如此冷门的芯片,居然连手册都不主动提供
-----------------------------------------------------------------------

楼主位不是有提供手册吗?这颗芯片不算很冷门吧?我是从ATmel代理商的产品指指南上找到的。
再说又不是只有一款产品,而是一条产品线,从1个键到48键都有。听说好象是ATmel收购量研后的产品,
去年的AVR断货的原因还跟它有关呢,听说ATmel的触摸产品接到大单所以才压缩AVR的产能。
这些都是小道消息,不足为信。

出0入0汤圆

发表于 2011-9-30 09:08:39 | 显示全部楼层
首先,用触摸芯片的就不多,能用到QT的就更少了
另外,就2张原理图和pcb可不能叫手册,你不会叫希望帮助你的人自己去找datasheet吧

出0入0汤圆

发表于 2011-9-30 09:10:01 | 显示全部楼层
回复【5楼】cocotan_2009
-----------------------------------------------------------------------

楼主你好,本人正准备接触多键触摸应用。目前有CYPRESS,南非的阿祖泰克,还是AT的昆腾,样品都没有拿到过。
你用的QT芯片效果怎么样?我是要接近式触摸,中间加5mm亚克力。抗干扰能力强

出0入0汤圆

 楼主| 发表于 2011-9-30 09:16:33 | 显示全部楼层
回复【6楼】packer
-----------------------------------------------------------------------

不好意思,没仔细。我以为里面有呢。再上

点击此处下载 ourdev_680884C2CNOS.pdf(文件大小:609K) (原文件名:qt60240.pdf)

出0入0汤圆

发表于 2011-9-30 09:18:17 | 显示全部楼层
备用。

出0入0汤圆

 楼主| 发表于 2011-9-30 09:27:06 | 显示全部楼层
回复【7楼】yulutong 土土狗
回复【5楼】cocotan_2009  
-----------------------------------------------------------------------
楼主你好,本人正准备接触多键触摸应用。目前有cypress,南非的阿祖泰克,还是at的昆腾,样品都没有拿到过。
你用的qt芯片效果怎么样?我是要接近式触摸,中间加5mm亚克力。抗干扰能力强
-----------------------------------------------------------------------

是啊,我有见到过好多用塞普利斯的单片机来做,还有silicon LAB 的C8051F的来做

出0入0汤圆

发表于 2011-9-30 09:50:57 | 显示全部楼层
那里能买到?多少钱

出0入0汤圆

发表于 2011-9-30 10:35:37 | 显示全部楼层
回复【楼主位】cocotan_2009
-----------------------------------------------------------------------
可以拿示波器看看,是不是触控芯片的问题,还是 单片机休眠的问题。先排除下。

出0入0汤圆

 楼主| 发表于 2011-9-30 11:52:48 | 显示全部楼层
厚度不是问题 ,只要你的电极别画得太小 ,按要求走线就没问题 。我的面板厚 4mm,我试过可以达到 10mm的厚度.对于稳定性,固定芯片方案就不用但心 .今天在外面,上网不便 .

出0入0汤圆

 楼主| 发表于 2011-9-30 15:13:19 | 显示全部楼层
去了趟质量监督检验检疫中心做浪涌冲击试验,参编一份行业标准,狗屁的专家每次讨论会只会咬文嚼字,每一句话都要求来源,有试验数据支撑.搞疯了。

继续上图

(原文件名:PCB.JPG)

出0入0汤圆

发表于 2011-10-1 20:00:50 | 显示全部楼层
估计atmel都去做xmt的电容屏触摸芯片去了!!!

出0入0汤圆

发表于 2011-10-1 21:49:31 | 显示全部楼层
触摸品。

出0入0汤圆

发表于 2011-10-2 11:14:55 | 显示全部楼层
触摸技术昆腾是元老来的, 90年代末就开始搞了, 所以QT系列的肯定性能什么的是比其他好是正常的,主要体现在charge transfer的技术上,现在很多人设计的电容触摸不太好主要还是因为对物理模型掌握的程度不够,违背了很多原则,那么再好的芯片也没办法正常工作了.

出0入0汤圆

发表于 2011-10-26 22:40:27 | 显示全部楼层
也是打算使用QT60160,本来使用4*4矩阵的,但现在要改用触摸的。

出0入0汤圆

发表于 2011-11-19 13:41:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-31 14:04:27 | 显示全部楼层
回复【楼主位】cocotan_2009
-----------------------------------------------------------------------

正到处找qt60160的资料学习触摸键,希望能同楼主共同探讨。

出0入0汤圆

发表于 2012-1-31 14:26:07 | 显示全部楼层
回复【楼主位】cocotan_2009
-----------------------------------------------------------------------

cocotan_2009 楼主,我也正做触摸按键下载了你的资料
<E6240-ISS-1.pdf>这篇是你的设计吗?,再就是没QT60160中文资料?我是英文盲啊

出0入0汤圆

发表于 2012-1-31 16:24:51 | 显示全部楼层
不是说可以通过i2c来设置响应时间吗?能否发个qt60160的应用电路图做参考,我的邮箱是cuihuanwen@163.com,年前刚试过ttp229lsf16触摸键芯片,感应距离不理想,隔2mm厚abs塑料感应不到触摸,我准备采用这款芯片试试。

出0入0汤圆

发表于 2012-2-2 14:56:35 | 显示全部楼层
请问qt60160可以手工焊接吗?

出10入10汤圆

发表于 2012-6-8 17:59:36 | 显示全部楼层
手工焊接肯定可以。
关注此芯片,E络盟报价30多,不敢用啊,不知道各位批量拿货多少钱?

出0入0汤圆

发表于 2012-7-12 09:31:35 | 显示全部楼层
我们 经常做这块  芯片很多啊 不一定用这么冷门的啊  TTP224也很好啊  不明白的找我 QQ350998385

出0入0汤圆

发表于 2014-1-25 15:55:40 | 显示全部楼层
make
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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