基于STM32F103的TTP229B两线串行通讯测试

    最近在做一个项目,项目中使用到了触摸按键板。淘宝上买了一个TTP229B的16键触摸板模块用于调试,但是商家不提供测试程序和使用说明。无奈查阅资料,按照时序图模拟时序,花了一上午时间完成16键触摸键盘的测试工作(两线串行通讯)。very happy!大笑

1、 触摸按键模块:


2、原理图:



3、16键串行配置,手册重点说明。


根据手册说明,使用16键模式,需要TP2连接高阻值电阻到地!


16键的2-线串行通讯方式可以配置为高电平有效,和低电平有效两种方式。

此处选择为高电平有效(根据个人习惯配置)。所以TP1=0,TP2=0。TP1和TP2都连接高阻值电阻到地!,需要将触摸板上的K1,K2通过短接块接地。

如下:



上图表格为芯片手册的时序图中的时序参数设定范围!


4、测试程序。

key.h文件

#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#include "delay.h"


#define KEY_SDA_IN()  {GPIOC->CRL&=0XFFFF0FFF;GPIOC->CRL|=0X00008000;GPIOC->ODR==0<<3;}    //下拉输入
#define KEY_SDA_OUT() {GPIOC->CRL&=0XFFFF0FFF;GPIOC->CRL|=0X00003000;}  //推挽输出,50Mhz
#define TT_SCL    PCout(2) //SCL-PC2
#define TT_SDO    PCout(3) //SDA-PC3
#define TT_SDI    PCin(3)   


u16 TouchKey_Read(void);
void TouchKey_init(void);
u8 Get_KeyNum(void);
#endif

key.c文件

#include "key.h"
#include "usart.h"


void TouchKey_init(void)
{

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;      //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);


    KEY_SDA_OUT();             //SDO设置为输出
    TT_SDO = 0;
    TT_SCL = 0;
    TouchKey_Read();
}
 
u16 TouchKey_Read(void)
{
    u8 i;
    u16 re_val = 0;
 KEY_SDA_OUT();
    TT_SDO = 1; 
 delay_us(100);
    TT_SDO = 0; 
 delay_us(20);


 KEY_SDA_IN();


    for (i = 0; i < 16; i++)
    {
        TT_SCL = 1; 
 delay_us(200);
        TT_SCL = 0;
        if (TT_SDI==1)
        {
           re_val |= (1 << i);
        }
        delay_us(200);
    }
    delay_ms(2);    //根据时序图延时2ms, 不然容易出现按键串扰现象
    return re_val;
}


u16 PreKeyNum;
u16 NowKeyNum;


u8 Get_KeyNum(void)
{
u8 key_num;
NowKeyNum=TouchKey_Read();
if((NowKeyNum & 0x0001)&& !(PreKeyNum & 0x0001))   
{
key_num=1; 
}
if((NowKeyNum & 0x0002)&& !(PreKeyNum & 0x0002))    
{
key_num=2; 
}
if((NowKeyNum & 0x0004)&& !(PreKeyNum & 0x0004))   
{
key_num=3; 
}
if((NowKeyNum & 0x0008)&& !(PreKeyNum & 0x0008))   
{
key_num=4;  
}
if((NowKeyNum & 0x0010)&& !(PreKeyNum & 0x0010))    
{
key_num=5;  
}
if((NowKeyNum & 0x0020)&& !(PreKeyNum & 0x0020))  
{
key_num=6;  
}
if((NowKeyNum & 0x0040)&& !(PreKeyNum & 0x0040))   
{
key_num=7; 
}
if((NowKeyNum & 0x0080)&& !(PreKeyNum & 0x0080))   
{
key_num=8; 
}
if((NowKeyNum & 0x0100)&& !(PreKeyNum & 0x0100))  
{
key_num=9; 
}
if((NowKeyNum & 0x0200)&& !(PreKeyNum & 0x0200))   
{
key_num=10; 
}
if((NowKeyNum & 0x0400)&& !(PreKeyNum & 0x0400))    
{
key_num=11; 
}
if((NowKeyNum & 0x0800)&& !(PreKeyNum & 0x0800))    
{
key_num=12; 
}
if((NowKeyNum & 0x1000)&& !(PreKeyNum & 0x1000))    
{
key_num=13;
}
if((NowKeyNum & 0x2000)&& !(PreKeyNum & 0x2000))   
{
key_num=14; 
}
if((NowKeyNum & 0x4000)&& !(PreKeyNum & 0x4000))   
{
key_num=15; 
}
if((NowKeyNum & 0x8000)&& !(PreKeyNum & 0x8000))  
{
key_num=16; 
}


PreKeyNum=NowKeyNum;
return key_num;
}



main.c文件


#include "usart.h"
#include "key.h"
#include "as608.h"
int main(void)
{
u16 num=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();      
usart1_init(115200);
        delay_init();
TouchKey_init();
while(1)
{
 num=Get_KeyNum();
printf("num=%d\r\n",num);
}
}


5、测试结果。

   测试效果感觉不错,暂时未遇到传说中的按键串扰和不灵敏等现象。



  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YANGSAI123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值