xujibicool 发表于 2024-12-21 21:17:45

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

<p>16-ADC检测16个按键,数码管显示键值,按键调整数码管显示内容</p>
<p>修改此函数主要是因为官方的函数原先看不太懂<img alt="wunai" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/wunai.gif" title="wunai" /> ,现在已经基本理清逻辑。</p>
<p>第一个函数基本功能与官方原始相同,就改变短按触发方式为弹起时触发。</p>
<p>第二个函数长短按触发不同按键值,短按弹起时触发,长按计数到时直接触发,验证此函数功能完整性需在主函数KeyCode中添加以下代码</p>
<pre><code>                if(KeyCode == 21)    //hour +1
                {
                  hour += 2;
                  if(hour &gt;= 24)    hour = 0;
                  DisplayRTC();
                }
                if(KeyCode == 22)    //hour -1
                {
                  hour -= 2;
                  if(hour &gt;= 24)    hour = 23;
                  DisplayRTC();
                }
                if(KeyCode == 23)    //minute +1
                {
                  second = 0;minute += 2;
                  if(minute &gt;= 60)minute = 0;
                  DisplayRTC();
                }
                if(KeyCode == 24)    //minute -1
                {
                  second = 0;minute -= 2;
                  if(minute &gt;= 60)minute = 59;
                  DisplayRTC();
                }
</code></pre>
<pre><code>//////////改编长按连续触发adckey函数,短按为弹起时触发

//void CalculateAdcKey(u16 adc)
//{
//                static u8 key_lock_flag = 0;
//                u8i;
//    u16 j;
//
//       if(adc &lt; (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&lt;=16; i++)
//                {
//                                if((adc &gt;= (j - ADC_OFFSET)) &amp;&amp; (adc &lt;= (j + ADC_OFFSET)))break;//判断是否在偏差范围内
//                                j += 256;
//                }
//       if(i &gt; 16)//键无效 清除所有标志
//       {
//               ADC_KeyHoldCnt = 0;
//               key_lock_flag = 0;
//               ADC_KeyState = 0;
//       }
//                else                                                                                         //键有效
//                {
//                        ADC_KeyHoldCnt++;                //开始计数
//                        if(ADC_KeyHoldCnt &gt; 3) //计数到
//                        {
//                                ADC_KeyHoldCnt = 0; //清零计数标志
//                                ADC_KeyState = i;                //设置按键值
//                                key_lock_flag = 1;        //自锁标志置1,防止按键多次触发
//                        }
//                }
//        }
//        else if(ADC_KeyHoldCnt &lt; 100)        //键已按下,未到长按计数
//        {
//                ADC_KeyHoldCnt++;
//                if(ADC_KeyHoldCnt &gt;= 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;                //短按标志
    u8i;
    u16 j;

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

xujibicool 发表于 2024-12-23 17:24:02

<p>问题已另外发帖</p>
页: [1]
查看完整版本: 修改CalculateAdcKey短按为弹起时触发,并增加长短为不同按键值