微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 自学中遇到的LED电灯问题,求点化!

自学中遇到的LED电灯问题,求点化!

时间:10-02 整理:3721RD 点击:

本人是单片机菜鸟——
这是本人正在学习单片机当中,自己编写的LED灯按钮程序;
希望能够每按下按钮,LED等就能左移一位;
按钮长按没有效果;
松手后,再按,LED灯再左移一位。
程序如下;
编译生成hex后,按一下确实左移一位;
不过再怎么按都不再有变化;
百思不得其解;
求各位大大点化~~!

#include<reg51.h>
#define led P2
sbit k1=P0^0;(按键K1与P0^0连接)
void delay10ms()
{
  unsigned char a,b,c;
    for(a=1;a>0;a--)
       for(b=38;b>0;b--)
          for(c=130;c>0;c--);
}

void main(void)
{
   unsigned int u,i,j;
   j=0x01;
   u=0x01;
   i=1;
   led=j;
   while(1)
   {
      if(k1==0)
      {
         delay10ms();
         if(k1==0)
         {
            led=j+u;
            delay10ms();
            while(i>3)
            {
               if(k1==0)
               {
                  i--;
               }
               if(k1==1)
               {
                  u=u+0x01;
                  i=i+3;
               }
            }
         }
      }
   }
}

你的这段程序LED初值为j(j=1),后续在while(1)循环中给LED赋值的语句只有LED=j+u (j+u=2),而此时唯一会改变j或u的数值的语句在while(i>3)循环内,在进入while(i>3)循环前,没有任何地方语句会将i的值改变到 >3;
所以,while(i>3)循环永远都不会执行;
所以,j 和 u 的值在永远都不会改变;
所以,只要K1按下,LED输出永远都是 j+u=2;
所以,看上去LED移动了一位,然后就再也不动了;

你程序里有个错误,while(i大于3);i刚开始初始化时1;所以程序一直停留在第一次while循环中。而且你的j和u一直没变。所以灯一直不变。
想知道你有多少个led灯,为什么这么写

这个小难题用软件仿真看看寄存器里的数据就知道问题出在哪里了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top