单片机C51 两个按键K1、K2控制8个LED灯,初始值0xFE。摁下松开一次K1,LED灯左移一位点亮下一盏灯,前一位熄灭;摁下松开一次K2,LED灯右移一位点亮下一盏灯,前一位熄灭;


#include"reg52.h"
#include"intrins.h" //_crol_和_cror_移位函数的库函数,使用_crol_和_cror_移位函数必须要先声明库函数
#define uchar unsigned char
void Delay_1ms(unsigned int Time)
    
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);     //延时函数,老生常谈
}

void main(void)
{
  uchar led1,led2;
    led1=0xFE;
  led2=0xFE;
    
    while(1)
    {
        if(P1==0xFE) //定义按键K1,按键接P1^0口 1111 1110 接地变为低电平

          {
                Delay_1ms(50); //延时防抖动
                
                while(P1==0xFE);
                {
                P2=led1; //P2口初始值
              led1=_crol_(led1,1); //使用循环左移函数,一定要保持循环初始值有0。使用该函数使程序简单很多
                Delay_1ms(50);
                }
            }
                    
                    
      if(P1==0xFD) //定义按键K2,按键接P1^1口 1111 1101 接地变为低电平
            {
                  Delay_1ms(50); //延时防抖动
                while(P1==0xFD);
                 {
                P2=led2; //P2口初始值
                led2=_cror_(led2,1); //使用循环右移函数,一定要保持循环初始值有0。使用该函数使程序简单很多
                Delay_1ms(50);
                 }    
            }
    }
}

我的问题是,无法衔接左右移位,导致换向时混乱,请教一下改进方法,谢谢

img


https://img-blog.csdnimg.cn/447fa0919c614e5c88944a8441da8e7b.gif

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

我想达到的目的是一次按键移动一位,左右换向正常。您的回答我看了,您的方案没有很好地解决我这边的解决一次按键移动一位的。一次按键移动一位的难点在于,中途换向导致前一个方向的变量还在,从而导致换向的时候紊乱

img