找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3235|回复: 9
打印 上一主题 下一主题
收起左侧

我这个C语言程序为什么实现不了一直循环啊,按一次只循环一次

[复制链接]
跳转到指定楼层
楼主
ID:716161 发表于 2020-3-26 13:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <STC12C5A60S2.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;
sbit key2=P3^1;
void delay(uint z)   //毫秒级延迟
{
uint x,y;
for(x=z;x>0;x--)
  for(y=114;y>0;y--);
}
void main()
{
   uchar i;
P1=0xfe;
while(1)
{
  if(key1==0)
  {
   delay(20);
   if(key1==0)
   {
    for(i=0;i<8;i++)
    {
     
     P1=_crol_(P1,1);
     delay(1000);
    }
    while(!key1);
   }
  }
   if(key2==0)
   {
    delay(20);
    if(key2==0)
    {
     for(i=0;i<8;i++)
     {
      
      P1=_cror_(P1,1);
      delay(1000);
     }
     while(!key2);
    }
   }
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:367369 发表于 2020-3-26 15:03 | 只看该作者
    while(!key1);    程序执行到这里会原地等待你松开Key1;你不松就是while(1);什么也不会做;
如果你是要按着Key1或Key2让流水灯一直闪,可以不要while(!key1);和while(!key2);
回复

使用道具 举报

板凳
ID:697917 发表于 2020-3-26 15:13 | 只看该作者
你的程序循环扫描按键,按键如果只按一下会进入相应的循环程序,但是while(!key1);又等待按键放开。因此你若一直按键程序就已经死在这个while(!key1);里了。如果不一直按着那就执行一次,等你再按键在循环。
回复

使用道具 举报

地板
ID:213173 发表于 2020-3-26 16:43 | 只看该作者
这样就可以持续循环,按键改变循环方向。
#include <STC12C5A60S2.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;
sbit key2=P3^1;

void delay(uint z)   //毫秒级延迟
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=1140;y>0;y--);//1T单片机加10倍
}
void main()
{
        uchar i,j;
        P1=0xfe;
        while(1)
        {
                if(key1==0)
                {
                        delay(10);
                        if(key1==0)
                        {
                                i=2;
                                while(!key1);
                        }
                }
                if(key2==0)
                {
                        delay(10);
                        if(key2==0)
                        {
                                i=1;
                                while(!key2);
                        }
                }
                j++;
                if(j==50)
                {
                        j=0;
                        if(i==2)
                        {
                                P1=_crol_(P1,1);
                        }
                        if(i==1)
                        {
                                P1=_cror_(P1,1);
                        }
                }
                delay(10);
        }
}
回复

使用道具 举报

5#
ID:716161 发表于 2020-3-26 17:09 | 只看该作者
game灬boy 发表于 2020-3-26 15:03
while(!key1);    程序执行到这里会原地等待你松开Key1;你不松就是while(1);什么也不会做;
如果 ...

我的想法是按一下k1让流水灯一直循环,按一下k2再换另一种循环。那样要怎么改呢,不是一直按着k1或k2
回复

使用道具 举报

6#
ID:716161 发表于 2020-3-26 17:13 | 只看该作者
黎明初至 发表于 2020-3-26 15:13
你的程序循环扫描按键,按键如果只按一下会进入相应的循环程序,但是while(!key1);又等待按键放开。因此你 ...

我想改成按一次就不停循环,除非别的按键按下才改变循环,请问那样要怎么改呢
回复

使用道具 举报

7#
ID:531524 发表于 2020-3-28 10:31 | 只看该作者
这个很简单
while(1)
{
    if(key==1)
        {
           while(1)
           {
              xunhuan
                  if(key2==1) break;
           }
        }
        if(key2==1)
        {
           while(1)
           {
              xunhuan
                  if(key==1) break;
           }
        }
}
回复

使用道具 举报

8#
ID:707815 发表于 2020-3-28 15:49 | 只看该作者
你中间两个按键那里,卡死在那了,等于说是一个判断条件,要想一直循环,就不要加这种硬性的判断条件
回复

使用道具 举报

9#
ID:707309 发表于 2020-3-28 18:43 | 只看该作者
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;
sbit key2=P3^1;
uchar num;
void delay(uint z)   //毫秒级延迟
{
uint x,y;
for(x=z;x>0;x--)
  for(y=114;y>0;y--);
}
void xunhua()
{
        uchar i;
        switch(num)
        {
                case 1:
                for(i=0;i<8;i++)
             {
                        if(key2==0)
                 {
                           delay(20);
                           if(key2==0)
                           {
                                num=2;
                                return;
                        }
                 }
                        P0=_cror_(P0,1);
                      delay(1000);
                }
                break;
                case 2:
                for(i=0;i<8;i++)
             {
                             if(key1==0)
                 {
                           delay(20);
                           if(key1==0)
                           {
                                num=1;
                                return;
                        }
                 }
                        P0=_crol_(P0,1);
                      delay(1000);
             }
                break;
        }
}


void main()
{
     P0=0xfe;
        while(1)
        {
         if(key1==0)
         {
                   delay(20);
                   if(key1==0)
                   num=1;
         }
           if(key2==0)
           {
                   delay(20);
            if(key2==0)
             num=2;
           }
         xunhua();
        }
}

附件.rar

67.23 KB, 下载次数: 2

回复

使用道具 举报

10#
ID:367369 发表于 2020-3-29 16:20 | 只看该作者
萌萌萌新aa 发表于 2020-3-26 17:09
我的想法是按一下k1让流水灯一直循环,按一下k2再换另一种循环。那样要怎么改呢,不是一直按着k1或k2

标志位法:
你可以改成
int a;
if (KEY1)
a=0;
if (KEY2)
a=1;
然后后面
if (a==0)
模式一;
if (a==1)
模式二;
这样就很简单的把你需要的功能实现了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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