单片机 电容触摸按键 报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任务:MSP-EXP430G2 板上P1.0 上接了一个LED,而在配套的LaunchPad 扩

展板上,将MSP430G2553 的P2.0 和P2.5 引出作为电容触摸按键。要求按下P2.0 后LED 亮,按下P2.5 后LED 灭,程序运行过程中不阻塞CPU,并且实现低功耗运行。

硬件连接:如图所示

程序代码:

TouchIN.c:

#include "MSP430G2553.h"

#define KEY_NUM 2 /*触摸按键数目,根据需要修改*/ //=============具体触摸按键IO宏定义,根据需要添加代码===============

#define KEY0_INIT P2DIR &= ~BIT0; P2SEL &= ~ BIT0; P2SEL2 |= BIT0 /*按键1开启振荡*/ #define KEY1_INIT P2DIR &= ~BIT5; P2SEL &= ~ BIT5; P2SEL2 |= BIT5 /*按键2开启振荡*/ #define ALL_OSC_OFF P2SEL2 &= ~(BIT0 + BIT5) /*关闭全部触摸振荡*/ /*门限频率的取值取决于定时扫描的时长,3300对应的是1.9ms定时情况,实际定时可取1ms~20ms*/

const unsigned int FREQ_THRESHOLD[KEY_NUM]={3300,3300}; /*参考值,需用仿真器查看后调整*/

//-----静态局部变量----

static unsigned int Freq[KEY_NUM]={0}; //当前测频值

static unsigned char Key_Buff[KEY_NUM][4]={0}; // 软件FIFO

static unsigned char Key_Num=0; //按键编号

//-----全局变量,复杂程序中可以移植到Global.h统一管理-----

unsigned char TouchIN=0; //相当于PxIN寄存器作用,支持8个触摸按键

void Key_Measure_Freq()

{

Freq[Key_Num]=TAR; //当前编号按键的频率被测得

ALL_OSC_OFF; //关闭所有振荡IO

Key_Num++; //切换下一振荡IO

if (Key_Num>=KEY_NUM) Key_Num=0; //各触摸按键循环交替

switch (Key_Num)

{

case 0 : KEY0_INIT; break; //振荡IO初始化

case 1 : KEY1_INIT; break;

default: break;

}

TA0CTL = TASSEL_3+MC_2+TACLR; //增计数清0,并开始计数

}

void Key_FIFO() //存储连续4次测量数据

{

Key_Buff[Key_Num][0]=Key_Buff[Key_Num][1];

Key_Buff[Key_Num][1]=Key_Buff[Key_Num][2];

Key_Buff[Key_Num][2]=Key_Buff[Key_Num][3];

if( Freq[Key_Num]

Key_Buff[Key_Num][3]=1;

else

Key_Buff[Key_Num][3]=0;

}

void Key_Judge() //按键仲裁,只有连续4次测量结果一致,才算数

{

if( (Key_Buff[Key_Num][0]==0)&&(Key_Buff[Key_Num][1]==0)

&&(Key_Buff[Key_Num][2]==0)&&(Key_Buff[Key_Num][3]==0) )

// TouchIN=0<

TouchIN &=~(1<

if( (Key_Buff[Key_Num][0]==1)&&(Key_Buff[Key_Num][1]==1)

&&(Key_Buff[Key_Num][2]==1)&&(Key_Buff[Key_Num][3]==1) )

// TouchIN =1<

TouchIN |=1<

}

void TouchIN_Dect() //触摸输入检测

{

Key_Measure_Freq(); //测频

Key_FIFO(); //软件FIFO缓存最近4次测量数据

Key_Judge(); //仲裁按键是否按下或松开

}

TouchIN.h:

/***** TouchIN.h******/

#ifndef TOUCHIN_H_

#define TOUCHIN_H_

extern void TouchIN_Dect() ; //WDT中断事件

extern unsigned char TouchIN; // 相当于PxIN寄存器作用,支持8个触摸按键#endif /* TOUCHIN_H_ */

main.c:

#include "MSP430G2553.h"

#include "TouchIN.h" /*触摸按键检测库函数*/

void WDT_Ontime(void);

//-----对硬件相关代码进行宏定义处理-----

#define LED_ON P1OUT |= BIT0 /*宏定义LED所在IO*/

#define LED_OFF P1OUT &= ~BIT0 /*宏定义LED所在IO*/

void main(void) {

WDTCTL = WDTPW+WDTHOLD; //关狗

//-----初始化GPIO-----

P1DIR |= BIT0; //LED所连IO口P1.0设为输出

P1OUT &= ~BIT0;

//-----初始化WDT定时中断为16ms-----

WDTCTL = WDT_ADLY_16; // “超级”宏定义

IE1 |= WDTIE; //使能WDT中断

_EINT(); // 使能总中断

__bis_SR_register(LPM3_bits); //等同LPM3

}

#pragma vector=WDT_VECTOR // Watch dog Timer interrupt service routine

相关文档
最新文档