第七节 独立按键之中断方式

第七节  独立按键之中断方式

 复制Key工程,重命名为KeyInterrupt。刚刚我们用查询的方式读取按键的状态。但是这种方式在实际的工程中没有实际的应用价值,下面我们采用外部中断的方式来读取按键的状态,每当按键按下时就会触发一次外部中断。为了P0.0口能够触发中断,我们需要进行如下配置:
    P0IEN |= 0X01;  // P00 设置为中断方式
    PICTL &=~ 0X01; // 下降沿触发
    IEN1 |= 0X20;   // 允许P0口中断
    P0IFG = 0x00;   // 清除中断标志位
    EA = 1;         // 开总中断

然后就需要编写中断服务函数了。这里注意一点,在IAR中的中断函数有点特殊,格式为:
#pragma vector = 中断向量
__interrupt 函数

所以我们的中断函数为:
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
    if(0x01&P0IFG)
    {
        NewKeyValue = KEY_DOWN;     // 记录按键按下
    }
    P0IFG = 0;              //清中断标志
    P0IF = 0;               //清中断标志
}

在中断中我们记录按键按下,等待应用程序处理。而在主函数中我们需要处理按键按下事件,主函数中我们对按键计数并且通过LCD显示。
int main(void)
{
    char LCDBuf[21]={0};            // 显存
    int KeyCnt = 0;
    SysStartXOSC();
    LCD12864_Init();
    LCD12864_DisStr(1, "    Key Test");

    P0SEL &= ~0X01; // 设置为IO功能
    P0DIR &= ~0X01; // 设置为输入功能
    P0IEN |= 0X01;  // P0.0 设置为中断方式
    PICTL |= 0X01;  // 下降沿触发
    IEN1 |= 0X20;   // 允许P0口中断
    P0IFG = 0x00;   // 清除中断标志位
    EA = 1;         // 开总中断

    sprintf(LCDBuf, "   Key Count : %d", KeyCnt++);    // 按键计数
    LCD12864_DisStr(3, LCDBuf);
    while(1)
    {
        if(KEY_DOWN == NewKeyValue)  // 按键按下
        {
            SoftWaitUs(25000);       // 延时防抖
            if((P0&0X01) == 0X00)   // 再次确认按键是否按下
            {
                sprintf(LCDBuf, "   Key Count : %d", KeyCnt++);    // 按键计数
                LCD12864_DisStr(3, LCDBuf);
            }
            else
            {
                NewKeyValue = KEY_UP;   // 按键松开
            }
        }
    }
    return 0;
}

每按一次按键计数加1,效果如图所示:
第七节 独立按键之中断方式_第1张图片

本文章转载自
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/69222.aspx
请勿用于商业

你可能感兴趣的:(BLE)