标题: 这个程序编译没有错误 但是烧到单片机里面LED灯全亮,实现不了按键左右移动!求助 [打印本页]

作者: fyk    时间: 2016-1-23 12:09
标题: 这个程序编译没有错误 但是烧到单片机里面LED灯全亮,实现不了按键左右移动!求助
#include<reg51.h>
#include<intrins.h>

//定义全局变量
sbit K1=P1^0;
sbit K2=P1^1;
#define GPIO_LED P0


//定义声明函数
void Delay10ms(unsigned int c);
unsigned char Key_Scan();

//主函数
void main(void)
{
  unsigned char ledvalue,keyNum;
  ledvalue=0x01;

  while(1)
  {       
     keyNum=Key_Scan();
     if(keyNum==1)
     {
              ledvalue=_crol_(ledvalue,1);
     }
     else if(keyNum==2);
     {
              ledvalue=_cror_(ledvalue,1);
     }
            GPIO_LED=ledvalue;
  }
}

//按键扫描函数
unsigned char Key_Scan()
{
  unsigned char keyValue=0,i;
  if(K1==0)
  {
  Delay10ms(1);
    if(K1==0)
        {
         keyValue=1;
         i=0;
            while((i<50)&&(K1==0))
            {
                  Delay10ms(1);
                 i++;
            }
        }
  }
  if(K2==0)
  {
          Delay10ms(1);

    if(K2==0)
        {
         keyValue=2;
         i=0;
            while((i<50)&&(K2==0))
            {
                  Delay10ms(1);
                 i++;
            }
        }
  }
        return keyValue;
}

//延时函数
void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

        //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }

        }      
}


作者: 寒门痴子    时间: 2016-1-23 12:45
不大明白您键值扫描程序中的&&相关内容的作用是什么,是为消抖吗?请教。
作者: wc86110    时间: 2016-1-23 13:43
没有错误并不代表就没有问题,还是得再调试调试才行,多多练习没错的。
作者: wc86110    时间: 2016-1-24 23:57
把主函数到按键扫描函数以上这段移动到最下面就行,适当修改一下LED
作者: wc86110    时间: 2016-1-25 00:07
把主函数到按键扫描函数以上这段移动到最下面就没问题了,如果再减慢一下 LED 的刷新率就更好。
作者: smilefff    时间: 2016-1-26 20:51
要加延时才能看清
作者: 51hei852    时间: 2016-1-27 11:50
             ledvalue=_crol_(ledvalue,1);

这是循环移动 不是每次只移动一位 单片机运行速度快 人眼分辨不出来 你可以加延时  或者 变成每按键一次右移 或者左移 一位
作者: 四师哥    时间: 2016-1-27 20:31

if(keyNum==1)
     {
              ledvalue=_crol_(ledvalue,1);
              Delay10ms(50);
     }
     else if(keyNum==2);
     {
              ledvalue=_cror_(ledvalue,1);
              Delay10ms(50);
     }
在那个移位循环后面加个延时就好,就是这样。其实就是因为你没加延时,所以闪的很快,我们的眼睛分辨不出来,就感觉是全亮。
作者: ganlinglan    时间: 2016-1-31 09:33
会不会是延时太短呀
作者: liuzhaoxin1020    时间: 2017-1-1 12:50
延时太短




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1