单片机C语言编程的一个问题

[复制链接]
查看11 | 回复4 | 2008-8-1 08:32:13 | 显示全部楼层 |阅读模式
一个小程序,想要实现的是当有外部中断的时候,实现display函数和liushuiled函数之间的转换,可是程序编译好放到仿真程序中,每次按下中断按钮,经常出现并不转换函数,依然是执行原函数。也就是说出现函数转换效果是有一定几率的。
程序如下:
long int x=0;
void main()
{
EA=1;
EX0=1;
IT0=0;
while(1)
{
if(flag==0)


{for(;(x<12345678)&&(flag==0);x++)

display(x);//调用display函数

}
else
liushuiled();//调用liushuiled函数
}
}
void exter0() interrupt 0
{
flag=!flag;
}
后来把中断程序改成
void exter0() interrupt 0
{
if(flag==1)
{
flag=0;
}
else
{
flag=1;
}
}
情况好了很多 ,但是在很小几率下还是会出现无法转换的问题。
各位大虾帮帮小弟吧~~
第一位朋友的回答我很赞同,但是想请教解决的方法。
第二位朋友在开头说长整形做循环太富有,呵呵,其实是我想显示x这个数,在数码管上实现累加的效果。是在八位数码管上显示,所以选择了长整形,当时也不太清楚什么类型适合,我也想节省RAM,请教一下什么类型最合适八位数码管的显示呢?至于那个主函数,似乎我之前试过了,不行吧。
第三位朋友的回答我也非常非常赞同,请教一下如何使只调用一次中断函数,非常感激..也就是说解决的方法是什么?
第四位朋友的方法我试过了,没效果..

回复

使用道具 举报

千问 | 2008-8-1 08:32:13 | 显示全部楼层
原因很简单,你按一下中断按钮,中断函数被处理了好多遍,处理了好多遍以后flag是0是1是无法预知的。 解决方法是: 每按一次中断按钮,只能让程序执行一遍中断函数。 这么简单的问题还讨论来讨论去的,多学习吧。现在告诉你怎样写,看清楚了...... sbit KEYEX0 = P3^2; //定义中断口 long int x=0; void main() { EA=1; EX0=1; IT0=0; while(1) { if(flag==0) {for(;(x<12345678)&&(flag==0);x++) display(x);//调用display函数 } else l
回复

使用道具 举报

千问 | 2008-8-1 08:32:13 | 显示全部楼层
大哥,长整型作为循环变量,你太富有了。。。。。。。。。。把你主函数改一下:试试。void main() { EA=1; EX0=1; IT0=0; while(1) { if(!flag) display(x);//调用display函数 else liushuiled();//调用liushu
回复

使用道具 举报

千问 | 2008-8-1 08:32:13 | 显示全部楼层
程序看起来没什么样问题啊,会不会是因为转换太快,而显示要一定的延时造成的!试试在主程序里,调用一个子程序后关中断,延时小段时间再开中断。调用第二个子程序后面也一样。
回复

使用道具 举报

千问 | 2008-8-1 08:32:13 | 显示全部楼层
可以在中断程序里加入延时程序解决,具体延时多长时间自己看着设置吧。我把你的程序运行后确实出现转换不灵活的情况,原因是按一下键它转换了很多次,具体停在哪里不确定。但是我在中断程序中加入延时后就好了。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行