wulin 发表于 2021-9-9 21:59 想请问一下,怎么不用硬件操作,直接在在主程序中打开外部中断,自动开启,下边这个程序我以为是我自己用到了标志位,可是我发现我在板子上看结果,发现我把主程序的外部中断打开给注释了,还是一样的结果,所以我不知道是不是我自己压根都没用到外部中断。只是程序在主程序中顺序执行了。大佬解答一下,这个问题困惑好久了。 #include <REGX52.H> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; uchar num,num1; uchar table1[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d}; uchar table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; bit flag; void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void extern0()interrupt 0 { flag=~flag; } void main() { IT0=1; EX0=1; EA=1; while(1) { for(num=0;num<6;num++) { wela=1; P0=table2[num]; wela=0; P0=0xff; P0=0x00; dula=1; P0=table1[num]; dula=0; delayms(500); if(flag=~flag) { for(num1=0;num1<8;num1++) { P1=table3[num1]; delayms(500); } P1=0xff; } } } } |
xuyaqi 发表于 2021-9-9 18:38 #include <REGX52.H> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; uchar num,num1; uchar table1[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d}; uchar table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; bit flag; void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void extern0()interrupt 0 { flag=~flag; } void main() { IT0=1; EX0=1; EA=1; while(1) { for(num=0;num<6;num++) { wela=1; P0=table2[num]; wela=0; P0=0xff; P0=0x00; dula=1; P0=table1[num]; dula=0; delayms(500); if(flag=~flag) { for(num1=0;num1<8;num1++) { P1=table3[num1]; delayms(500); } P1=0xff; } } } } 这样改了一下,我发现外部中断不用写也是同样的调试结果,反而是程序在主程序中顺序执行了,并没有用到这个外部中断。 |
wulin 发表于 2021-9-9 21:59 感谢大佬,我自己的程序按了S2和S14中断也打开了,谢谢指点,茅塞顿开呀,感觉打开了新天地。非常感谢 |
| 当按键按下时,会有弹动,会发出N次中断申请。你如何保证每次按下,只中断一次呢? |
用杜邦线一端接地另一端触碰P3.2触发外部中断,同时按下S2、S14也可触发外部中断。数码管交替显示012345和6789Ab。
|
| 中断占得时间应尽量短,你在外中断里又是for,又是延时是不对的,完全可以在中断设置标志,在主循环里做处理。 |
| 这个是要实现什么功能呢? |
| 这个是要实现什么功能? |
电ac 发表于 2021-9-9 16:54 你好,这个方法我以前自己调试的时候设置过,但是还是没有用,我把原理图放在了附录,感谢指点 |
电ac 发表于 2021-9-9 16:54 改了,我之前自己调试的时候就改正过,我把原理图放在了附件可以看下, |
| 你那个电路图有没有?还有就是把IT0=1,设置成下降沿触发方式 |