找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: Similarv
打印 上一主题 下一主题
收起左侧

请工程化,定制化你的单片机代码

    [复制链接]
回帖奖励 40 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
楼主
ID:569384 发表于 2021-2-24 11:50 | 显示全部楼层
以前从来没有人教过这些,后来真正做产品的时候慢慢理解了,程序中绝对不用while或delay(),可以想象整个程序就像一个车轮,一直在转圈圈,4ms转一圈,所有功能4ms执行一次,如果中途有while那么车轮就会卡顿卡顿,如果需要延时可以用一个变量进行计数,计数到100次后就执行相应的程序,比如如果是4ms转一圈,那么100次就等于400ms的延时了,这样就不会影响其他程序的执行。
回复

使用道具 举报

沙发
ID:569384 发表于 2021-2-24 12:08 | 显示全部楼层
Similarv 发表于 2019-8-2 20:36
我不是给了个keyPress()程序么,你再好好看看。
简单来说,有键按下时,时间就会++;
无键按下时,时间 ...

我自己的经验是:在定时里做一个4ms的标志位,主程序里面用这个4ms扫描一次按键,有按下,计数++,无按下计数清零,加一个按下松开标志位,按下计数达到3次(消抖值)后判为成功按下并且按下松开标志位=1,未松开就不做第二次按下计数;写的有点乱,写个伪代码:

定时器中断函数()
{//假设定时中断时间是250us
     4ms计数++;
     if(4ms计数 >= 16)//4ms/250us=16
     {
            4ms计数 = 0;
            4ms标志位 = 1;
     }
}


main()
{
     while(1)
    {
        if(4ms标志位)
        {
              4ms标志位 = 0;
              keypress();
              其他功能函数();
        }
    }
}

void keypress()
{
        if(按键io口 == 0)//假设低电平为按下
        {
             if(按下松开flag == 0)
             {
                    按下计数++;
                    if(按下计数 >= 5)
                   {
                           按下计数 = 0;
                           按下松开flag = 1;
                           //按键按下
                   }
              }
        }
        else
        {
               按下计数 = 0;
               按下松开flag = 0;//松开后标志位清零,可以检测下一次按键
        }
}
回复

使用道具 举报

板凳
ID:569384 发表于 2021-3-31 16:29 | 显示全部楼层
hhh402 发表于 2021-3-6 10:45
不是绝对不能用while或delay(),只是要少用,几个微秒的延时还是可以用的,只是毫秒级别的延时要少用,还 ...

是比喻错了
回复

使用道具 举报

地板
ID:569384 发表于 2021-8-31 09:06 | 显示全部楼层
delay有毒
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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