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

来源:互联网 发布:淘宝代发怎么发货 编辑:程序博客网 时间:2024/05/20 06:22

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

 复制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,效果如图所示:


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