单片机 MSP430 独立按键检测

可以不用while等待。

定义函数

#define CPU_F ( (double) 8000000)
#define delay_us( x )	__delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x )	__delay_cycles( (long) (CPU_F * (double) x / 1000.0) )


#define CO 1
#define SET 2
#define UP 3
#define DOWN 4
#define key_01 (P2IN&BIT5)
#define key_02 (P2IN&BIT4)
#define key_03 (P2IN&BIT3)
#define key_04 (P2IN&BIT2)

//初始化按键IO
void initKeyIO(void)
{
    P2DIR &= ~(BIT2 + BIT3 + BIT4 + BIT5); ///引脚方向
    P2REN |= (BIT2 + BIT3 + BIT4 + BIT5); //引脚上拉使能
    P2OUT |= (BIT2 + BIT3 + BIT4 + BIT5); //上拉
}
uchar last = 1;
//四个按键的检测函数
//有按键则返回1 2 3 4
//无按键则返回  0
unsigned char scanKey(void)
{

    if ((key_01 == 0 || key_02 == 0 || key_03 == 0 || key_04 == 0) && (last == 1))
    {
        delay_ms(10); //去抖动
        last = 0;
        if (key_01 == 0)
        {
            return 1;
        }
        else if (key_02 == 0)
        {

            return 2;
        }
        else if (key_03 == 0)
        {

            return 3;
        }
        else if (key_04 == 0)
        {

            return 4;
        }
    }
    if ((key_01) && (key_02))
    {
        if ((key_03) && (key_04))
            last = 1;
    }

    return 0;
}

使用:

int main(void)
{
   initSystemWdtAndIOAndClock();                  //8MHZ

    while (1)
    {
        delay_ms(10);

        keyValue = scanKey(); //检测按键
        if (keyValue != 0)
        {
            if (keyValue == CO)
            {
            }else if (keyValue == SET)
            {
            }else if (keyValue == UP )
            {
            }else if (keyValue == DOWN )
            {
            }
        }
    }
}
发布了105 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/104534036