本文主要是介绍第七节 独立按键之中断方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第七节 独立按键之中断方式
复制Key工程,重命名为KeyInterrupt。刚刚我们用查询的方式读取按键的状态。但是这种方式在实际的工程中没有实际的应用价值,下面我们采用外部中断的方式来读取按键的状态,每当按键按下时就会触发一次外部中断。为了P0.0口能够触发中断,我们需要进行如下配置:
然后就需要编写中断服务函数了。这里注意一点,在IAR中的中断函数有点特殊,格式为:
所以我们的中断函数为:
在中断中我们记录按键按下,等待应用程序处理。而在主函数中我们需要处理按键按下事件,主函数中我们对按键计数并且通过LCD显示。
每按一次按键计数加1,效果如图所示:
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
请勿用于商业
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/69222.aspx
请勿用于商业
这篇关于第七节 独立按键之中断方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!