搜索
bottom↓
回复: 18

在循环里,怎么让一段代码只执行一次?有什么巧妙的方法

[复制链接]

出0入0汤圆

发表于 2014-2-28 19:08:35 | 显示全部楼层 |阅读模式
本帖最后由 大哈欠E 于 2014-2-28 19:25 编辑

用c写。。。
for(;;)
{
   fun1();
fun2();





  
   }
fun1()
{
   LED_Fill(0x00);   //只让这条执行一次
    其他语句
   }

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2014-2-28 19:12:38 | 显示全部楼层
do{}
while{}

出20入25汤圆

发表于 2014-2-28 19:16:06 来自手机 | 显示全部楼层
进入之前设计个标志,执行后清除

出0入0汤圆

发表于 2014-2-28 19:19:03 | 显示全部楼层
do
{
}while(0)

出0入0汤圆

 楼主| 发表于 2014-2-28 19:24:35 | 显示全部楼层

这个不太适合 是这样的
for(;;)
{
  fun1();
fun2();





  
  }
fun1()
{
  LED_Fill(0x00);   //只让这条执行一次
   其他语句
  }

出0入0汤圆

发表于 2014-2-28 19:49:22 | 显示全部楼层
flag = 1;
for(;;)
{
fun1();
fun2();
......
}

fun1()
{
if(flag) { LED_Fill(0x00); flag = 0;}
......
}

出0入0汤圆

发表于 2014-2-28 22:11:25 | 显示全部楼层
看楼上写的

出0入0汤圆

发表于 2014-2-28 22:54:28 | 显示全部楼层
樓上正解!

出0入0汤圆

发表于 2014-2-28 23:10:29 | 显示全部楼层
一个非主流的想法

找一个一个用不到的中断或异常

需要执行时,软件触发一下

适合中断向量比较多的单片机

出0入0汤圆

发表于 2014-3-1 13:37:44 | 显示全部楼层
顶6楼,设标志位是比较直接有效的。

出0入0汤圆

发表于 2014-3-1 14:03:55 | 显示全部楼层
for(;;)
{
  fun1();
fun2();





  
  }
fun1()
{
  Switch(a)
    {
    case 0:
        LED_Fill(0x00);   //只让这条执行一次
       a=1;
     break;

     case 1:
        其他语句
     break;
     }
   
  }
a是全局变量
什么时候想下一次再执行LED_Fill(0x00);把a=0就可以了

出0入0汤圆

发表于 2014-3-4 15:47:04 | 显示全部楼层
也只有想到标志位的办法,不过实现起来除了用全局变量,还可以使用静态变量的方式哦。

出0入0汤圆

发表于 2014-3-4 15:57:27 | 显示全部楼层

  1. for(;;)
  2. {
  3.   fun1();
  4.   fun2();
  5. }
  6. fun1()
  7. {
  8.    static unsigned char MyStep = 0;/* 执行步骤标志 */
  9.    if(MyStep ==0)
  10.   {
  11.     LED_Fill(0x00);   //只让这条执行一次
  12.     MyStep++;/* MyStep == 1 */
  13.   }
  14.   else
  15.   {
  16.      ;/* 随便用 */
  17.   }
  18.     其他语句
  19. }
复制代码

出0入0汤圆

发表于 2014-3-5 02:14:33 | 显示全部楼层
可以定义一个标志位!!  只要执行了这条函数之后标志位 Flag=0;   判断标志位  只要为1就执行fun1  为0就不执行!!

出0入0汤圆

发表于 2014-3-5 06:44:12 | 显示全部楼层
本帖最后由 zhwm3064 于 2014-3-5 09:33 编辑

我是这样做的
把这段程序做成一个单独的任务,调用一次就行了,调用时把任务添加到任务队列中执行,执行一次就删除此任务。可以用下面三种方法停止此任务的再次执行。
ADD_Task(clearscreen,1,0);//添加任务 后面的三个参数分别是(清除屏幕 1毫秒后开始运行此程序 只运行一次此程序) 或者,在程序中添加一条,运行完程序后立即删除此程序:AtonceDelete =1;//立刻删除当前程序 或者在程序的后面 加上一条删除程序的语句 Delete_Task(clearscreen);//删除任务

出0入10汤圆

发表于 2014-3-5 08:02:21 | 显示全部楼层
一般用标注位来做,

出0入0汤圆

发表于 2014-3-5 08:41:54 | 显示全部楼层
加条件判断就行了啊

出0入0汤圆

发表于 2014-3-5 15:00:57 | 显示全部楼层
用c写。。。

fun1();

for(;;)
{
fun2();






//--------fun1放在外面即可。  既然只执行一次,为何要放在循环里???????????

出0入0汤圆

发表于 2014-3-11 20:44:53 | 显示全部楼层
围观求解释,先学后奉献
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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