找回密码
 立即注册
查看: 687|回复: 12

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-7-27 20:13:02 | 显示全部楼层 |阅读模式
按P32 更改闪烁模式

但是如果case 1执行中,不能中断,需要等case 1执行完了,才能响应
  1. #include "stc8h.h"
  2. #include "intrins.h"
  3. #define MAIN_Fosc 11059200UL
  4. typedef unsigned char u8;typedef unsigned int u16;
  5.        
  6. void delayms(u16 ms);
  7.          volatile u8 state = 0;
  8.          void shan1(void);
  9.          void shan2(void);
  10.          void shan3(void);
  11.          void shan4(void);
  12.          
  13. void main()
  14. {       
  15.        
  16.         P_SW2=0x80;
  17.        
  18.     P3M0 = 0x00; P3M1 = 0x00;
  19.     P5M0 = 0x00; P5M1 = 0xef;
  20.         EX0=1;IE1=1;
  21.         INTCLKO|=0x40;   //EX4=1; 允许INT4外部中断
  22.         EA=1;                        //打开总中断
  23.        
  24.         while(1)
  25.          {       
  26.         switch(state)
  27.                 {
  28.                 case 0:  P33=1;   break;
  29.                 case 1:  shan1();    break;
  30.                 case 2:  shan2();          break;       
  31.                 case 3:  shan3();          break;
  32.                 case 4:  shan4();          break;                               
  33.                 default:break;
  34.                 }
  35.          }
  36. }
  37. void INT0_Isr(void) interrupt 0
  38. {
  39.   delayms(10);
  40.   if(INT0==0)
  41.   {
  42.   state++;
  43. if(state>4)
  44. state=0;
  45.   INT0=1;
  46.   }
  47. }
  48. void shan1(void)
  49. {
  50.         P33=0;
  51.         delayms(200);
  52.         P33=1;
  53.         delayms(200);
  54.         P33=0;
  55.         delayms(200);
  56.         P33=1;
  57.         delayms(200);
  58.         P33=0;
  59.         delayms(200);
  60.         P33=1;
  61.         delayms(1000);
  62.         P33=0;
  63.         delayms(1000);
  64.         P33=1;
  65.         delayms(1000);
  66.         P33=0;
  67.         delayms(1000);
  68.         P33=1;
  69.         delayms(1000);
  70.         P33=0;
  71.         delayms(1000);
  72.         P33=1;
  73.         delayms(1000);       
  74.         P33=0;
  75.         delayms(200);
  76.         P33=1;
  77.         delayms(200);
  78.         P33=0;
  79.         delayms(200);
  80.         P33=1;
  81.         delayms(200);
  82.         P33=0;
  83.         delayms(200);
  84.         P33=1;
  85.         delayms(2000);
  86. }
  87. void shan2(void)
  88. {
  89.         P33=0;
  90.         delayms(1000);
  91.         P33=1;
  92.         delayms(1000);
  93. }
  94. void shan3(void)
  95. {
  96.         P33=0;
  97.         delayms(1);
  98.         P33=1;
  99.         delayms(1000);
  100. }
  101. void shan4(void)
  102. {
  103.         P33=0;
  104.         delayms(1);
  105.         P33=1;
  106.         delayms(3000);
  107. }
  108. void delayms(u16 ms)
  109.         {
  110.         u16 i;
  111.         do{
  112.                 i = MAIN_Fosc /10000;
  113.                 while(--i);
  114.         }while(--ms);
  115.         }
  116. void INT4_Isr(void) interrupt 16
  117. {
  118. IAP_CONTR=0x60;                       
  119. }
  120.        
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-7-27 20:59:54 | 显示全部楼层
wnag*** 发表于 2024-7-27 20:56
if(INT0==0)

INT0=1;

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-7-27 21:09:42 | 显示全部楼层
delayms函数存在中断重入,中断内外不能调用同一个函数
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-7-27 21:39:49 | 显示全部楼层
Debu*** 发表于 2024-7-27 21:09
delayms函数存在中断重入,中断内外不能调用同一个函数

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

点评

延时函数设置为可重入函数,可能导致程序死在延时函数里出不来(死循环、死机)  详情 回复 发表于 2024-7-28 20:30
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-7-27 21:40:33 | 显示全部楼层
wnag*** 发表于 2024-7-27 21:16
你用的哪款芯片,我没有找到INT0

stc8h1k08
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-7-27 21:40:57 | 显示全部楼层
wnag*** 发表于 2024-7-27 21:37
我明白了,你这个INT0是表示P3^2口,设置输入模式上拉就好了,不用写INT0 = 1; ...

楼下大佬已经解答了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-7-27 21:47:49 | 显示全部楼层
中断内外不能调用同一个函数,还真不知道。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-7-27 22:08:44 | 显示全部楼层
so*** 发表于 2024-7-27 21:47
中断内外不能调用同一个函数,还真不知道。

看来我的折腾还是有点用处了.
到处排雷..
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-7-27 22:42:44 | 显示全部楼层
中断就是要快进快出
在中断里加延时是什么天才想法?
想消抖可以参考这贴子我7楼的回答
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=8615
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-7-27 22:50:24 | 显示全部楼层
Lkck*** 发表于 2024-7-27 22:42
中断就是要快进快出
在中断里加延时是什么天才想法?
想消抖可以参考这贴子我7楼的回答

看到了,
参照您的方法我试试
我那个延迟中不进中断不是消抖的问题
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:14 , Processed in 0.142669 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表