• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【讨论】51C语言编程可否用中断令循环结束提前结束

C51_C语言编程控制流水灯

硬件电路 p0 接 led 8 个,P33 接按键使用中断2

开机灯按1~8逐位闪烁,并循环

按键后改为 两灯亮 的流水灯

下面写了个程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar ucTemp,ucTimes,ucShift=0;

void DelayMS(uint x)

{

uchar t;

while(x--)

for(t=120;t>0;t--);

}

void main()

{

ucTemp=0x0FE;

IT1=1;

EX1=1;

EA=1;

while(!ucShift)

{

for (ucTimes=0;ucTimes<7;ucTimes++)

{

P0=ucTemp;

DelayMS(250);

P0=0x0FF;

DelayMS(250);

}

ucTemp=_cror_(ucTemp,1);

}

//BESHIFT:

while (ucShift)

{

P0=ucTemp;

DelayMS(500);

ucTemp=_cror_(ucTemp,1);

}

// goto BESHIFT;

}

void P33_INT1() interrupt 2

{

ucTemp=0x0FD;

ucShift=1;

//可否在此程序内加入如下语句(事实上试过会报错)使得循环结束

//goto BESHIFT;

//return break;

//return goto BESHIFT;

}

问题是有什么办法可以在调用中断函数之后使得第一个while循环提前结束,

当然可以在里面加多个IF,但这样就不好玩了。

全部回复(7)
正序查看
倒序查看
001a
LV.3
2
2014-02-20 23:43
我是想在不改主函数和延时函数的情况下,实现按键后立马跳转,但还没见到过真这么作的,大家有什么巧妙的方法,恳请分享下
0
回复
matou
LV.3
3
2014-02-20 23:45
@001a
我是想在不改主函数和延时函数的情况下,实现按键后立马跳转,但还没见到过真这么作的,大家有什么巧妙的方法,恳请分享下
用汇编试试?在发生中断后,把栈里面的返回地址改为循环指令块
0
回复
001a
LV.3
4
2014-02-20 23:47
@matou
用汇编试试?在发生中断后,把栈里面的返回地址改为循环指令块
嗯值得一试,果然高阶编程是汇编与c相结合的
0
回复
matou
LV.3
5
2014-02-20 23:48
@001a
嗯值得一试,果然高阶编程是汇编与c相结合的
汇编虽然复杂,但学会了就可以逆天了,你甚至可以边从网络上下载代码边运行
0
回复
001a
LV.3
6
2014-02-20 23:50
@matou
汇编虽然复杂,但学会了就可以逆天了,你甚至可以边从网络上下载代码边运行

长见识了

0
回复
kcfoo1
LV.5
7
2014-02-28 09:19
@001a
我是想在不改主函数和延时函数的情况下,实现按键后立马跳转,但还没见到过真这么作的,大家有什么巧妙的方法,恳请分享下
好好看看51c ,goto 只能用在同一函数内,你只要把两函数合并为一函数,就可以,当然不用goto也可以实现,方法多是,但是如果用汇编混合编写,那你出错几率会大得多,尤其是改变程序地址指针,是非常不可取的
0
回复
xinzha
LV.1
8
2014-03-12 23:03
初始化term = 0,在中断中term = 1,然后的你的while循环写成while(0 == term){}。如果用标准c这样写的话需要将term声明为volatile以防止优化,c51是否需要不清楚。
0
回复