当前位置:文档之家› 单片机 电容触摸按键 报告

单片机 电容触摸按键 报告

任务: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]<FREQ_THRESHOLD[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<<Key_Num; //按键松开(错误代码)
TouchIN &=~(1<<Key_Num); //按键松开(正确代码)
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<<Key_Num; //按键按下(错误代码)
TouchIN |=1<<Key_Num; //按键按下
}
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
__interrupt void WDT_ISR(void)
{
WDT_Ontime();
}
void WDT_Ontime(void)
{ //-----首先必须定时扫描触摸按键检测函数-----
TouchIN_Dect();
if(TouchIN & BIT0) LED_ON;
if(TouchIN & BIT1) LED_OFF;
}
调试情况:
第一次调试:TouchIN_Dect函数重复定义
第二次调试:正常
调试结果:按下P2.0 后LED 亮,按下P2.5 后LED 灭,任务达成。

涉及知识点:
1、库函数头文件
2、电容触摸、用Timer_A 定时器测量电容振荡频率
3、WDT定时器
4、位操作、寄存器、中断。

相关主题