151
1841
2166
金牌会员
#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; } 复制代码
使用道具 举报 送花
wnag*** 发表于 2024-7-27 20:56 if(INT0==0) 和 INT0=1;
86
5979
1万
超级版主
Debu*** 发表于 2024-7-27 21:09 delayms函数存在中断重入,中断内外不能调用同一个函数
wnag*** 发表于 2024-7-27 21:16 你用的哪款芯片,我没有找到INT0
wnag*** 发表于 2024-7-27 21:37 我明白了,你这个INT0是表示P3^2口,设置输入模式上拉就好了,不用写INT0 = 1; ...
19
3257
5699
论坛元老
so*** 发表于 2024-7-27 21:47 中断内外不能调用同一个函数,还真不知道。
8
318
1837
Lkck*** 发表于 2024-7-27 22:42 中断就是要快进快出 在中断里加延时是什么天才想法? 想消抖可以参考这贴子我7楼的回答
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-8-24 12:34 , Processed in 0.126237 second(s), 102 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.