car-eye 车辆管理开源平台 MCU 系统之 按键扫描处理

在MCU系统中按键处理经常要处理扫描,去抖等操作。按键一般是在定时器开动以后进行扫描处理,如没个一段时间进入

一个按键处理,判断按键的状态当按键持续时间达到一定数值的时候才认为是按键被按下:

void Bsp_Key_Check(void)
{
 static u32 keytime= 0;
 
 if(CheckSysTick((u32 *)&keytime, 20)) //每隔20 ms进入按键处理
 { 
  GetSysTick((u32 *)&keytime);
  Key2GroupCheck();
     Key1GroupCheck();

}

}

按键处理:

void Key2GroupCheck(void)
{
 u16 AdcVal;
 AdcVal = KeyAdcValue[ADC_CALL_CHAN];

 if(AdcVal > ADC_RELEASE_VAL)
 {
  TeleKey.CurState = RELEASE_NULL;
  //MyPrintf("AdcVal [%d]\r\n\r\n",AdcVal);
 }else if((AdcVal < ADC_KEY0_H_VAL) && (AdcVal > ADC_KEY0_L_VAL))
 {
  TeleKey.CurState  = FMON_KEY;
 }
 else if((AdcVal < ADC_KEY1_H_VAL) && (AdcVal > ADC_KEY1_L_VAL))
 {
  TeleKey.CurState = HOME_KEY;
 }
 else if((AdcVal < ADC_KEY2_H_VAL) && (AdcVal > ADC_KEY2_L_VAL))
 { 
  TeleKey.CurState =     CANCEL_KEY;
 }
 else if(AdcVal < ADC_KEY3_VAL)
 {
  TeleKey.CurState =   FMON_KEY;
 }
 //MyPrintf("AdcVal [%d]\r\n\r\n",AdcVal);
 switch(TeleKey.State)
 {
 case RELEASE_NULL:

  if(TeleKey.CurState == RELEASE_NULL)
  {
   TeleKey.aCnt = 0;
   TeleKey.vCnt = 0;
   TeleKey.Sendtofg = 0;
  }else
  {
     
   TeleKey.aCnt = 0;
   TeleKey.vCnt = 0;
   TeleKey.Sendtofg = 0;
   TeleKey.State = TeleKey.CurState ;
  }
  break;
 default:
     if(TeleKey.CurState == TeleKey.State)
  {
   if(TeleKey.aCnt < 5)
   {
    TeleKey.aCnt ++;
   }
   else
   {
    if(TeleKey.Sendtofg == 0)
    {  
     
     TeleKey.Sendtofg = 0xFF;
     KeyState(TeleKey.CurState);
    
     MyPrintf("TeleKey [%d]\r\n\r\n",TeleKey.CurState); 
 #ifdef FM_MODULE
     if(TeleKey.CurState == FMON_KEY)
     {
      if(g_DeviceStatus.FMStatus == DEVICE_OFF )
      {
       MyPrintf("FM ON [%d]\r\n\r\n",TeleKey.CurState);
       AUDIO_MUTE_EN ;
       FM_ON;
       SendFMStatus(ON);
       TimeDly(30); // 150ms//
       Tuner_Init();
       Bsp_Laba_Ctrl(FM_START);
       AUDIO_MUTE_DIS;       
       g_DeviceStatus.FMStatus = DEVICE_ON;
      

      }else
      {
       MyPrintf("FM OFF [%d]\r\n\r\n",TeleKey.CurState);       
       Bsp_Laba_Ctrl(FM_END);
       FM_OFF;
       SendFMStatus(OFF);
       Delay(100);
       g_DeviceStatus.FMStatus = DEVICE_OFF;
      }
     
     } 
#endif      
    }

   }
  }else
  {
   if(TeleKey.vCnt < 3)
   {
    TeleKey.vCnt ++;
   }
   else
   {
    Trace("松开\r\n");
    TeleKey.aCnt = 0;
    TeleKey.vCnt = 0;
    TeleKey.Sendtofg = 0;
    TeleKey.State = RELEASE_NULL;
   } 
  } 
 
  break;
 }   
}


按键处理的去抖动,和扫描完成后一个按键数值才被确定。

相关代码下载:car-eye开源平台网址:https://github.com/Car-eye-admin/ 有关car-eye技术咨询可以加QQ群590411159















车辆管理系统主要负责各种车辆的常规信息管理工作。 系统中的车辆主要有大客车、小轿车和卡车。每种车辆有车辆编号、车牌号、车辆制造公司、车辆购买时间、车辆型号(大客车、小轿车和卡车)、总公里数、 耗油量/公里、基本维护费用、养路费、累计总费用等信息。大客车还有载客量(最大载客数)信息,小轿车还有箱数(两厢或三厢)信息,卡车还有载重量等 信息。 每台车辆当月总费用=油价*耗油量/公里+基本维护费用。 基本维护费用:客车:2000 元/月,小轿车:1000 元/月,卡车:1500 元/月 功能要求: (1)添加车辆:主要完成车辆信息的添加,要求编号唯一。当添加了重复的编号时,则提示数据添加重复并取消添加;当车辆信息库已满,则提示不能再 添加新的数据。 (2)查询车辆:可按照三种方式来查询物品,分别为: 按车辆制造公司查询:输入车辆制造公司,输出所查询的信息,若不存在该记录,则提示“该车辆制造公司不存在!”; 按编号查询:输入编号,输出所查询的信息,若不存在该记录,则提示“该编号不存在!”; 按类别查询:输入类别,输出所查询的信息,若不存在记录,则提示“该类别没有车辆!”; (3)显示车辆信息库:输出当前车辆信息库中所有车辆信息,每条记录占据一行。 (4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。 (5)删除车辆:主要完成车辆信息的删除。如果当前车辆信息库为空,则提示“车辆信息库为空!”,并返回操作;否则,输入要删除的编号,根据编号删 除该车辆的记录,如果该编号不在车辆信息库库中,则提示“该编号不存在”。 (6)统计信息 输出当前车辆信息库中总物品数,以及按车辆类别,统计出当前车辆信息库中各类别的物品数并显示。 (7)车辆信息存盘:将当前程序中的车辆信息存入文件中。 (8)读出车辆信息:从文件中将车辆信息读入程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值