完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在淘宝上买了一个TTP229 16路触摸式电容开管,如图所示,芯片是28脚的,但提供的资料是48脚芯片的资料,网上也没找到这种28脚的资料及程序,所以写程序时无法确定控制方式,希望有玩过的朋友帮助下
|
|
相关推荐
15个回答
|
|
#define KeyShortTime 10
#define KeyLongTime 150 /************************************ **按键IO口初始化程序 ************************************/ void Init_Keyboard(void) { GPIO_InitTypeDef GPIO_InitStructure; //触摸按键输入--TTP229(PB12--SDA, PB5--SCL) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_Init(GPIOB, &GPIO_InitStructure); } ErrorStatus I2C_Start(void) //I2C开始位 { SDA_H; SCL_H; delay_us(5); if(!SDA_read) return ERROR; //SDA线为低电平则总线忙,退出 SDA_L; delay_us(5); if(SDA_read) return ERROR; //SDA线为高电平则总线出错,退出 SDA_L; //SCL为高电平时,SDA的下降沿表示停止位 delay_us(5); return SUCCESS; } void I2C_Stop(void) //I2C停止位 { SCL_L; delay_us(5); SDA_L; delay_us(5); SCL_H; delay_us(5); SDA_H; //SCL为高电平时,SDA的上升沿表示停止位 delay_us(5); } static void I2C_Ack(void) //I2C响应位 { SCL_L; delay_us(5); SDA_L; delay_us(5); SCL_H; delay_us(5); SCL_L; delay_us(5); } static void I2C_NoAck(void) //I2C非响应位 { SCL_L; delay_us(5); SDA_H; delay_us(5); SCL_H; delay_us(5); SCL_L; delay_us(5); } ErrorStatus I2C_WaitAck(void) //I2C等待应答位 { SCL_L; delay_us(5); SDA_H; delay_us(5); SCL_H; delay_us(5); if(SDA_read) { SCL_L; return ERROR; } SCL_L; return SUCCESS; } /******************************************************************************* * Function Name : I2C_SendByte * Description : 数据从高位到低位 * Input : - SendByte: 发送的数据 * Output : None * Return : None *******************************************************************************/ void I2C_SendByte(u8 SendByte) { u8 i; for(i=0; i<8; i++) { SCL_L; delay_us(5); if(SendByte & 0x80) SDA_H; //在SCL为低电平时,允许SDA数据改变 else SDA_L; SendByte <<= 1; delay_us(5); SCL_H; delay_us(5); } SCL_L; } /******************************************************************************* * Function Name : I2C_ReceiveByte * Description : 数据从高位到低位 * Input : None * Output : None * Return : I2C总线返回的数据 *******************************************************************************/ u8 I2C_ReceiveByte(void) { u8 i,ReceiveByte = 0; SDA_H; for(i=0; i<8; i++) { ReceiveByte <<= 1; SCL_L; delay_us(5); SCL_H; delay_us(5); if(SDA_read) //在SCL为高电平时,SDA上的数据保持不变,可以读回来 { ReceiveByte |= 0x01; } } SCL_L; return ReceiveByte; } /******************************************************************************* * Function Name : I2C_WriteByte * Description : 写一字节数据 * Input : - SendByte: 待写入数据 * - WriteAddress: 待写入地址 * - DeviceAddress: 器件类型 * Output : None * Return : 返回为:=1成功写入,=0失败 *******************************************************************************/ ErrorStatus I2C_WriteByte(u8 SendByte, u16 WriteAddress, u8 DeviceAddress) { if(!I2C_Start()) return ERROR; I2C_SendByte(((WriteAddress & 0x0700) >>7) | DeviceAddress & 0xFFFE); //设置高起始地址+器件地址 if(!I2C_WaitAck()) { I2C_Stop(); return ERROR; } I2C_SendByte((u8)(WriteAddress & 0x00FF)); //设置低起始地址 I2C_WaitAck(); I2C_SendByte(SendByte); I2C_WaitAck(); I2C_Stop(); delay_ms(5); //注意:因为这里要等待EEPROM写完,可以采用查询或延时方式(10ms) return SUCCESS; } /******************************************************************************* * Function Name : I2C_ReadByte * Description : 读取一串数据 * Input : - pBuffer: 存放读出数据 * - length: 待读出长度 * - ReadAddress: 待读出地址 * - DeviceAddress: 器件类型 * Output : None * Return : 返回为:=1成功读入,=0失败 *******************************************************************************/ ErrorStatus I2C_ReadByte(u8* pBuffer, u16 length, u16 ReadAddress, u8 DeviceAddress) { if(!I2C_Start()) return ERROR; I2C_SendByte(((ReadAddress & 0x0700) >> 7) | DeviceAddress & 0xFFFE); //设置高起始地址+器件地址 if(!I2C_WaitAck()) { I2C_Stop(); return ERROR; } I2C_SendByte((u8)(ReadAddress & 0x00FF)); //设置低起始地址 I2C_WaitAck(); I2C_Start(); I2C_SendByte(((ReadAddress & 0x0700) >>7) | DeviceAddress | 0x0001); I2C_WaitAck(); while(length) { *pBuffer = I2C_ReceiveByte(); if(length == 1) I2C_NoAck(); else I2C_Ack(); pBuffer++; length--; } I2C_Stop(); return SUCCESS; } ///************************************ //**按键检测函数 //**增加软件去抖,以降低灵敏度 //************************************/ u8 Key_Scan(void) { unsigned char Key = ' '; unsigned short Tmp; static unsigned short OldTmp; static unsigned short LongTime = 0; if(I2C_Start() == ERROR) return ' '; I2C_SendByte(0xaf); //设置高起始地址+器件地址 if(I2C_WaitAck() == ERROR) { I2C_Stop(); return ' '; } Tmp = (u16)I2C_ReceiveByte()<<8; I2C_Ack(); Tmp |= I2C_ReceiveByte(); I2C_NoAck(); I2C_Stop(); if(Tmp == OldTmp) { if(Tmp == 0) { LongTime = 0; } else if(LongTime < 0xffff) { LongTime++; } switch(Tmp) { case 0x8000://TP0--NUMBER 3 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '3'; } }break; case 0x4000://TP1--NUMBER 4 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '4'; } }break; case 0x2000://TP2--NUMBER 5 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '5'; } }break; case 0x1000://TP3--NUMBER 6 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '6'; } }break; case 0x0800://TP4--NUMBER 7 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '7'; } }break; case 0x0400://TP5--NUMBER 8 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '8'; } }break; case 0x0200://TP6--NUMBER 9 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '9'; } }break; case 0x0100://TP7--NUMBER 0 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '0'; } }break; case 0x0080://TP8--ENTER { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = 'B'; } }break; case 0x0040://TP9--DOWN { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = 'A'; } }break; case 0x0020://TP10--RIGHT { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = 'C'; } }break; case 0x0010://TP11--CANCEL { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = 'D'; } else if(LongTime == KeyLongTime) { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(300); } Buzzer_OFF; Key = 'E'; } }break; case 0x0008://TP12--NUMBER 1 { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '1'; } }break; case 0x0004://TP13--NUMBER 2; { if(LongTime == KeyShortTime)//短按 { if(GetBuzzerSwitch() != RESET) { Buzzer_ON; delay_ms(50); } Buzzer_OFF; Key = '2'; } }break; default: { Key = ' '; }break; } } else { OldTmp = Tmp; LongTime = 0; } return Key; } |
|
|
|
同问,淘宝都给程序的啊
|
|
|
|
淘宝商家没给资料吗??
|
|
|
|
一般51程序,修改下通信接口就可以了orz
|
|
|
|
不懂帮顶的路过
|
|
|
|
同样不懂帮顶的路过
|
|
|
|
你这是用IIC的协议,但我看板子上没有预留IIC接口的SDA,只有串口的SDO,你这程序我也试了,不行,能否发个完整的程序了?或者你有这芯片28脚的资料吗?店家给的是48脚的 |
|
|
|
|
|
|
|
|
|
|
|
不是有SCL和SDO吗?I2C 是2线的。
|
|
|
|
tangxi123 发表于 2018-11-13 19:44 程序是完整的,而且这个芯片已经用在产品上了。 |
|
|
|
想问下,我只想用12个键,3x4模式,TP3,TP7,TP11,TP15这几个引脚悬空可以吗 |
|
|
|
向淘宝商家要资料,
|
|
|
|
|
|
|
|
该芯片不带自锁,快速按键时,SDO输出的数据既不是之前按键数据,也不是当下按键数值,
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 08:09 , Processed in 0.799383 second(s), Total 72, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号