vb2002 发表于 2024-7-27 20:13:02

干嘛我的中断要等delay执行完了才能中断,更换模式?

按P32 更改闪烁模式

但是如果case 1执行中,不能中断,需要等case 1执行完了,才能响应
#include "stc8h.h"
#include "intrins.h"

#define MAIN_Fosc 11059200UL

typedef unsigned char u8;typedef unsigned int u16;
       
void delayms(u16 ms);

       volatile u8 state = 0;
       void shan1(void);
       void shan2(void);
       void shan3(void);
       void shan4(void);
       
void main()
{       

       
        P_SW2=0x80;
       
    P3M0 = 0x00; P3M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0xef;
        EX0=1;IE1=1;

        INTCLKO|=0x40;   //EX4=1; 允许INT4外部中断
        EA=1;                        //打开总中断


       
        while(1)
       {       
        switch(state)
                {
                case 0:P33=1;   break;
                case 1:shan1();    break;
                case 2:shan2();        break;       
                case 3:shan3();        break;
                case 4:shan4();        break;                               
                default:break;
                }


       }
}

void INT0_Isr(void) interrupt 0
{

delayms(10);
if(INT0==0)
{
state++;
if(state>4)
state=0;
INT0=1;
}
}

void shan1(void)
{

        P33=0;
        delayms(200);
        P33=1;
        delayms(200);
        P33=0;
        delayms(200);
        P33=1;
        delayms(200);
        P33=0;
        delayms(200);
        P33=1;
        delayms(1000);
        P33=0;
        delayms(1000);
        P33=1;
        delayms(1000);
        P33=0;
        delayms(1000);
        P33=1;
        delayms(1000);
        P33=0;
        delayms(1000);
        P33=1;
        delayms(1000);       
        P33=0;
        delayms(200);
        P33=1;
        delayms(200);
        P33=0;
        delayms(200);
        P33=1;
        delayms(200);
        P33=0;
        delayms(200);
        P33=1;
        delayms(2000);

}

void shan2(void)
{


        P33=0;
        delayms(1000);
        P33=1;
        delayms(1000);


}
void shan3(void)
{


        P33=0;
        delayms(1);
        P33=1;
        delayms(1000);


}
void shan4(void)
{


        P33=0;
        delayms(1);
        P33=1;
        delayms(3000);


}

void delayms(u16 ms)
        {
        u16 i;
        do{
                i = MAIN_Fosc /10000;
                while(--i);
        }while(--ms);
        }


void INT4_Isr(void) interrupt 16
{
IAP_CONTR=0x60;                       
}
       

vb2002 发表于 2024-7-27 20:59:54

wnagming 发表于 2024-7-27 20:56
if(INT0==0)

INT0=1;


不对吗?
if(INT0==0)
状态标志++
INT0=1;
确保中断服务程序中中断标志位 INT0 被正确清除。这通常是通过将标志位置为 1 来实现的。

DebugLab 发表于 2024-7-27 21:09:42

delayms函数存在中断重入,中断内外不能调用同一个函数

vb2002 发表于 2024-7-27 21:39:49

DebugLab 发表于 2024-7-27 21:09
delayms函数存在中断重入,中断内外不能调用同一个函数

刚按您的说法,我百度了一下
递归重入c语言延时函数多任务程序设计中的函数重入问题按照Keil的规范对函数添加关键字“reentrant”,将函数定义为可重入的 void Delay_MS(x) reentrant
好像这样可以解决!
我试试

vb2002 发表于 2024-7-27 21:40:33

wnagming 发表于 2024-7-27 21:16
你用的哪款芯片,我没有找到INT0

stc8h1k08

vb2002 发表于 2024-7-27 21:40:57

wnagming 发表于 2024-7-27 21:37
我明白了,你这个INT0是表示P3^2口,设置输入模式上拉就好了,不用写INT0 = 1; ...

楼下大佬已经解答了

soma 发表于 2024-7-27 21:47:49

中断内外不能调用同一个函数,还真不知道。{:4_167:}

vb2002 发表于 2024-7-27 22:08:44

soma 发表于 2024-7-27 21:47
中断内外不能调用同一个函数,还真不知道。

看来我的折腾还是有点用处了.
到处排雷..

Lkck8210 发表于 2024-7-27 22:42:44

中断就是要快进快出
在中断里加延时是什么天才想法?
想消抖可以参考这贴子我7楼的回答
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=8615

vb2002 发表于 2024-7-27 22:50:24

Lkck8210 发表于 2024-7-27 22:42
中断就是要快进快出
在中断里加延时是什么天才想法?
想消抖可以参考这贴子我7楼的回答


看到了,
参照您的方法我试试
我那个延迟中不进中断不是消抖的问题
页: [1] 2
查看完整版本: 干嘛我的中断要等delay执行完了才能中断,更换模式?