找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2093|回复: 5
打印 上一主题 下一主题
收起左侧

请教大家一个关于C语言连加算法的问题

[复制链接]
跳转到指定楼层
楼主
ID:691676 发表于 2020-2-27 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  看到一个关于按键长按数值就不断加的程序,但是这个算法真的理解不了,请教大家是什么意思
//按键扫描:放在定时中断中,使用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;
        

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 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;
回复

使用道具 举报

板凳
ID:462827 发表于 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次)里,你想一下,你轻按下键,看似时间极短,但可以已经反复进入了中断了好几次甚至好几十次,稍微再长按一点,就会是几百上千次,然后你再来想这个程序的逻辑,这样应该很容易就能明白。
复制代码
回复

使用道具 举报

地板
ID:691676 发表于 2020-2-28 10:28 | 只看该作者

好的,谢谢指导
回复

使用道具 举报

5#
ID:691676 发表于 2020-2-28 10:29 | 只看该作者
csmyldl 发表于 2020-2-28 00:03
if(KEY1 == 0)              //如果KEY1键按下
        {
                cntk1++;    //在按下的时间段 ...

谢谢指导
回复

使用道具 举报

6#
ID:476489 发表于 2020-2-28 14:30 | 只看该作者
cntk1 > 1100说明按键已经持续按下1秒,触发按键按下标记KeyCode = 1;
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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