一.系统组成框图
78K0/KD2 系统组成框图如下图所示。
由图可见, 除了通用 I/O 部件和时钟输出部件因自身功能特点而没有使用中断方式与 CPU 通信外,其它功能部件均可使用中断方式向 CPU发送中断请求。可见, CPU 具有对单片机外部或内部随机发生的事件进行实时处理的能力。
二.应用实例分析
下面以简单的点灯程序分析一个中断标志清除的问题。
2.1 问题
在中断服务程序中,控制引脚翻转,以实现LED闪烁效果。代码如下:
__interrupt void MD_INTP0(void)
{
/* Start user code. Do not edit comment generated here */
PMK0 = 1; /*屏蔽外部中断 INTP0*/
P7=~P7; /*LED 亮灭交替*/
delay(); /*延时*/
PMK0 = 0; /*开中断 INTP0*/
/* End user code. Do not edit comment generated here */
}
运行结果:按一次按键, LED 由原来的灭转亮, 过一会儿, 再自动变灭。
为什么会自动熄灭?
2.2 原因分析
INTP0 的电路如下图所示:
脉冲沿检测器与 CPU 并行运行。虽然响应中断时, IF 标志被硬件自动清零, 但在 CPU 运行中断服务程序其间,中断请求源(即按键) 因按键抖动而未能及时撤销, IF 再次被置 1。待CPU 返回主程序后会再次响应中断。
2.3 解决
CPU 返回主程序前,需将 IF 清零。
正确程序如下:
__interrupt void MD_INTP0(void)
{
/* Start user code. Do not edit comment generated here */
PMK0 = 1;
P7=~P7;
delay();
PIF0 = 0;
PMK0 = 0;
/* End user code. Do not edit comment generated here */
}
2.4 小结
以上代码没有实际应用意义,仅为了说明问题而编写。