找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
ID:104180 发表于 2016-1-23 12:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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--);
                }

        }      
}

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

使用道具 举报

沙发
ID:99548 发表于 2016-1-23 12:45 来自手机 | 只看该作者
不大明白您键值扫描程序中的&&相关内容的作用是什么,是为消抖吗?请教。
回复

使用道具 举报

板凳
ID:96682 发表于 2016-1-23 13:43 | 只看该作者
没有错误并不代表就没有问题,还是得再调试调试才行,多多练习没错的。
回复

使用道具 举报

地板
ID:96682 发表于 2016-1-24 23:57 | 只看该作者
把主函数到按键扫描函数以上这段移动到最下面就行,适当修改一下LED
回复

使用道具 举报

5#
ID:96682 发表于 2016-1-25 00:07 | 只看该作者
把主函数到按键扫描函数以上这段移动到最下面就没问题了,如果再减慢一下 LED 的刷新率就更好。
回复

使用道具 举报

6#
ID:99538 发表于 2016-1-26 20:51 | 只看该作者
要加延时才能看清
回复

使用道具 举报

7#
ID:97867 发表于 2016-1-27 11:50 | 只看该作者
             ledvalue=_crol_(ledvalue,1);

这是循环移动 不是每次只移动一位 单片机运行速度快 人眼分辨不出来 你可以加延时  或者 变成每按键一次右移 或者左移 一位
回复

使用道具 举报

8#
ID:104577 发表于 2016-1-27 20:31 | 只看该作者

if(keyNum==1)
     {
              ledvalue=_crol_(ledvalue,1);
              Delay10ms(50);
     }
     else if(keyNum==2);
     {
              ledvalue=_cror_(ledvalue,1);
              Delay10ms(50);
     }
在那个移位循环后面加个延时就好,就是这样。其实就是因为你没加延时,所以闪的很快,我们的眼睛分辨不出来,就感觉是全亮。
回复

使用道具 举报

9#
ID:104788 发表于 2016-1-31 09:33 | 只看该作者
会不会是延时太短呀
回复

使用道具 举报

10#
ID:153199 发表于 2017-1-1 12:50 | 只看该作者
延时太短
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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