发新帖我要提问
12
返回列表
打印

用按键控制LED

[复制链接]
楼主: zhaoxqi
手机看帖
扫描二维码
随时随地手机跟帖
21
uptown| | 2016-1-31 22:01 | 只看该作者 回帖奖励 |倒序浏览
直接IO口按键检处理

使用特权

评论回复
22
cehuafan| | 2016-1-31 22:02 | 只看该作者
做一个按键中断程序

使用特权

评论回复
23
10299823| | 2016-1-31 22:03 | 只看该作者
利用状态机进行按键检测

使用特权

评论回复
24
10299823| | 2016-1-31 22:04 | 只看该作者
//原始状态P1.6亮,P1.0暗,利用状态机进行按键检测,短按键情况下并释放的瞬间P1.0翻转,P1.6翻转
//长按键P1.0,P1.6按照10Hz的频率闪烁
//                MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//        P1.3|KEY          P1.6|-->LED
//            |             P1.0|-->LED
// 作者http://jiwm.blog.163.com
//   Built with  IAR Embedded Workbench Version: 5.40
//******************************************************************************
#include "msp430g2553.h"
#define NOKEY 0   //未按下状态
#define PUSH_KEY 1 //短按状态
#define LONG_KEY 2 //长按状态
unsigned char KEY=0; //按键状态处理
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗
  BCSCTL1= CALBC1_1MHZ;        //1M内部时钟
  DCOCTL = CALDCO_1MHZ;   
  P1DIR |=BIT6+BIT0;              // 设置 P1.6,P1.0为输出
  P1OUT|=BIT0;           //设置初值,P1.0亮
  P1OUT&=~BIT6;          //设置初值,P1.6不亮
  P1REN|=BIT3;                    //配置上拉电阻
  TACCTL0 |= CCIE;                             // CCR0 interrupt enabled
  TACCR0 =2500;  //计到2.5K,约20ms
  TACTL = TASSEL_2+ID_3+MC_1+TACLR;                //设置TIMERA的时钟源为SMCLK(1M),8分频后(125K),计数模式为up,到CCR0再自动从0开始计数
   _BIS_SR(GIE);              //开总中断
     TACCTL0 |= CCIE;                             // CCR0 interrupt enabled
while(1)
  {
    switch(KEY)            //按键动作
   { case 1:   //短按状态时进行按键处理
     {P1OUT^=BIT0;  //翻转
      P1OUT^=BIT6;  //翻转
      KEY=0;}
      break;
    case 2:   //长按初始状态
    {P1OUT|=BIT0;           //设置初值,P1.0亮
     P1OUT|=BIT6;          //设置初值,P1.6亮
     KEY=0;}
     break;  //必须要,需要退出循环
    case 3:   //长按状态时进行按键处理
    {P1OUT^=BIT0;  //翻转
     P1OUT^=BIT6;  //翻转
     KEY=0;}
      break;
     }
   }
}

/************************************************
定时中断响应

使用特权

评论回复
25
10299823| | 2016-1-31 22:05 | 只看该作者
*************************************************/
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)  

   { //TACCTL0&=~ CCIE; //关中断
     static  unsigned char KEY_State=0; //按键的状态变量
     static  unsigned char i,j=0;   //计数,用于处理时间
   switch(KEY_State)            //处理按键状态
   {case NOKEY:   //未按键时进行按键处理
    if ((P1IN&BIT3)==0)
     {KEY_State=PUSH_KEY;  //按下按键后,进入短按状态
      }
      break;  //必须要,需要退出循环
   case PUSH_KEY:   //短按状态时进行按键处理
     if((P1IN&BIT3)!=0)   //释放按键,认为是一次短按,加以处理
     {  KEY=1;  //按键赋值
     KEY_State=NOKEY;  //回到未按状态
     }
      else
      {
       if (i<100)
       { //KEY=0;  //KEY返回0,接收下一次数据
            i++;              //计数,以实现长按键,约2秒
        }
         else
         {
          i=0;
          KEY=2;  //输出长按初始状态
          KEY_State=LONG_KEY;  //长按状态
         }
      }
     break;
     
    case LONG_KEY:   //长按状态时进行按键处理
     if((P1IN&BIT3)!=0)   //释放按键,退出
     {  KEY=0;  //按键赋值
     KEY_State=NOKEY;  //回到未按状态
     }
     else
     {
      if (j<5)
       {
            j++;              //计数,以实现长按键状态计时,约0.1秒
        }
         else
         {j=0;   //重新计数
          KEY=3;  //长按状态的处理
         }
      }
     break;
  
    }
    TACCTL0|= CCIE;  //开中断
   }

使用特权

评论回复
26
cehuafan| | 2016-1-31 22:05 | 只看该作者
单片机常用输入键盘的设计、LED 静态显示

使用特权

评论回复
27
uptown| | 2016-1-31 22:05 | 只看该作者
按键切换

使用特权

评论回复
28
xiaoyaozt| | 2016-1-31 22:05 | 只看该作者
MSP430G2553单片机作为控制核心

使用特权

评论回复
29
lihuami| | 2016-1-31 22:05 | 只看该作者
MSP430用按键中断控制定时器产生持续 1s 的周期信号

使用特权

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

本版积分规则