找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7541|回复: 5
收起左侧

独立按键控制流水灯方向

[复制链接]
ID:720329 发表于 2020-4-8 22:52 来自手机 | 显示全部楼层 |阅读模式
具体要求就是按下按键1,流水灯从最右端向左移动,此时如果再按按键2,流水灯从最左端向右移动
下面有我写的程序,但是没有预期效果,请各位大佬帮忙看看,是我程序有问题吗?
IMG_20200408_224353.png
回复

使用道具 举报

ID:720329 发表于 2020-4-9 08:26 来自手机 | 显示全部楼层
各位大佬,帮帮忙,我是在是想不到哪错了
回复

使用道具 举报

ID:213173 发表于 2020-4-9 08:31 | 显示全部楼层
改这样试试
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit key1=P1^0;
  6. sbit key2=P1^1;

  7. bit flag=0;

  8. void delay(uint k)
  9. {
  10.         uint i,j;
  11.         for(i=k;i>0;i--)
  12.                 for(j=120;j>0;j--);
  13. }

  14. void main()
  15. {
  16.         P0=0xfe;
  17.         while(1)
  18.         {
  19.                 if(key1==0)
  20.                         flag=1;
  21.                 if(key1==0)
  22.                         flag=0;
  23.                 if(flag==1)
  24.                         P0=_cror_(P0,1);
  25.                 else
  26.                         P0=_crol_(P0,1);
  27.                 delay(200);
  28.         }
  29. }
复制代码
回复

使用道具 举报

ID:164602 发表于 2020-4-9 09:05 | 显示全部楼层
你看看我做的:
#include<reg51.h>
#include<intrins.h>       

#define GPIO_LED P2


sbit k1=P3^1;
sbit k2=P3^0;

void Delay10ms(unsigned int c);

void main(void)
{
        unsigned int i,j;
        j=0xfe;
        GPIO_LED=j;
        while(1)
        {       
                if(k1==0)
                {
                        Delay10ms(1);
                        if(k1==0)
                        {
                                if(k2==0)
                                {
                                        Delay10ms(1);
                                        if(k2==0)
                                        {
                                                j=_cror_(j,1);
                                                GPIO_LED=j;
                                        }
                                }
                                else
                                {
                                        j=_crol_(j,1);
                                        GPIO_LED=j;
                                }
                            while((i<50)&&(k1==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
        }               
}

void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

我在HC6800-ES-V2.0板子上通过试验,结果是:
按下k1键,LED灯左移,不松手,一直左移。
按下k2键,没有任何反应。
按下k1键,LED灯左移,不松手就一直左移;再按下k2键(此时k1、k2键是同时按下的),LED灯右移,都不松手,灯一直右移;松开k2,LED灯恢复左移,不松手一直左移;松开k1,LED灯不再移动。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:116773 发表于 2020-4-9 10:30 | 显示全部楼层
while循环内前两个if语句应该加上大括号,if语句后面没有大括号时,只是紧接的一条语句有效,不是你写在一行内就行的。
回复

使用道具 举报

ID:367369 发表于 2020-4-9 12:01 | 显示全部楼层
/****  在你的代码基础上更改   ****/
#include <reg51.h>
#include <intrins.h>
void delay(unsigned int z)
{
unsigned int a,b;
for (a=0;a<z;a++)
  for (b=0;b<120;b++);

}
sbit key1=P1^0;
sbit key2=P1^1;
unsigned int i,n,k,c;
void main()
{
while ()
{
  
  k=0xfe;
  c=0xf7;  
  /*赋初值放前面,你的代码逻辑中并没有将其包含在if后面;
  如果你想表达按键1后给k赋值请加上{};因为有两句代码
  */
  if (key1==0)
   i=1;
  if (key2==0)
   n=1;  
  /*i和n应该是想用标志位;一个标志位有01两种状态
  两种情况用一个标志位就够了,两位可以表示四种状态*/
  /*****你仔细的品******/
  /*比如你的代码中就可以用while(n)和while(!n)*/
  if (key==0&&i==1)
  delay(10);
  if (key==0&&i==1)
  
  /*
  你可以用
  if(i==1)
  {
  P0=k;
  k= _crol_(k,1)
  delay(500);
  n=0;
  }
  */
  {
  P0=k;
  k= _crol_(k,1)
  delay(500);
  n=0;
  /*标志位用来保存按键状态,这样就不用一直按着
  而n=0;用来清除按键二的状态后面的i=0;同理
  */
  //while (!n);   
  //while (1)后面直接接分号,表示单片机什么也不做,原地等待
  //此处你的代码中多余,你的状况是流水灯闪一遍后灯全部灭了
  //你的代码本来就处于外面的while(1)的大循环中
  /*你仔细品*/
  if (key==0&&n==1)
  delay(10);
  if (key==0&&n==1)
  {
  P0=c;
  c= _cror_(c,1)
  delay(500);
  i=0;
  
  }
  
  
  
  
}
}

/*******精简版标志位法**********/
#include <reg51.h>
#include <intrins.h>
void delay(unsigned int z)
{
unsigned int a,b;
for (a=0;a<z;a++)
  for (b=0;b<120;b++);

}
unsigned int i,k,c;
void main()
{
while ()
{
  k=0xfe;
  c=0xf7;  
  if (key1==0)
   delay(10);
   if (key1==0)
   i=1;
  //i 储存按键的状态  1 0 表示按键1和按键2
  if (key2==0)
   delay(10);
   if (key2==0)
   i=0;
  
  //判断i的值等同于判断按键
  if(i==0)
  {
  P0=k;
  k= _crol_(k,1)
  delay(500);
  }
  else
  {
  P0=c;
  c= _cror_(c,1)
  delay(500);
  }
}
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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