单片机系列(三)

来源:互联网 发布:linux sleep精度 编辑:程序博客网 时间:2024/05/18 13:48

单片机实现按键控制led的亮灭,感觉写的很不成功,按键很不“灵”。我的本意是想当有按键按下时点亮相应的灯,如果同一个键被按下两次则第二次为熄灭对应的那个灯。

程序中有点问题,并不是能很好的实现功能,应该是去抖动那块做的不好。对软件去抖动还不是很熟悉,想日后好好做一下,现在也将源代码贴上来,如果有心人能帮着改一下将不胜感激!这样的学习应该更刻骨铭心!

/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
||       FileName: key.c                                                                   ||
||       Function: 实现一个按键控制一个灯的亮灭                                  ||
||                      如果两次按下同一个键则一个为,                                 ||
||                      一个为灭                                                                ||
||       Author  : Softstone                                                             ||
||       Date    : 2007/04/21                                                           ||
||       Email   : softstonechwch@126.com                                     ||
||       Tips    : 对按键的扫描不能除去抖动                                           ||
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
 */
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define LED  P0   //LED接在P0口上,使用低四位,P0^0——P0^3
#define KEY  P2   //按键接着P2口,也是低四位


sbit LedCs= P3^7;

//函数声明
void Delay(void);
void KeyScan(void);


void main()

 KEY   = 0xff;
 LED   = 0xff;
 LedCs = 0;     //开LED使能端
  
 while (1)
 {
  KeyScan();
 }
}

/*##########################
    按键扫描并且点亮LED。
*/
void KeyScan()
{
 uchar lastKey;
 uchar currentKey;

  
 currentKey = KEY;
 currentKey |= 0xf0;
  
 if (currentKey != 0xf0 )
 {  
  Delay();       /*防抖动,具体最小时间也不甚清楚,
          延迟过大则会出现有时按键后灯不亮*/
  currentKey = KEY;
  currentKey |= 0xf0;

  if ((currentKey == lastKey) && (LED !=0xff)) //判断是否有键按下,且是否为第二次按键相同的键。
  {
   LED = 0xff; 
  }


     else if ((currentKey == lastKey) && (LED ==0xff))//如果为第一次按下键,则点亮相应的灯。
  {
   switch (currentKey)
   {
    case 0xfe: LED = 0xfe; break;
    case 0xfd:  LED = 0xfd; break;
    case 0xfb: LED = 0xfb; break;
    case 0xf7:  LED = 0xf7; break;
    default: break;
   }
  }

  else     //如果没有键按下则保持原来的状态。
  {
   switch (currentKey)
   {
    case 0xfe: LED = 0xfe; break;
    case 0xfd:  LED = 0xfd; break;
    case 0xfb: LED = 0xfb; break;
    case 0xf7:  LED = 0xf7; break;
    default: break;
   }
  }

 
  lastKey = LED;
 
 }

}

/*############################
          延时程序
*/
void Delay()
{  
 unsigned int  kk=0x9fff;
    do{_nop_();kk--;}
    while(kk!=0);
}

 

 

原创粉丝点击