打印
[ARM入门]

【STM8入门】14讲 STM8 触摸开关检测

[复制链接]
1562|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刘洋讲单片机|  楼主 | 2016-11-21 10:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 刘洋讲单片机 于 2017-1-11 15:43 编辑

第14讲.触摸键盘检测.zip (366.06 KB)

众拳【剑齿虎STM8】开发板学习笔记分享
点击此处查看全部资料
第14讲   触摸开关检测

目 录
14.1触摸芯片TTP223        2
14.1.1  TTP223芯片特点        3
14.1.2  输出模式        3
14.2剑齿虎开发板集成触摸开关        4
14.2.1开发板自定义触摸开关原理图        4
14.2.2触摸开关检测方法        5
14.3程序文件设计        5
14.3.1  lib文件中内容分析        5
14.3.2  main.c文件中的程序        6
14.3.3  key.c文件中的程序        8
14.3.4  key.h文件中的程序        9

14.1触摸芯片TTP223   
TTP223是触摸键检测IC,提供1个触摸键。触摸检测IC是为了用可变面积的键取代传统的按钮键而设计的。低功耗和宽工作电压是触摸键的DC和AC特点。
14.1.1  TTP223芯片特点
 工作电压 2.0V~5.5V
工作电流 @VDD=3V,无负载,SLRFTB=1;低功耗模式下典型值1.5uA,最大值3.0uA;快速模式下典型值3.5uA,最大值7.0uA
最长响应时间大约为快速模式下60mS,低功耗模式下220mS @VDD=3V
灵敏度可由外部电容(0~50pF)调节
由选择管脚(SLRFTB管脚)提供两个采样长度的选
由选择管脚(LPMB管脚)提供快速模式和低功耗模式的选择
由选择管脚(TOG管脚)提供直接模式、触发模式的选择
各输出模式都可通过选择管脚(AHLB管脚)选择高电平或者低电平有
由选择管脚(MOTB管脚)提供100sec最长输出时间选择
上电之后需要约0.5sec的稳定时间,此时间段内不要对键进行触摸,此时所有功能都被禁止
始终进行自校准,当键没被触摸时,重校准周期约为4.0sec
14.1.2  输出模式
TTP223 由 AHLB 管脚选择直接模式的高电平或者低电平有效。由TOG管脚选择输出模式。另外还可同时选择漏极开路模式。管脚Q为数位输出,管脚OPDO为漏极开路(Open Drain)输出。

表14.1  输出模式配置
TOG        AHLB        管脚Q功能选择        管脚OPDO功能选择
0        0        直接模式,高电平有效 CMOS 输出        直接模式,高电平有效漏极开路(Open Drain)输出
0        1        直接模式,低电平有效 CMOS 输出        直接模式,低电平有效漏极开路(Open Drain)输出
1        0        触发模式,上电状态为 0        触发模式,上电状态为高阻,高电平有效
1        1        触发模式,上电状态为 1        触发模式,
上电状态为高阻,低电平有效
    我们在硬件原理设计中,“TOG”通过电阻接地,在硬件上固定“TOG”是逻辑“0”;“AHLB”通过电阻接电源,在硬件上固定“AHLB”是逻辑“1”。对应到表14.1中是“直接模式,低电平有效 CMOS 输出”。
14.2剑齿虎开发板集成触摸开关
剑齿虎开发板集成了一个独立的电容触摸开关。它不和其它集成的功能有冲突和共用控制管脚的问题,这个触摸开关由PE3管脚控制,用户可以根据自己的需要设计这个独立微动开关的使用功能。
14.2.1开发板自定义触摸开关原理图

图14.1触摸开关原理图
14.2.2触摸开关检测方法
在原理图中看一看出,输出端Q直接和PE管脚连接,没有上拉电阻,在程序中要配置成“上拉输入无中断功能”。
在这里我们对触摸开关进行扫描检测,其过程是:扫描——判断触摸发生——消抖——判断触摸发生——处理过程。
14.3程序文件设计
14.3.1  lib文件中内容分析
我们建立一个“Lib”文件夹,把引用系统本身定义好的库函数加在其中,我们使用到哪个外设功能,直接引用到此文件夹中即可。一般情况下下面这三个文件都得引用。   

图14.2  stm8s_conf.h头文件内部选择
本节实验及以后的实验我们都是用到库文件,其中 stm8s_conf.h头文件包含了所有外设的声明头文件,在本试验中我们使用到时钟外设和GPIO端口外设。所以#include "stm8s_clk.h"和#include "stm8s_gpio.h"需要“打开”(就是把语句前面的双斜线注释符号删除即可,参考图14.2)。Stm8s_gpio.c库函数包含了所有管脚初始化功能和具体的执行操作;Stm8s_clk.c库函数主要包含了内部时钟和外部时钟设置,在主函数中规定了具体的执行方法,在这个函数中就有具体相关的执行步骤。
14.3.2  main.c文件中的程序
主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。详情请大家参考光盘(网盘)中程序及程序注释。
/***********************************************************************
*   说    明: 触摸键盘检测
*   开发平台: 【众拳】剑齿虎STM8开发板        
*
*   作    者: 刘洋 张殿东
*   版    本: V1.0
*   日    期: 2016-05-03   
*
*   IAR开发环境    版本 V2.20.1
*   ST库函数       版本 V2.2.0
***********************************************************************/
#include "pbdata.h"//引入自定义公共头文件
void BSP_Configuration(void);//硬件初始化函数声明
/***********************************************************************
*   函 数 名: main
*   功能说明: c程序入口
*   形    参:无
*   返 回 值: 错误代码(无需处理)
***********************************************************************/
int main(void)
{
  BSP_Configuration();//硬件驱动初始化函数
  
  while(1)//主程序循环,反复执行循环体里的语句
  {
       KEY_Demo();   //在主程序中调用KEY_Demo()函数
   
  }
}
/***********************************************************************
*   函 数 名: BSP_Configuration
*   功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
*   形    参:无
*   返 回 值: 无
***********************************************************************/
void BSP_Configuration(void)
{  
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频,
  LED_Init();//调用LED初始化函数
  JDQ_Init();//调用继电器初始化函数
  KEY_Init();//调用KEY键盘初始化函数
}
/*断言函数:它的作用是在编程的过程中为程序提供参数检查*/
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file,u32 line)
{
  while(1)
  {
  }
}
#endif
14.3.3  key.c文件中的程序
#include "pbdata.h"
/***************************************************************************
*   函 数 名: KEY_Init
*   功能说明: KEY的GPIO管脚初始化
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void KEY_Init(void)
{
   GPIO_Init(TOUCH_PORT, TOUCH_PIN, GPIO_MODE_IN_PU_NO_IT);//初始化触摸键盘管脚上拉输入无中断功能
}
/***************************************************************************
*   函 数 名: KEY_Down
*   功能说明: 键盘检测消抖动
*   形    参:GPIO_TypeDef* GPIOx  输入要检测的端口
*             GPIO_Pin_TypeDef GPIO_Pin  输入要检测的引脚
*   返 回 值: 布尔类型 (true 按下,flase 弹起)
***************************************************************************/
bool KEY_Down(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
  //检测是否有按键按下
  if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//是否为低电平,低电平按下,高电平弹起
  {   
    delay_ms(20);//延时20毫秒消抖
    if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)//再一次检测键盘是否有按下
    {
      //低电平为真(等待)   高电平为假(退出WHILE循环)
      while(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0);
      return true;//函数返回真
    }
  }
  return false;//函数返回假
}
/***************************************************************************
*   函 数 名: KEY_Demo
*   功能说明: 键盘输入检测
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void KEY_Demo(void)
{
    if(KEY_Down(TOUCH_PORT, TOUCH_PIN)==true)//判断TOUCH触摸键盘是否被按下,如果按下将执行下面的语句,否则退出函数。
    {
        JDQ_R;//PG7引脚电平取反,高电平时继电器(断开),底电平时继电器(吸合)
    }
}
14.3.4  key.h文件中的程序
/***********************************************************************
*    剑齿虎STM8开发板硬件连接
*         
*    TOUCH引脚定义  TOUCH-PE3         
************************************************************************/

#ifndef _KEY_H
#define _KEY_H
/*---------------------------头文件引用--------------------------------------*/
#include "stm8s.h"//引用STM8头文件

/*---------------------------宏定义声明--------------------------------------*/
#define TOUCH_PIN GPIO_PIN_3//定义GPIO_PIN_3引脚为TOUCH_PIN,相当于重新命名。
#define TOUCH_PORT GPIOE    //定义GPIOE端口为TOUCH_PORT,相当于重新命名。

//如果想用其他管脚检测KEY键盘,那么只需更改上面对应的端口与引脚编号即可

/*---------------------------函数声明--------------------------------------*/
void KEY_Init(void);//KEY初始化函数
bool KEY_Down(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin);//KEY键盘检测消斗函数
void KEY_Demo(void);//KEY键盘检测实验函数
#endif //定义文件名称结束


在这里我们对程序的主要部分做了详细的说明,如果想了解全部程序,请使用IAR软件打开我们的第14讲触摸键盘检测程序(位置以光盘内容为主)。


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

499

帖子

67

粉丝