单片机系列(三)

这篇博客介绍了作者使用单片机实现按键控制LED亮灭的尝试,但遇到按键不灵敏的问题,认为可能是去抖动处理不当。作者分享了源代码,希望能得到改进的建议。程序中包含了按键扫描和防抖动函数,以及LED状态的切换逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单片机实现按键控制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);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值