本帖最后由 damiaa 于 2017-10-9 15:16 编辑
【CH554评测】第二篇 测试一下触摸按键
知识准备:触摸按键 Touch-Key
CH554 芯片提供了电容检测模块及相关的定时器,具有 6 个输入通道,支持电容量范围 5pF~
150pF。自电容方式可以支持最多 6 个触摸按键,互电容方式可以支持最多 15 个触摸按键。
TKEY_CTRL C3h Touch-Key 控制寄存器 x0h
TKEY_DATH C5h Touch-Key 数据高字节(只读) 00h
TKEY_DATL C4h Touch-Key 数据低字节(只读) xxh
TKEY_DAT C4h TKEY_DATL 和 TKEY_DATH 组成 16 位 SFR 00xxh 就是从这里读出触摸按键数据
Touch-Key 控制寄存器(TKEY_CTRL):
位7 bTKC_IF RO定时中断标志。
位[6:5] 保留 RO 保留 00b
位4 bTKC_2MS RW电容检测定时器的周期选择:0-1mS;1-2mS。每周期的前 87uS 为准备阶段,剩余时间检测阶段。
上述时间是基于 Fosc=24MHz 时的时间0
3 保留 RO 保留 0
2 bTKC_CHAN2 RW 触摸按键电容检测输入选择高位 0
1 bTKC_CHAN1 RW 触摸按键电容检测输入选择中位 0
0 bTKC_CHAN0 RW 触摸按键电容检测输入选择低位 0
由 bTKC_CHAN2~bTKC_CHAN0 选择触摸按键电容检测输入通道。
0 0 1 TIN0(P1.0)
0 1 0 TIN1(P1.1)
0 1 1 TIN2(P1.4)
1 0 0 TIN3(P1.5)
1 0 1 TIN4(P1.6)
1 1 0 TIN5(P1.7)
1 1 1 开启电容检测模块的电源但不连接任何通道
总结一下,就是有触摸按键数据寄存器和控制寄存器,一个是读数据,一个是控制哪个按键,开启采样等,这些寄存器都在CH554.H中有定义,在CH554手册中50页开始有详细说明。
1,先准备一下:把JP1的跳线跳到3--5 4--6相连。也就是从上往下左边4和5 右边4和5。
这里是串口0.到时触摸的数据提示从这里出来。
2,选择USB烧录。(下面的那个USB口)
3,把触摸目录的程序烧录进去。
4,重新把线插到上面USB口。打开串口调试器,把串口选上面的那个刚生成的串口。波特率57600,N,8,1
5,按下触摸。不灵敏啊。一起按。啊出来了。提示03触摸通道 Query TouchKey Channel 03
不灵敏啊 是我没试好? 板子? 程序? 后面再试。
程序采用查询方式好些了:去掉Touchkey.h中的宏定义://#define INTERRUPT_TouchKey 0
就是查询方式了。结果好点了。
看来程序要改进一下才好。
触摸程序简介:程序有 main.c TouchKey.c Debug.c
CH554.H Debug.H stdio.h TouchKey.h
这里只介绍一下相关的部分:
CH554.H中:
/* Touch-key timer Registers */
sfr TKEY_CTRL = 0xC3; // touch-key control
#define bTKC_IF 0x80 // ReadOnly: interrupt flag for touch-key timer, cleared by writing touch-key control or auto cleared when start touch-key checking
#define bTKC_2MS 0x10 // touch-key timer cycle selection: 0=1mS, 1=2mS
#define bTKC_CHAN2 0x04 // touch-key channel selection high bit
#define bTKC_CHAN1 0x02 // touch-key channel selection middle bit
#define bTKC_CHAN0 0x01 // touch-key channel selection low bit
// bTKC_CHAN2 & bTKC_CHAN1 & bTKC_CHAN0: touch-key channel selection
// 000: disable touch-key
// 001: TIN0(P1.0)
// 010: TIN1(P1.1)
// 011: TIN2(P1.4)
// 100: TIN3(P1.5)
// 101: TIN4(P1.6)
// 110: TIN5(P1.7)
// 111: enable touch-key but disable all channel
sfr16 TKEY_DAT = 0xC4; // ReadOnly: touch-key data, little-endian
sfr TKEY_DATL = 0xC4; // ReadOnly: low byte of touch-key data
sfr TKEY_DATH = 0xC5; // ReadOnly: high byte of touch-key data
#define bTKD_CHG 0x80 // ReadOnly: indicate control changed, current data maybe invalid
这里对理解程序有帮助。
IE_TKEY:触摸按键检查定时器的中断允许位,该位为1 允许定时中断。
INT_NO_TKEY:触摸按键定时器中断
Touch Key.h
#define INTERRUPT_TouchKey 0 //开启TouchKey中断方式
#define KEY_FIRST 0 //采样起始通道
#define KEY_LAST 3 //采样结束通道
#define KEY_ACT 16 //20 //按键按下,通道采样值减小,该值减小,灵敏度高,该值增大,灵敏度低
#define KEY_BASE_SAMPLE_TIME 5 //采样基准值采样次数,为了取到稳定的通道基准值
中主要声明了与触摸相关寄存器和函数。还有几个宏定义INTERRUPT_TouchKey 0/1 是否采用中断形式采用触摸按键。
KEY_ACT 这个值是采样灵敏度调节的。特别注意。
Touch Key.c中有两种采样触摸方式的函数。
main.c中根据采用方式采样的结果进行串口打印输出。
测试结果:中断方式,在KEY_ACT 为16时中断方式稍微好些 。
CH554DEMO_TOUCH.hex
(5.68 KB, 下载次数: 2)
问题:目前老是第三通道被测试到。其他的没看 到 。程序后续要改动试下。
此内容由EEWORLD论坛网友damiaa原创,如需转载或用于商业用途需征得作者同意并注明出处