weixin_50697999 2021-11-16 12:10 采纳率: 73.7%
浏览 192
已结题

51单片机如何实现 按下按键执行某函数或语句,松开后停止执行这个函数或语句

在做一个51小车,用定时器扫描按键状态。来控制加速和减速。
想实现的功能是,按住加速按键,执行加速函数,同时LED亮,松开就不再加速,灯灭,跳出。

LED1=P1^0;
LED2=P1^1;
void main(void)
{
  unsigned char Key_Value=0;
  Timer0_Init();
  while(1)
  {
    Key_Value=getKey_Value();
    switch(Key_Value)
    {
      case 1:LED1=1;Speed_UP();break;
      case 2:LED2=1;Speed_Down();break;
    }
  }
}

我把case1:改成

case 1:
{
      while(Key_Value==1)
      {
          Speed_UP();
          LED1=1;
          Key_Value=getKey_Value();
      }
      LED1=0;
      break;
}
case 2:
{
      while(Key_Value==1)
      {
          Speed_Down();
          LED2=1;
          Key_Value=getKey_Value();
      }
      LED2=0;
      break;
}

可是还是一直在执行。应该如何修改呢?
下面是中断函数:

void Timer0_ISR(void) interrupt 1
{
    static unsigned int Timer0_Count=0;
    TL0=0x18;
    TH0=0xFC;                                
    Timer0_Count++;
    if(Timer0_Count>=20)
    {
        Timer0_Count=0;
        Key_Scan_Loop();
    }
}

这里是Key.c里的

unsigned char getKey_State(void)
{
    unsigned char Key_Num=0;
    
    if(Key_OpenHeadLights==0){Key_Num=1;}
    if(Key_BrakeMotor==0){Key_Num=2;}
    if(Key_SpeedUpMotor==0){Key_Num=3;}
    if(Key_BackMotor==0){Key_Num=4;}
    
    return Key_Num;
}
void Key_Scan_Loop(void)
{
    static unsigned char Key_NowState=0;    //按键现在状态
    static unsigned char Key_LastState=0;        //按键上次状态
    
    Key_LastState=Key_NowState;
    Key_NowState=getKey_State();
    
    if(Key_LastState==0&&Key_NowState==1)
    {
        Key_Number=1;
    }
    if(Key_LastState==0&&Key_NowState==2)
    {
        Key_Number=2;
    }
    if(Key_LastState==0&&Key_NowState==3)
    {
        Key_Number=3;
    }
    if(Key_LastState==0&&Key_NowState==4)
    {
        Key_Number=4;
    }
}
unsigned char getKey_Value(void)
{
    unsigned char Key_Temp=0;
    
    Key_Temp=Key_Number;
    Key_Number=0;
    
    return Key_Temp;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月24日
    • 修改了问题 11月16日
    • 创建了问题 11月16日

    悬赏问题

    • ¥15 现在新建了一个f1的就不行了包括所有新建的项目都无法生成,路径命名都没问题,keil和cubemx重装过还是不行,如何解决?(标签-java|关键词-固件)
    • ¥15 web前端开发怎么实现像图片这样的页面啊?
    • ¥15 ubuntu 20.04 网卡启用后,只有ipv6 没有 ipv4 无法上网
    • ¥15 QT任务管理器无法正确获取展开,有悬赏15元速求,如何解决?(相关搜索:标识符|结构体)
    • ¥15 使用delphi 10.3+intraweb 生成的页面怎么实现自动滚屏
    • ¥20 思科:Router c3600 MN-4E插槽
    • ¥15 16进制修改视频的元数据
    • ¥15 HTML中css的位置信息居然会导致元素大小发生变化
    • ¥15 岛津txt格式文件转nirs格式
    • ¥15 有偿指导软件编程与八股