找回密码
 立即注册
查看: 319|回复: 7

官方的adc按键程序,感觉效率不高啊

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-04-10 16:59:05

45

主题

69

回帖

1225

积分

金牌会员

积分
1225
发表于 2024-12-23 20:37:05 | 显示全部楼层 |阅读模式

可能是我程序分析有问题:

void CalculateAdcKey(u16 adc)
{
    u8  i;
    u16 j;
  
    if(adc < (256-ADC_OFFSET))   //无按键时
    {
        ADC_KeyState = 0;   //键状态归0
        ADC_KeyHoldCnt = 0;
    }

		////////////根据adc值查找i值
    j = 256;
    for(i=1; i<=16; i++)
    {
	if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))  break;  //判断是否在偏差范围内
	j += 256;
    }

		//相当于消抖,等待按键稳定,至少连续3次查找 30ms
    ADC_KeyState3 = ADC_KeyState2;
    ADC_KeyState2 = ADC_KeyState1;

    if(i > 16)  ADC_KeyState1 = 0;  //键无效
    else                        //键有效
    {
	ADC_KeyState1 = i;
	if((ADC_KeyState3 == ADC_KeyState2) && (ADC_KeyState2 == ADC_KeyState1) &&
	  (ADC_KeyState3 > 0) && (ADC_KeyState2 > 0) && (ADC_KeyState1 > 0))
	{
		if(ADC_KeyState == 0)   //第一次检测到
		{
		  KeyCode  = i;   //保存键码
		  ADC_KeyState = i;   //保存键状态
		  ADC_KeyHoldCnt = 0;
		}
		if(ADC_KeyState == i)   //连续检测到同一键按着
		{
		  if(++ADC_KeyHoldCnt >= 100) //按下1秒后,以10次每秒的速度Repeat Key
		  {
			ADC_KeyHoldCnt = 90;
			KeyCode  = i;   //保存键码
		  }
		}
		else ADC_KeyHoldCnt = 0; //按下时间计数归0
	}
    }
}

下面这段没必要每次进函数都执行一遍,还是个for循环,应该有按键按下时才执行。

相当于无按键时,每10ms进函数执行一次delay_us(n);

////////////根据adc值查找i值
		j = 256;
		for(i=1; i<=16; i++)
		{
				if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))  break;  //判断是否在偏差范围内
				j += 256;
		}

		//相当于消抖,等待按键稳定,至少连续3次查找 30ms
		ADC_KeyState3 = ADC_KeyState2;
		ADC_KeyState2 = ADC_KeyState1;

		if(i > 16)  ADC_KeyState1 = 0;  //键无效
                else
                {...........

优化后的程序,先判断有无按键,无按键清零几个状态直接退出函数。(只执行相应分支)

void CalculateAdcKey(u16 adc)
{
    u8  i;
    u16 j;
  
    if(adc < (256-ADC_OFFSET))   //无按键时
    {
        ADC_KeyState = 0;   //键状态归0
        ADC_KeyHoldCnt = 0;
        ADC_KeyState1 = 0;
    }
    else    //有按键时
    {
		////////////根据adc值查找i值
      j = 256;
      for(i=1; i<=16; i++)
      {
	if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))  break;  //判断是否在偏差范围内
	j += 256;
      }

		//相当于消抖,等待按键稳定,至少连续3次查找 30ms
      ADC_KeyState3 = ADC_KeyState2;
      ADC_KeyState2 = ADC_KeyState1;

	ADC_KeyState1 = i;
	if((ADC_KeyState3 == ADC_KeyState2) && (ADC_KeyState2 == ADC_KeyState1) &&
	  (ADC_KeyState3 > 0) && (ADC_KeyState2 > 0) && (ADC_KeyState1 > 0))
	{
		if(ADC_KeyState == 0)   //第一次检测到
		{
		  KeyCode  = i;       //保存键码
		  ADC_KeyState = i;   //保存键状态
		  ADC_KeyHoldCnt = 0;
		}
		if(ADC_KeyState == i)   //连续检测到同一键按着
		{
		  if(++ADC_KeyHoldCnt >= 100) //按下1秒后,以10次每秒的速度Repeat Key
		  {
			ADC_KeyHoldCnt = 90;
			KeyCode  = i;   //保存键码
		  }
		}
		else ADC_KeyHoldCnt = 0; //按下时间计数归0
	}
    }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-02 14:37:11
已绑定手机

77

主题

4850

回帖

8384

积分

超级版主

DebugLab

积分
8384
发表于 2024-12-23 23:07:39 | 显示全部楼层
你来写个效率高的,加油
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:348
  • 最近打卡:2025-05-02 08:34:59

7

主题

281

回帖

1055

积分

金牌会员

积分
1055
发表于 2024-12-24 07:26:54 | 显示全部楼层
学习学习,找时间试一试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-12-24 07:53:06 | 显示全部楼层

怎么改才高效率呢?大家企盼着

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-12-24 08:21:08 | 显示全部楼层
这才多少代码,效率怎么不高,又没有什么复杂算法
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-04-10 16:59:05

45

主题

69

回帖

1225

积分

金牌会员

积分
1225
发表于 2024-12-24 08:27:27 | 显示全部楼层
bkeu*** 发表于 2024-12-24 08:21
这才多少代码,效率怎么不高,又没有什么复杂算法

每10ms都执行一次,没必要,而且能避免,就加个else而已,改也不复杂
相当于无按键时,每10ms进函数执行一次delay_us(n);
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-12-24 08:40:44 | 显示全部楼层
xujib*** 发表于 2024-12-24 08:27
每10ms都执行一次,没必要,而且能避免,就加个else而已,改也不复杂

没有具体分析代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-12-24 08:57:39 | 显示全部楼层
分析了一下,你的改进可以
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 22:08 , Processed in 0.154428 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表