MSP430程序设计求帮助

2019-03-24 09:31发布

来个大神看下。声明下:刚接触单片机,毫无基础。

想设计一个程序,基本原理是这样。

P1.0是LED1,P1.6是LED2,P1.3是按键(S2)
想实现的功能是这样,按一下S2按键,1亮2灭,再按一下1灭2亮。如此重复。
希望来个大神设计一个,并写好详细中文备注以学习。感激不尽、
注:单片机是MSP430G2553.
看了一些资料后,有几个想法
1.是不是需要用到按键消抖
2.LED1  2是不是要分开设计
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
michael_llh
1楼-- · 2019-03-24 19:13
< 需要用到按键消抖,如果这样子的话直接在while里面一直判断输入就可以了。
强仔00001
2楼-- · 2019-03-24 20:42
 精彩回答 2  元偷偷看……
mengxp
3楼-- · 2019-03-24 23:24
//由于用到了看门狗所以需要外接32768晶振

#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
    //唤醒PCU
    LPM0_EXIT;
}

void Sleep16ms(void)
{
    WDTCTL = WDT_ADLY_16;        //看门狗16ms
    LPM0;                //cpu睡眠等狗叫
    WDTCTL = WDTPW + WDTHOLD; //关狗
}

#define BUTTON_DOWN                !(P1IN & BIT3)
#define BUTTON_UP                (P1IN & BIT3)

int IsButtonDown(void)
{
    //检查按钮是否被按下 低电平按下
    if(BUTTON_DOWN)
    {
        //等待16ms
        Sleep16ms();
        if(BUTTON_DOWN)
        {
            //确实按下了
            return 1;
        }
    }
    return 0;
}

int IsButtonUp(void)
{
    //检查按钮是否抬起 高电平抬起
    if(BUTTON_UP)
    {
        //等待16ms
        Sleep16ms();
        if(BUTTON_UP)
        {
            //确实抬起了
            return 1;
        }
    }
    return 0;
}

//低电平LED亮,高电平LED灭
void ChangeLED()
{
    if(P1OUT & BIT0)
    {
        //1.0灭的,点亮他
        P1OUT &= ~BIT0;
        //熄灭1.6
        P1OUT |= BIT6;
    }
    else
    {
        //1.0亮的,熄灭他
        P1OUT |= BIT0;
        //点亮1.6
        P1OUT &= ~BIT6;
    }
}

int main()
{
    //先关闭看门狗
    WDTCTL = WDTPW + WDTHOLD;

    //配置GPIO
    P1DIR |= BIT0 | BIT6;        //P1.0 P1.6输出
    P1DIR &= ~BIT3;        //P1.3输入

    while(1)
    {
        //等待按键被按下
        if(IsButtonDown())
        {
            //灯切换
            ChangeLED();

            //等待按键抬起
            while(!IsButtonUp)
            {
                Sleep16ms();
            }
        }

        //睡16ms先
        Sleep16ms();
    }
}

被遗忘的尊严
4楼-- · 2019-03-25 02:05
mengxp 发表于 2015-11-4 17:32
//由于用到了看门狗所以需要外接32768晶振

#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void) ...

十分感谢

一周热门 更多>

相关问题

    相关文章