51单片机执行中断服务程序的问题,汇编语言

我有16个按键,任何一个按键按下就会触发外部中断,然后进入中断服务子程序,首先判断是哪个按键按下,然后跳转到响应的程序标号处执行,但这个子程序是要花很长时间才能执行完的(点阵屏滚动字,将要显示的文字从右向坐滚完要至少1分钟)但是我的16个按键是随时随意按的,也就是说第一个中断服务还没有完成(假设文字才滚动显示一部分),当我按下某个键,程序就应该停止当前的工作,进入判断按键的地方,然后在跳转到相应标号处执行(显示其他内容)
可我发现程序在响应第一个中断后,如果中断服务没有执行完,这时又来一个中断信号,程序不会响应最新的中断,而是还在执行第一个中断(我在每个中断服务程序中都开中断,开外部中断,可在这种情况下它就是不响应)

这个问题有很多种解决方法,各种方法如下:
1.扩展外部中断,但成本会很高;
2.简化程序,将字符移动作为系统主资源程序,中断程序只进行按键读入,字符每移动一个点格就判断一次是否有新的按键按下,没有则继续执行此程序,有则跳转到相应程序,当然响应程序每隔一定语块也要加上按键判断语句,可以用循环完成,判断语句在循环末尾。
还有很多种用软件模拟扩展中断的方法,但都十分复杂。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-02
这是必然的。因为中断程序在执行过程中,只有高一级的中断才能打断当前中断,转向新中断执行。而你的按键都是同一级中断,自然不会执行。仔细看一看单片机教科书里有关中断的章节就会明白。建议把程序改成查询方式,或者把点阵屏滚动字的程序移到中断子程序外,这样就不会出现这个问题了。
第2个回答  2009-05-02
这是因为你没设置中断优先级IP寄存器,这样也只能嵌套2个外部中断,我觉得你应该用一个8259,在外部扩展中断,不然你程序是写不出16个中断嵌套的
第3个回答  2009-05-02
中断服务程序是越短越好,否则就出现你说的情况了。
建议改下。
相似回答