一、前言
矩阵键盘 TTP229 是一种常见的电容触摸式键盘芯片,通常用于电子设备中的键盘输入控制。以下是关于 TTP229 的一些介绍:
1. **工作原理**:
- TTP229 是一种电容触摸式键盘控制芯片,通过检测触摸电容变化来实现按键检测。每个按键通常设置为一个电容触摸面,当用户触摸按键时,会改变对应电容的值,TTP229 通过检测这些值的变化来确定哪个按键被按下。
2. **特点**:
- **多通道**:TTP229 可以支持多达 16 个触摸通道,因此适合设计多按键的键盘或面板。
- **低功耗**:通常情况下,TTP229 在工作时的功耗较低,适合于需要长时间运行的电池供电设备。
- **简单接口**:通常通过串行接口(如 I2C 或 SPI)与主控芯片通信,易于集成到各种嵌入式系统中。
3. **应用**:
- **电子产品**:常见用于各种小型家电、消费电子产品的按键控制。
- **工业设备**:用于控制面板或设备操作界面的按键输入。
- **教育和DIY项目**:因其易用性和可靠性,经常被用于教育实验和DIY电子项目中。
4. **使用注意事项**:
- **环境干扰**:电容触摸技术受到环境干扰的影响较大,应尽量避免在强电磁场或静电干扰较多的环境中使用。
- **地线连接**:确保设备的地线连接良好,以保证按键触摸的准确性和稳定性。
总体来说,TTP229 是一种常用的电容触摸式键盘芯片,适合于需要简单而有效的触摸按键输入控制的各种应用场景。
二、资料获取
关注微信公众号--星之援工作室 发送关键字(TTP229)
网上开源的项目资料,可自行移植
➡️➡️
三、设备使用
接线
PB6 -> SCL
PB7 -> SDI
四、代码编写
main.c
实现函数调用
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "usmart.h"
#include "string.h"
#include "rtc.h"
#include "malloc.h"
#include <stdio.h>
#include "key.h"
#include "led.h"
#include "common.h"
#include "TTP229.h"
struct stuIoT stuAliOSIoT;
u8 USART1_TX_BUF[USART_REC_LEN]; //串口1,发送缓存区
__align(4) u8 dtbuf[50]; //打印缓存器
int main(void)
{
u8 t=0;
u8 key=0XFF;
int times = 0;
u16 nSecond = 0;
unsigned int NowHour,NowMinute,NowSecond;
u8 dtbuf[50]; //打印缓存器
memset(dtbuf,'�',50);
//初始化
//延时函数初始化
delay_init();
uart_init(115200); //串口1:Debug,初始化为115200
USART_RX_STA=0;
memset(USART_RX_BUF, 0, sizeof(USART_RX_BUF));
LED_Init();
Touch_Configuration();
while(RTC_Init()) //RTC初始化 ,一定要初始化成功
{
printf("RTC ERROR! nr");
delay_ms(800);
printf("RTC Trying...nr");
}
USART1_Send_String("System Init OK 20211201 rn");
//主循环
while(1)
{
times++;
if(t!=calendar.sec)
{
t=calendar.sec;
sprintf((char *)dtbuf,"%02d:%02d:%02d rn",calendar.hour,calendar.min,calendar.sec);
nSecond++;
}
key = Touch_KeyScan();
if(key!=0)
{
sprintf((char *)dtbuf,"TouchKey No.:%02d rn",key);
USART1_Send_String((char *)dtbuf);
//delay_ms(500);
}
}
}
TTP229.c
#include "TTP229.h"
#include "delay.h"
void Touch_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50Mhz速度
GPIO_Init(GPIOB, &GPIO_InitStructure);
SDA_OUT();
TTP_SDO = 0;
TTP_SCL = 0;
Touch_Read();
}
uint16_t Touch_Read2(void)
{
uint8_t i = 0;
uint16_t real_Value = 0;
SDA_OUT();
TTP_SDO = 1;
delay_us(100);
TTP_SDO = 0;
delay_us(20);
SDA_IN();
for (i = 0; i < 16; i ++)
{
TTP_SCL = 1;
delay_us(200);
TTP_SCL = 0;
if (TTP_SDI == 1)
{
real_Value |= (1 << i);
}
delay_us(200);
}
delay_ms(2);
return real_Value;
}
uint16_t Touch_Read(void)
{
uint8_t i = 0;
uint16_t real_Value = 0;
SDA_OUT();
TTP_SDO = 1;
delay_us(100);
TTP_SDO = 0;
delay_us(20);
SDA_IN();
for (i = 0; i < 16; i ++)
{
TTP_SCL = 1;
delay_us(100);
TTP_SCL = 0;
delay_us(1);
if (TTP_SDI == 1)
{
real_Value |= (1 << i);
}
}
delay_ms(2);
return real_Value;
}
uint16_t Previous = 0;
uint16_t Current = 0;
uint8_t Touch_KeyScan(void)
{
uint8_t key = 0;
Current = Touch_Read();
if ((Current & 0x0001) && !(Previous & 0x0001))
{
key = 1;
}
else if ((Current & 0x0002) && !(Previous & 0x0002))
{
key = 2;
}
else if ((Current & 0x0004) && !(Previous & 0x0004))
{
key = 3;
}
else if ((Current & 0x0008) && !(Previous & 0x0008))
{
key = 4;
}
else if ((Current & 0x0010) && !(Previous & 0x0010))
{
key = 5;
}
else if ((Current & 0x0020) && !(Previous & 0x0020))
{
key = 6;
}
else if ((Current & 0x0040) && !(Previous & 0x0040))
{
key = 7;
}
else if ((Current & 0x0080) && !(Previous & 0x0080))
{
key = 8;
}
else if ((Current & 0x0100) && !(Previous & 0x0100))
{
key = 9;
}
else if ((Current & 0x0200) && !(Previous & 0x0200))
{
key = 10;
}
else if ((Current & 0x0400) && !(Previous & 0x0400))
{
key = 11;
}
else if ((Current & 0x0800) && !(Previous & 0x0800))
{
key = 12;
}
else if ((Current & 0x1000) && !(Previous & 0x1000))
{
key = 13;
}
else if ((Current & 0x2000) && !(Previous & 0x2000))
{
key = 14;
}
else if ((Current & 0x4000) && !(Previous & 0x4000))
{
key = 15;
}
else if ((Current & 0x8000) && !(Previous & 0x8000))
{
key = 16;
}
Previous = Current;
return key;
}
TTP229.h
#ifndef __TTP229_H__
#define __TTP229_H__
#include "sys.h"
//#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<8;}
//#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<8;}
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X80000000;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;}
#define TTP_SCL PBout(6)
#define TTP_SDO PBout(7)
#define TTP_SDI PBin(7)
extern uint16_t Touch_Read(void);
extern uint16_t Touch_Read2(void);
extern void Touch_Configuration(void);
extern uint8_t Touch_KeyScan(void);
#endif
五、参考
物联网毕设 -- 智能门禁系统(STM32+人脸+RFID+密码+APP+WIFI)https://blog.csdn.net/herui_2/article/details/139135120?spm=1001.2014.3001.5501
联系方式 微信号:13648103287