单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
楼主: 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 单片机教程网