标题: 请教大家一个关于C语言连加算法的问题 [打印本页]

作者: gaoky    时间: 2020-2-27 21:33
标题: 请教大家一个关于C语言连加算法的问题
  看到一个关于按键长按数值就不断加的程序,但是这个算法真的理解不了,请教大家是什么意思
//按键扫描:放在定时中断中,使用T0或T1产生中断,每1ms一次
void KeyScan()
{
        static unsigned int cntk1 = 0;      //按键1计数
        static unsigned int cntk2 = 0;
        static unsigned int cntk3 = 0;
        
        if(KEY1 == 0)
        {
                cntk1++;
                if(cntk1 == 10)  KeyCode = 1;   //单次触发
                if(cntk1 > 1100)
                {
                        KeyCode = 1; cntk1 = 1000;  //连续触发
                }
        }
        else  cntk1 = 0;
        
        if(KEY2 == 0)
        {
                cntk2++;
                if(cntk2 == 10)  KeyCode = 2;
                if(cntk2 > 1100)
                {
                        KeyCode = 2; cntk2 = 1000;
                }
        }
        else  cntk2 = 0;
        


作者: csmyldl    时间: 2020-2-28 00:03
if(KEY1 == 0)              //如果KEY1键按下
        {
                cntk1++;    //在按下的时间段不断计数(通过循环)
                if(cntk1 == 10)  KeyCode = 1;   //如果程序循环了10次 但按下的时间未达到1100次,属短按 只作为一次按键 单次触发
                if(cntk1 > 1100)                      //如果时间计数大于1100次 (按键一直按下),每计数10次作为一次按键
                {
                        KeyCode = 1; cntk1 = 1000;  //连续触发
                }
        }
        else  cntk1 = 0;
        
        if(KEY2 == 0)
        {
                cntk2++;
                if(cntk2 == 10)  KeyCode = 2;
                if(cntk2 > 1100)
                {
                        KeyCode = 2; cntk2 = 1000;
                }
        }
        else  cntk2 = 0;

程序未完整提供,程序还有一部分就是KeyCode在没有按键情况下应该有一个值,如KeyCode=0xff;
作者: hantu    时间: 2020-2-28 08:20
  1. void KeyScan()
  2. {
  3.     static unsigned int cntk1 = 0;      //按键1计数
  4.         
  5.     if(KEY1 == 0)
  6.     {
  7.         cntk1++;
  8.         if(cntk1 == 10)  KeyCode = 1;   //单次触发
  9.         if(cntk1 > 1100)
  10.         {
  11.             KeyCode = 1; cntk1 = 1000;  //连续触发
  12.         }
  13.     }
  14.     else  cntk1 = 0;
  15. }

  16. 你先在头脑里把此按键扫描程序简化为只处理一个按键,这样可以让思路更清晰一些。

  17. 若此函数放在定时器中断(每1ms重入1次)里,你想一下,你轻按下键,看似时间极短,但可以已经反复进入了中断了好几次甚至好几十次,稍微再长按一点,就会是几百上千次,然后你再来想这个程序的逻辑,这样应该很容易就能明白。
复制代码

作者: gaoky    时间: 2020-2-28 10:28
hantu 发表于 2020-2-28 08:20

好的,谢谢指导
作者: gaoky    时间: 2020-2-28 10:29
csmyldl 发表于 2020-2-28 00:03
if(KEY1 == 0)              //如果KEY1键按下
        {
                cntk1++;    //在按下的时间段 ...

谢谢指导
作者: 只会吃瓜    时间: 2020-2-28 14:30
cntk1 > 1100说明按键已经持续按下1秒,触发按键按下标记KeyCode = 1;




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1