找回密码
 立即注册
查看: 233|回复: 1

修改CalculateAdcKey短按为弹起时触发,并增加长短为不同按键值

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

45

主题

69

回帖

1245

积分

金牌会员

积分
1245
发表于 2024-12-21 21:17:45 | 显示全部楼层 |阅读模式

16-ADC检测16个按键,数码管显示键值,按键调整数码管显示内容

修改此函数主要是因为官方的函数原先看不太懂wunai ,现在已经基本理清逻辑。

第一个函数基本功能与官方原始相同,就改变短按触发方式为弹起时触发。

第二个函数长短按触发不同按键值,短按弹起时触发,长按计数到时直接触发,验证此函数功能完整性需在主函数KeyCode中添加以下代码

                if(KeyCode == 21)    //hour +1
                {
		    hour += 2;
                    if(hour >= 24)    hour = 0;
                    DisplayRTC();
                }
                if(KeyCode == 22)    //hour -1
                {
		    hour -= 2;
                    if(hour >= 24)    hour = 23;
                    DisplayRTC();
                }
	        if(KeyCode == 23)    //minute +1
                {
                    second = 0;minute += 2;
                    if(minute >= 60)  minute = 0;
                    DisplayRTC();
                }
                if(KeyCode == 24)    //minute -1
                {
                    second = 0;minute -= 2;
                    if(minute >= 60)  minute = 59;
                    DisplayRTC();
                }
//////////改编长按连续触发adckey函数,短按为弹起时触发

//void CalculateAdcKey(u16 adc)
//{
//		static u8 key_lock_flag = 0;
//		u8  i;
//    u16 j;
//
//	 if(adc < (256-ADC_OFFSET))
//    {
//        ADC_KeyHoldCnt = 0;
//				key_lock_flag = 0;
//				if(ADC_KeyState)
//				{
//					KeyCode  = ADC_KeyState;   //保存键码
//					ADC_KeyState = 0;
//				}
//    }
//	else if(!key_lock_flag) //按键没自锁时
//	{
//		j = 256;
//		for(i=1; i<=16; i++)
//		{
//				if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))  break;  //判断是否在偏差范围内
//				j += 256;
//		}
//	 if(i > 16)  //键无效 清除所有标志
//	 {
//		 ADC_KeyHoldCnt = 0;
//		 key_lock_flag = 0;
//		 ADC_KeyState = 0; 
//	 }
//		else 											//键有效
//		{
//			ADC_KeyHoldCnt++; 		 //开始计数
//			if(ADC_KeyHoldCnt > 3) //计数到
//			{
//				ADC_KeyHoldCnt = 0; //清零计数标志
//				ADC_KeyState = i;		//设置按键值
//				key_lock_flag = 1;	//自锁标志置1,防止按键多次触发
//			}
//		}
//	}
//	else if(ADC_KeyHoldCnt < 100)	//键已按下,未到长按计数
//	{
//		ADC_KeyHoldCnt++;
//		if(ADC_KeyHoldCnt >= 100)		//键已按下,到达长按计数
//		{
//			ADC_KeyHoldCnt = 90;			//1s 10次触发
//			KeyCode  = ADC_KeyState;	//设置按键值
//		}
//	}
//}


////////////改编长短按adckey函数,短按为弹起时触发

void CalculateAdcKey(u16 adc)
{
    static u8 key_lock_flag = 0;		//按键自锁标志,防止连续触发
    static u8 key_short_flag = 0;		//短按标志
    u8  i;
    u16 j;

    if(adc < (256-ADC_OFFSET)) //无按键状态
    {
        ADC_KeyHoldCnt = 0;		//按键计数清零
	key_lock_flag = 0;		//清除按键自锁标志
	if(key_short_flag)		//按键为短按
	{
		key_short_flag = 0;	//清除短按标志
		KeyCode  = ADC_KeyState;   //保存键码
	}
	ADC_KeyState = 0;			//按键状态码清零
    }
	else if(!key_lock_flag) //按键没自锁时
	{
		j = 256;
		for(i=1; i<=16; i++)
		{
				if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))  break;  //判断是否在偏差范围内
				j += 256;
		}
	 if(i > 16)  //键无效 清除所有标志
	 {
		 ADC_KeyHoldCnt = 0;
		 key_lock_flag = 0;
		 ADC_KeyState = 0;  
//		 key_short_flag = 0;
	 }
		else 			//键有效
		{
			ADC_KeyHoldCnt++;  //开始计数
			if(ADC_KeyHoldCnt > 3) //计数到  30ms
			{
				ADC_KeyHoldCnt = 0; //清零计数标志
				ADC_KeyState = i;		//设置短按按键值
				key_lock_flag = 1;	//自锁标志置1,防止按键多次触发
				key_short_flag = 1;	//设置按键为短按状态
			}
		}
	}
	else if((ADC_KeyHoldCnt < 100) && (key_short_flag == 1))  //已按下,未到长按计数
	{
		ADC_KeyHoldCnt++;
		if(ADC_KeyHoldCnt >= 100)				//到达长按计数 1s
		{
			key_short_flag = 0;						//清除短按标志,防止按键弹起时短按触发
			ADC_KeyHoldCnt = 0;						//计数清零
			KeyCode  = ADC_KeyState + 20;	//设置长按按键值
		}
	}
}
回复

使用道具 举报 送花

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

45

主题

69

回帖

1245

积分

金牌会员

积分
1245
发表于 2024-12-23 17:24:02 | 显示全部楼层

问题已另外发帖

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-12 22:39 , Processed in 0.119387 second(s), 53 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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