msp430单片机实现常按键和短按键加去抖功能

2018-07-11 20:54:54编辑:什么鱼 关键字:msp430  单片机  去抖功能

通过P1口的中断开启定时器,然后利用定时器中断不断扫描相应的端口状态,判断按键的

//定时器设置

void TimerA1Init()

{   

  _UINT  data = 0 ; 

  TA1CTL = data ;//clear all ,diaable interrupt , claer ifg 

  TA1CTL |= TASSEL__ACLK | ID_0 | TACLR  ;  // ACLK, stop mode, ,div:1 ,clear TAR  

  //TA0CTL |= MC__UP ;//启动定时器  

  TA1CCTL0 = CCIE ; //ccr0  比较中断允许 

  TA1CCR0 = 327 ;  //ccr0 compare mode , ie disable , ifg clear  

}


//P1端口中断程序

#pragma vector = PORT1_VECTOR

__interrupt void Port1ADISR( void )

  P1IFG &= 0x0f; 

  switch(P1IFG)

  {

    case Key_Sel:


      TA1CTL |= MC__UP;   //启动定时器

      Key_Tmp = Key_Sel; 


      break;

    case Key_Menu:


      TA1CTL |= MC__UP;   //启动定时器

      Key_Tmp = Key_Menu;


      break;

  }

  P1IFG &= 0x00;


}



/*********************************************************** 

函数名称:__interrupt void Timer_A1_Count (void) 

函数功能:

入口参数:无 

出口参数:无 

备   注: 

***********************************************************/

#pragma vector = TIMER1_A0_VECTOR

__interrupt void Timer_A1_Count(void)

{  

  static _UINT i = 0;

  _UBYTE P1_Value;

  P1_Value = P1IN;


  P1_Value &= 0x06;

  switch(Key_Tmp)

  {

  case Key_Menu:

    {

      if( (P1_Value & BIT2) == 0)    //按键按下

      {

        i++;

        if(i >= 300)   //常按键处理

        {


          BUZZER_ON;

          i = 0;


          //定时器停止

          TimerA1_Stop; 

        }

      }

      else if((P1_Value & BIT2) != 0)//按键释放

      {


        if( (i >= 5) && (i < 300) )  //短按键

        {


          LCD_B1_RT_ON;

          TimerA1_Stop;

          i= 0;

        }

        else

        {

          i = 0;  //否则认为是抖动;

        }

      }


      break;

    }

  case Key_Sel:

    {

      if( (P1_Value & BIT1) == 0)       //按键按下

      {

        i++;

      }

      else if( (P1_Value & BIT1) != 0)  //按键释放

      {


        if(i > 5)                       //短按键处理

        {

          LCD_B1_RT_OFF;

          TimerA1_Stop;

          i = 0;

        }

        else

        {

          i = 0;   //否则认为是抖动;

        }

      }


      break;

    }

  }

}


关键字:msp430  单片机  去抖功能

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news071140250.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430单片机理论复习知识点
下一篇:msp430f149单片机串口C程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430G2553电子时钟实验

用msp430g2553控制1602液晶显示时间,并可以通过按键设置时间,我做了正计时和倒计时两种模式/*********************************************************************msp430g2553与1602引脚连接情况* PIN1 --> 地* PIN2 --> VCC(一定要接+5V)* PIN3 -->仿真时悬空,实际电路 2K电阻-->地 (电阻可以是500-2k的,改变电阻可以改变字符显示的亮度,电阻接不好会导致什么都不显示)* PIN4 --> RS --> P1.6* PIN5 --> R/W -->
发表于 2018-07-14 20:42:53

msp430按键控制LED灯

#include "io430.h"/*       按键控制lLED灯的亮灭,有两种方法.       方法一:中断功能.                          方法二:利用 if(P4IN&BIT2)判断即可.       写代码时,尽量按照步骤来,避免因疏忽而浪费大量时间找bug.*/int main( void ){ 
发表于 2018-07-14 20:41:09

MSP430G2553 1602显示字符

代码:# include "msp430G2553.h"# define uchar unsigned char # define uint unsigned int # define LCD1602_RS_H  P2OUT|=BIT0# define LCD1602_RS_L  P2OUT&=~BIT0# define LCD1602_RW_H  P2OUT|=BIT1# define LCD1602_RW_L  P2OUT&=~BIT1# define LCD1602_EN_H  P2OUT|=BIT2# define LCD1602_EN_L
发表于 2018-07-14 20:40:26

MSP430G2553串口通讯 发送接收

数据发送代码:void UartPutchar(unsigned char c){while(!(IFG2 & UCA0TXIFG));  //待发送为空UCA0TXBUF=c;IFG2 &=~UCA0RXIFG;}只需要将那个buf变量的值改变即可接收数据#pragma vector=USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){while (!(IFG2&UCA0TXIFG));                // 等待发送完成//UCA0TXBUF
发表于 2018-07-14 20:33:37

MSP430按键控制串口发送数据

#include <msp430.h>//MSP430G2553  - 使用USCI_A0,Up Mode, DCO SMCLK////  介绍: 该程序利用USCI_A0来与计算机通信 通过接在P1.3口的按键来实现按一次发送一个数据//  波特率9600,数据格式8N1////  ACLK = 32768, SMCLK = 32768  MCLK =  DCO-16M////               MSP430G2553//        
发表于 2018-07-14 20:30:59

MSP430 - G2553之串口操作

#include <msp430.h> void delay1s(void) {  int t = 1000;  while (t--)    __delay_cycles(1000);    } #define UART_TXD 0x02                                  // TXD on P1.1 (Timer0_A.OUT0
发表于 2018-07-14 20:26:54

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved