IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM8L系列单片机驱动BS818A-2触摸按键(串行输出源码) -> 正文阅读

[嵌入式]基于STM8L系列单片机驱动BS818A-2触摸按键(串行输出源码)

? ? 一、BS81X系列芯片简介??
??BS81x 系列芯片具有 2~16 个触摸按键, 可用来检测外部触摸按键上人手的触摸动 作。该系列的芯片具有较高的集成度,仅 需极少的外部组件便可实现触摸按键的检 测。
????????BS81x 系列提供了串行及并行输出功能, 可方便与外部 MCU 之间的通讯,实现设 备安装及触摸引脚监测目的。芯片内部采 用特殊的集成电路,具有高电源电压抑制 比,可减少按键检测错误的发生,此特性 保证在不利环境条件的应用中芯片仍具有 很高的可靠性。
????????此系列的触摸芯片具有自动校准功能,低 待机电流,抗电压波动等特性,为各种触 摸按键的应用提供了一种简单而又有效的 实现方法。
????????该系列芯片特性大多都相同,BS8112A-3/BS8116A-3 具有 IIC 功能, BS814A-2/BS818A-2
SPI 串 口 功 能, BS812A-1/BS813A-1/BS814A-1/BS816A-1 具 并 行 输 出 功 能。 同 时
BS8112A-3/BS8116A-3 可通过 IIC 设置 Option 和感度, BS816A-1/BS818A-2 则提供两个硬
Option ,增加应用上的弹性。
二、BS818A-2应用
2.1 BS818A-2触摸芯片的工作原理
????????BS814A-2 和 BS818A-2 配 备 有 一 个 串 行 接口,允许与外部设备进行简单的通讯。 当触摸芯片侦测到触摸键被按下时,会在 Data 脚输出低电位,可唤醒主机,主机在 接收到低电位后,由 Clock 脚输出时钟信 号,并从 Data 脚回读按键值。 当在 Clock 脚输入低电位时,触摸芯片准
备数据, Clock 脚送出高电位后,主机从 Data 线读取数据。每次读取数据以 8 个时 钟信号一组。也可用轮询的方式直接读取 键值,不必等待 Start 位。 当数据读取错误时,需等 6ms 左右 , 才能
再重新读取一次。
8-key 数据结构
Clock 引脚接收到时钟信号,触摸芯片将会产生一个 16 位的数据字节,并从 Data 引脚
移出。其中 Bit11~Bit8 产生校验和,用来表示被触摸按键的总数。例如校验和为“ 0010 ”,
这意味着有两个键被触摸。至于是哪个按键被触摸,可以查看 Bit7~Bit0 位状态。 Bit7~Bit0
用于指示相应的触摸按键 Key8~Key1 是否被触摸。若为零则表明相应的按键被触摸,若为
1 ,则表明相应按键未被触摸。
Start bit :当按键状态改变时 , Data 脚送出低电位,唤醒主机,主机读取键值
Bit0 Key1 状态 (0= 按键, 1= 松键 )
Bit1 Key2 状态 (0= 按键, 1= 松键 )
Bit2 Key3 状态 (0= 按键, 1= 松键 )
Bit3 Key4 状态 (0= 按键, 1= 松键 )
Bit4 Key5 状态 (0= 按键, 1= 松键 )
Bit5 Key6 状态 (0= 按键, 1= 松键 )
Bit6 Key7 状态 (0= 按键, 1= 松键 )
Bit7 Key8 状态 (0= 按键, 1= 松键 )
Bit11~8 :核对总数 -- 0 ”的总数 , 即被触摸按键的总数。
Bit15~Bit12 :停止位,永远为 “ 1010B

?三 、STM8L系列单片机驱动BS818A-2触摸芯片(串行输出源码)

//**********************************************************************************
//Copyright ?= ""
//FileName ? = "头文件定义"
//Date ? ? ? = "2021-06-30"
//Creator ? ?= ""
//Verson ? ? = "V1.0.0"
//**********************************************************************************

#ifndef __API_BS818A_H
#define __API_BS818A_H

#define SDA_PORT ?GPIOC ? ? //SDA
#define SDA_PIN ? GPIO_Pin_0
#define SDA_CHECK (GPIO_ReadInputDataBit(SDA_PORT,SDA_PIN))
#define SDA_INPUT (GPIO_Init(SDA_PORT,SDA_PIN,GPIO_Mode_In_PU_No_IT))

#define SCL_PORT ? GPIOC? ? ??
#define SCL_PIN ? ?GPIO_Pin_1
#define SCL_ON ? ? (GPIO_SetBits(SCL_PORT,SCL_PIN))
#define SCL_OFF ? ?(GPIO_ResetBits(SCL_PORT,SCL_PIN))
#define SCL_INPUT ?(GPIO_Init(SDA_PORT,SDA_PIN,GPIO_Mode_In_PU_No_IT))
#define SCL_OUTPUT (GPIO_Init(SCL_PORT,SCL_PIN,GPIO_Mode_Out_PP_High_Slow))

void Bs818a_Init(void);
u16 Bs818a_Read (void);
void Delay_us(uint16_t cnt);
void Delay_ms(uint16_t cnt);

//**********************************************************************************
//Copyright ?= ""
//FileName ? = "BS818A-2相关函数"
//Date ? ? ? = "2021-06-30"
//Creator ? ?= ""
//Verson ? ? = "V1.0.0"
//**********************************************************************************

#include "api_bs818a.h"

u16 Key_Value;
u8 TouchNum;
u8 KEY_DATA;

//**********************************************************************************
//Name:void Bs818a_Init(void)
//Describe:BS818A初始化
//Date:
//Verson:
//Input:
//Output:
//*********************************************************************************
void Bs818a_Init(void)
{
?? ?SDA_INPUT; ?//低电平有效 ? SDA初始化?? ?
?? ?SCL_INPUT;?? ?//高电平读出数据 SCL初始化?? ?
}

//**********************************************************************************
//Name:u16 u16 Bs818a_Read (void)
//Describe:读取BS818A的键值 10MS读取一次
//Date:
//Verson:
//Input:
//Output:
//*********************************************************************************
u16 Bs818a_Read (void)
{
?? ?u8 i;
?? ?if(SDA_CHECK == 0)
?? ?{
? ? ? ? Delay_ms(10);
? ? ? ? Key_Value = 0;
?? ??? ?SCL_OUTPUT;
?? ??? ?SCL_ON;
?? ??? ?Delay_us(30);?? ?
? ? ?? ?for(i=0;i<16;i++)
? ? ?? ?{
? ? ? ? ? ? Key_Value>>=1;
?? ??? ??? ?SDA_INPUT;
?? ??? ??? ?SCL_OFF;
?? ??? ??? ?Delay_us(30);
?? ??? ??? ?SCL_ON;
?? ??? ??? ?if(SDA_CHECK)
?? ??? ??? ?{
?? ??? ??? ??? ?Key_Value|=1<<15;?
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{

?????????????????if(i<8)TouchNum++;? ?//客户如果用到了按键计数,这句需要加
?? ??? ??? ?} ? ? ? ? ? ? ? ? ? ? ?
?? ??? ??? ?Delay_us(30);
? ? ?? ?}

? ? ? ? // 下面这段根据需要添加,我只用Key_Value,所以这一段我没有用,直接返回Key_Vakue

if(((Key_Value & 0x0F00) == 0x0800) && TouchNum == 8) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0700) && TouchNum == 7) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0600) && TouchNum == 6) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0500) && TouchNum == 5) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0400) && TouchNum == 4) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0300) && TouchNum == 3) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0200) && TouchNum == 2) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0100) && TouchNum == 1) {_LED = 1;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}
????????else if(((Key_Value & 0x0F00) == 0x0000) && TouchNum == 0) {_LED = 0;KEY_DATA = ????????(read_data&0xFF) ^ 0xFF;}

// 到这为止
?? ?}
?? ?else
?? ?{
?? ??? ?Key_Value = 0;
?? ??? ?SDA_INPUT; ?//低电平有效 ? SDA初始化?? ?
?? ??? ?SCL_INPUT;?? ?//高电平读出数据 SCL初始化?? ??? ??? ?
?? ?}
?? ?return Key_Value;
}

//下面两个延时根据使用的时钟决定,我使用了HSI(内部高速时钟)

void Delay_us(uint16_t cnt)
{
?? ?if(0 == cnt)
?? ??? ?cnt = 1;

?? ?while(cnt--)
?? ?{
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ??? ?nop();
?? ?}
}

void Delay_ms(uint16_t cnt)
{
?? ?if(0 == cnt)
?? ??? ?cnt = 1;

?? ?while(cnt--)
?? ??? ?Delay_us(1000);
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:37:47  更:2021-07-13 17:39:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 22:23:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码