本帖最后由 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原创,如需转载或用于商业用途需征得作者同意并注明出处