单片机 电容触摸按键 报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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