EDN首页   博客首页

日志档案

发表于 2007-8-24 7:07:17

4

标签: C51  数码管  实验板  按键程序  C语言编程  

昨晚调试的一个小程序...

今天晚上用实验板写了一个LED数码管和按键的程序...

主要功能是...利用实验板上的二个按键实现数字的加减...

通电后,数码管显示0;然后按板上的+键,数字会从0一直加到最大9999为止.

如果按-键则一直减到0为止...整个程序很简单...HE HE...

大家可以把这个程序下载到板中实验下...

昨晚搞到一点多...收获就是...对编程有了一种新的认识...以前对编程的理解是通达到功能就可以...HE HE...经过昨晚朋友的指点.本来程序写完有670字节...经过简化小了很多...最后简化到512字节...HE HE...把没必要的语句和变量可以省掉.复杂的判断用简单的方式完成...

比如我昨晚...一个判断是用三行....经朋友指点...换成二行...编译的出来的代码马上少了60字节...HE HE...

 if(!P21)
 {     
   if(Led_data)
   Led_data-=1;
      //上面二行可以代替下面三行.HE HE...
      //这样能省不少代码呀;
      //Led_data--;
      //if((Led_data==0)|(Led_data>65534))
      //Led_data=0;
    }

本来我是用下面三行的...朋友给我上面二行.我一看呀...我晕...这样也能解决问题...H EHE...

这就是菜鸟和高手的区别...还得努力...HE HE....

欢迎大家一起讨论....希望有高手提出更能精简的方案..HE HE.

#include<at89x52.h>

#define uint  unsigned int
#define uchar unsigned char


sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;

sbit P24 =P2^4;
sbit P20 =P2^0;
sbit P21 =P2^1;

uchar Led_Number[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                     0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82};

uchar One,Two,Three,Four;
uint  Led_data=0;


void Delay(uint x);
void Display(void);
void Key(void);
void Led_Analyze(uint i);

void main()
{
  //uchar i;
  while(1)
  {
   Display();
   Key();

  }
}


void Key(void)
{
  uchar i;
  P24=0;
  if(!P20)
    {
    for(i=0;i<10;i++)
 Display();
 if(!P20)
 {
   Led_data++;
      if(Led_data>=9999) Led_data=9999;
 }
 }
  if(!P21)
    {
    for(i=0;i<10;i++)
 Display();
 if(!P21)
 {     
   if(Led_data)
   Led_data-=1;
      //上面二行可以代替下面三行.HE HE...
      //这样能省不少代码呀;
      //Led_data--;
      //if((Led_data==0)|(Led_data>65534))
      //Led_data=0;
    }
 }
    Led_Analyze(Led_data);
}

void Led_Analyze(uint i)
{
  One="i/1000";
  Two=(i/100)%10;
  Three=(i%100)/10;
  Four=(i%100)%10;
}

void Delay(uint x)
{
  while(--x);
}

void Display()
{
  if(One)
    {
      LED0=0;
      P0=Led_Number[One];
      Delay(100);
      LED0=1;
    }
  if(One|Two)
    {
      LED1=0;
      P0=Led_Number[Two];
      Delay(100);
      LED1=1;
    }
  if(One|Two|Three)
    {
      LED2=0;
      P0=Led_Number[Three];
      Delay(100);
      LED2=1;
    }
   
      LED3=0;
      P0=Led_Number[Four];
      Delay(100);
      LED3=1;
}
     

   

系统分类: 单片机   |   用户分类: 单片机编程   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(1096)    回复(9)  

投一票您将和博主都有获奖机会!

最新评论

  • 展翅飛翔

    2007-8-24 7:58:25

    我还看不懂  呵呵

  • zyhorse2010

    2007-8-24 8:55:06

    谢谢老大了

        不仅为我们做了板子

    还自己写教程带领我们

       真的很感激

  • wang1jin

    2007-8-24 9:58:20

    一起学习吧.我也很菜.只有坚持一天学一点才能进步.

  • a1z26

    2007-8-28 13:38:07

    不错,学习

  • pa2792

    2007-9-4 21:55:59

    请问楼主,PADS这么转WG?

  • wang1jin

    2007-9-4 22:03:50

    去小软件共享中找一找.

  • yangyinyan

    2007-10-26 20:43:31

    今天刚看到这个博客,犹如发现了宝藏,里面内容很全,不知达人是从事哪行的?既然有如此全面的知识……佩服佩服

  • wang1jin

    2007-10-26 21:34:23

    哈哈.我是菜鸟呀...东搞一下西搞一下...

    不过现在总算有个明确的目标了.

  • 刘浩杰

    2007-11-5 17:55:35

    两行的容错性没有三行的好,有时候技巧不是技术,要搞明白