ljj3166 发表于 2017-10-16 00:16

【CH554】评测:触摸按键,亮点还是槽点?

<div class='showpostmsg'> 本帖最后由 ljj3166 于 2017-10-16 00:18 编辑

开始撸CH554的卖点之一
就是触摸按键
第一次玩触摸,有点小小的紧张
先看看原理图

其实PCB板上的按键有两种方式
自感和互感
第一次了解触摸,不知道理解对不对
自感触摸按键可能就是端口对某个固定点的电容值
譬如K3和K4,就是检测P14和P15单独端口的对地或者对哪里感应电容
互感就像K1和K2了
检测P14和P15或者P14和P16之间的感应电容

先看看触摸检测的基本步骤
1、配置触摸端口的P1_DIR_PU 位为 0
2、配置触摸检测的周期,1MS或者2MS
3、配置检测端口
4、等待中断或者直接查询中断
5、读取检测值
然后就是反复执行3-5步了
原理图上使用了P1.4,P1.5和P1.6三个端口
但是例程中检测的通道却是0-3
对应的是P1.0,P1.1,P1.4

因为P1.4在原理图中被K1,K2,K3占用
SO,无论你怎么撸按键
K4永远是没有反应的
再加上P1.6还TM被LED占用

所以,你撸出翔来
也只能是通道3,也就是P1.4(TIN2)在响应
准备简单做个测试,却发现:

WTF......
楼主怀疑楼主拿到了一个假的开发板,一个假的例程......

老老实实自己撸码吧
这官方例程,实在是靠不住
硬杠,胡乱撸了几行
void key_value_get(unsigned char flag)
{
                  TKEY_CTRL = TKEY_CTRL & 0xF8 | 0x03;                                     //ÉèÖòÉÑùͨµÀ

      while((TKEY_CTRL&bTKC_IF) == 0);                                    //bTKC_IF±äΪ1ʱ£¬±¾ÖÜÆÚ²ÉÑùÍê³É                                             //²ÉÑùÖµÎȶ¨£¬È¡µÍ4λ¾Í¹»ÁË
    if(flag)
                {key_value_14_com = TKEY_DAT&0x07F0;}//printf("key_value_14_com = %d\r\n", key_value_14_com);}
      else {key_value_14 = TKEY_DAT&0x07F0       ;}// printf("key_value_14 = %d \r\n", key_value_14); }                        //±£´æ²ÉÑùÖµ
               
      
      TKEY_CTRL = TKEY_CTRL & 0xF8 | 0x04;                                     //ÉèÖòÉÑùͨµÀ

      while((TKEY_CTRL&bTKC_IF) == 0);                                    //bTKC_IF±äΪ1ʱ£¬±¾ÖÜÆÚ²ÉÑùÍê³É                                             //²ÉÑùÖµÎȶ¨£¬È¡µÍ4λ¾Í¹»ÁË
    if(flag)
                {key_value_15_com = TKEY_DAT&0x07F0;}//printf("key_value_15_com = %d \r\n", key_value_15_com);}
      else {key_value_15 = TKEY_DAT&0x07F0       ;}//printf("key_value_15 = %d \r\n", key_value_15);}                        //±£´æ²ÉÑùÖµ
               
      
      TKEY_CTRL = TKEY_CTRL & 0xF8 | 0x05;                                     //ÉèÖòÉÑùͨµÀ

      while((TKEY_CTRL&bTKC_IF) == 0);                                    //bTKC_IF±äΪ1ʱ£¬±¾ÖÜÆÚ²ÉÑùÍê³É                                             //²ÉÑùÖµÎȶ¨£¬È¡µÍ4λ¾Í¹»ÁË
   if(flag)
                {key_value_16_com = TKEY_DAT&0x07F0;}//printf("key_value_16_com = %d \r\n", key_value_16_com); }
      else {key_value_16 = TKEY_DAT&0x07F0       ;}//printf("key_value_16 = %d \r\n", key_value_16);}                        //±£´æ²ÉÑùÖµ
               
}

void key_check()
{
      if((key_value_14 > key_value_14_com + KEY_ACT) && (key_value_15 > key_value_15_com + KEY_ACT))
      {key_stat = 0x01;}
                else if((key_value_14 > key_value_14_com + KEY_ACT) && (key_value_16 > key_value_16_com - KEY_ACT))
                        {key_stat = 0x02;}
                        else if(key_value_14 > key_value_14_com + KEY_ACT)
                        {key_stat = 0x03;}
                              else if(key_value_15 > key_value_15_com + KEY_ACT)
                              {key_stat = 0x04;}
                                                else{;}
      switch(key_stat)
      {
                case 0x01 :
                              printf("s1 pressed...\r\n");
                              T0 = ~T0;
                        break;
                case 0x02 :
                              printf("s2 pressed...\r\n");
                              T1 = ~T1;
                        break;
                case 0x03 :
                              printf("s3 pressed...\r\n");
                              AIN3 = ~AIN3;
                        break;
                case 0x04 :
                              printf("s4 pressed...\r\n");
                              INT1 = ~INT1;
                        break;
                default :
                        break;
      }               
                key_stat = 0x00;
}


main( )
{
    UINT8 i,j;UINT8 TmpSum = 0;
    CfgFsys( );                                                                //CH554ʱÖÓÑ¡ÔñÅäÖà  
    mDelaymS(5);                                                               //ÐÞ¸ÄÖ÷Ƶ½¨ÒéÉÔ¼ÓÑÓʱµÈ´ýоƬ¹©µçÎȶ¨      
    mInitSTDIO( );                                                             //´®¿Ú0³õʼ»¯
    printf("start ...\n");
                Port3Cfg(3,5);Port3Cfg(3,4);Port3Cfg(3,2);Port3Cfg(3,3);
          P1_DIR_PU &= 0x0C;                                                         //ËùÓд¥ÃþͨµÀÉèÖÃΪ¸¡¿ÕÊäÈ룬Óò»µ½µÄͨµÀ¿ÉÒÔ²»ÉèÖÃ
    TouchKeyQueryCyl2ms();                                                   //TouchKey²éѯÖÜÆÚ2ms      
                key_value_get(0xFF);
while(1){

                key_value_get(0x00);
                key_check();
                mDelaymS(500);
      }
}

楼主已经不敢相信打印出来的数据

东西再便宜,也要把资料整对啊
这不坑人呢嘛
不知道该说啥好了.....

此内容由EEWORLD论坛网友ljj3166原创,如需转载或用于商业用途需征得作者同意并注明出处

</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

大道明德 发表于 2017-10-16 08:25

??? 没看懂what》》》

REMY 发表于 2017-10-16 10:05

@ljj3166例程不对应是有这问题,KEY1,KEY2是互容的,KEY3,KEY4是自容的,P16确实是被LED占用了,板子确实有不到位的地方,
51单片机的printf位宽要一致,如果8位位你用
printf(“%d”,(UINT16)cnt);
就不会出现printf乱码这个问题了。

ljj3166 发表于 2017-10-16 10:36

REMY 发表于 2017-10-16 10:05
@ljj3166例程不对应是有这问题,KEY1,KEY2是互容的,KEY3,KEY4是自容的,P16确实是被LED占用了,板子确 ...

got
这种价优量足的东西
资料却让人吐血
实在是可惜

沁恒USB单片机 发表于 2017-10-16 11:35

ljj3166 发表于 2017-10-16 10:36
got
这种价优量足的东西
资料却让人吐血
实在是可惜

你好,首先十分抱歉给测试带来不便。、
关于触摸按键例程和实际硬件未吻合情况是这样的:板子上四个按键分别使用了自感和互感的方式来布线,但实际使用中基本不会用到互感式的,一般都是使用自感式的。(自感式的使用上更稳定可靠,应用兼容性好)所以我们的例程上都是提供的自感的方式。所以未能跟板子对应起来。
针对这个问题我们已经在新版的测试板中有修正,新版的测试板刚做PCB板,大概还需要几天才收到,如果你有需求,我们后面可以发一块新的板子给你。:)十分抱歉。

ltbytyn 发表于 2017-10-16 12:26

其实沁恒出的DEMO程序是通用程序,要测试按键确实需要动手改程序,否则叫什么评测。虽然有个按键不能正确识别,但其他3个按键识别是没有问题的

dcexpert 发表于 2017-10-16 13:26

分析的很清楚,对后面使用的人有很大帮助。

damiaa 发表于 2017-10-16 13:52

{:1_103:}{:1_103:}{:1_103:} 好。:time::time::time:

ljj3166 发表于 2017-10-16 13:54

沁恒USB单片机 发表于 2017-10-16 11:35
你好,首先十分抱歉给测试带来不便。、
关于触摸按键例程和实际硬件未吻合情况是这样的:板子上四个按键 ...

感谢回复
芯片触摸配置十分简便,没有例程按照手册也能轻松解决
不过,好马配好鞍,好芯片配好资料
希望能完善配套,提升体验
{:1_123:}

ljj3166 发表于 2017-10-16 13:55

本帖最后由 ljj3166 于 2017-10-16 14:08 编辑

ltbytyn 发表于 2017-10-16 12:26
其实沁恒出的DEMO程序是通用程序,要测试按键确实需要动手改程序,否则叫什么评测。虽然有个按键不能正确识 ...
摘自百度百科:
DEMO是demonstration的缩写。DEMO的中文含意为“示范”、“展示”、“样片”、“样稿”、“原型”,常被用来称呼具有示范或展示功能及意味的事物。

层主细读一下例程,或许和楼主观点一致也说不定呢:)
至于那个按键,表象上是有3个在响应,其实只是一个端口在响应。

ljj3166 发表于 2017-10-16 13:55

dcexpert 发表于 2017-10-16 13:26
分析的很清楚,对后面使用的人有很大帮助。

感谢D大帮顶

ltbytyn 发表于 2017-10-16 16:02

ljj3166 发表于 2017-10-16 13:55
摘自百度百科:
DEMO是demonstration的缩写。DEMO的中文含意为“示范”、“展示”、“样片”、“样稿” ...

其实你可以去看一下我的帖子,咋两的相似度80%,我的仅仅是没有贴程序而已。既然做过例程肯定是拜读过的

沁恒USB单片机 发表于 2017-10-16 16:23

ljj3166 发表于 2017-10-16 13:54
感谢回复
芯片触摸配置十分简便,没有例程按照手册也能轻松解决
不过,好马配好鞍,好芯片配好资料
希 ...
嗯,你说得对,应用不方便的地方我们会改进的。谢谢!:congratulate:
页: [1]
查看完整版本: 【CH554】评测:触摸按键,亮点还是槽点?