cabot168 发表于 2019-9-5 23:12

LZ,第六节我有不懂地方,请解释下,谢谢!
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
   ucKeyLock1=0; //按键自锁标志清零
         uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
}
else if(ucKeyLock1==0)//有按键按下,且是第一次被按下 这里为什么不是(key_sr1==0)我试了改我这样也可以。这句看不明白
{
   ++uiKeyTimeCnt1;//延时计数器
   if(uiKeyTimeCnt1>const_key_time1)
   {
      uiKeyTimeCnt1=0;
      ucKeyLock1=1;//自锁按键置位,避免一直触发
      ucKeySec=1;    //触发1号键
   }
}

李不走寻常路 发表于 2019-9-6 08:22

cabot168 发表于 2019-9-5 23:12
LZ,第六节我有不懂地方,请解释下,谢谢!
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及 ...

else if(ucKeyLock1==0)//有按键按下,且是第一次被按下。能跳转到此句执行隐含之中的条件已经是key_sr1==0,另一个附加条件是ucKeyLock1==0。刚开始看此程序的人确实有些不理解,我当初也是这样。

cabot168 发表于 2019-9-6 09:12

LZ,第六节我有不懂地方,请解释下,谢谢!
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
   ucKeyLock1=0; //按键自锁标志清零
         uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。这条语句也有疑问,按键按下瞬间会出现抖动,抖动过程就是高低电平一直在切换,(IO识别低电平不是完全为0V才为低电平)按键按下那抖动过程IO识别为高,那uikeyTimeCnt1又被清0?
}

李不走寻常路 发表于 2019-9-20 08:50

cabot168 发表于 2019-9-6 09:12
LZ,第六节我有不懂地方,请解释下,谢谢!
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及 ...

是的,抖动过程中,如果按键引脚电平识别为高,则uikeyTimeCnt1被清理。总之记住一条!按键引脚电平连续保持为低到达一定时间后(例如uikeyTimeCnt1>=20,连续保持低电平20MS),才认为按键被可靠按下。

李不走寻常路 发表于 2019-9-20 08:55

leejack 发表于 2018-11-26 15:46
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
   ucKeyLock1=0;...

if(key_sr1==1)
else if(ucKeyLock1==0)
以上两条都不满足的时候,就会执行else if(uiKeyTimeCnt1<const_time_1s) ,你要充分理解ifelse语句的执行原理就好理解了。总之!if 的条件不成立就会执行else 后的语句。

cabot168 发表于 2019-9-21 22:27

第十三节按键长按加速执行里面,
else if(uiKeyTimeCnt1<const_time_1s) //按住累加到1秒
{
   uiKeyTimeCnt1++;
}
这句看不懂,哪位大神帮解释下

李不走寻常路 发表于 2019-9-23 08:33

cabot168 发表于 2019-9-21 22:27
第十三节按键长按加速执行里面,
else if(uiKeyTimeCnt1

哪里看不懂了? 需要清晰地指出来

li123ds 发表于 2019-9-26 12:04


//红外反射开关,接收头HS0038B,发射管用pnp三极管驱动
//第一次上电,灯亮1秒后熄灭,
//手挡一次开,再挡一次关,如此循环
//实验板测试手挡一次开,再挡一次关 开关正常;
//但是有一个问题,如果手一直挡在前面,LED会不停的亮--灭      -- 亮--灭
//请大神们看下,怎样才能做到手挡在前面不移开,保持一种状态
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int

sbit ir=P2^4;    //红外发射
sbit ir_in=P3^2; //红外接收
sbit led=P1^1;        //

uint cont,cont1;
bit flag_key;       //按键按下标志
bit key_lock=0;


void delay(uint z)         //ms
{
      uint x,y;
      for(x=z; x>0; x--)
                for(y=114; y>0; y--);
}


void fa_38k()          //38k 载波                         //接收头前面有滤光片,发射管要用黑色热缩套管套起来
{                                  //不是很准,没有逻辑分析仪,搞不准,现在的反射距离在60厘米左右(发射管串100欧电阻)
      ir=0;                  
      _nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();_nop_();
      
      ir=1;
      _nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();_nop_();
      _nop_();//_nop_();
}

void main()
{
      TMOD |= 0X01;                        //T0定时器,模式1, 16位计数
      TH0 = (65536-1000)/256;//1ms初值 @12MHz晶振
      TL0 = (65536-1000)%256;
      

      ET0=1;
      TR0=1;
      led=0;
      delay(500);
      led=1;
      while(1)
      {
                if(flag==0 )
                {
                        fa_38k();//发38K
                }
                else ir=1;         //停止发射
         
               




        if(ir_in==0)          //手挡住
        {
                flag_key=1;
                cont1++;
                key_lock=1;       
        }
        else flag_key=0; //手移开
       
        if(flag_key==1 && cont1==100)
        {       
               ir=1;
               cont1=0;
               led = !led;
               delay(1000);

        }

       
        if(ir_in==1) cont1=0;        //这句抗干扰很好,遥控器对着按,都没反应                       



      }
}

void timer0() interrupt 1
{
      TH0 = (65536-1000)/256;//重装1ms初值
      TL0 = (65536-1000)%256;
                cont++;
      if(cont==100)
      {      
                cont=0;
                flag=!flag;         //发100ms 38K,停100ms

      }

}

dianzi1987 发表于 2019-9-26 15:26

这帖子实在太棒了,虽然这么多年头了,对于我这个初学者有很大帮助,感谢

GSerendipity 发表于 2019-10-14 16:02

这个后面还有更新吗

chnycdj 发表于 2019-10-26 14:13

不错不错,学习了!

116956018 发表于 2020-6-18 22:22

看了鸿哥的收益良多,能把自己学的分享出来可见鸿哥是心胸宽广之人,希望鸿哥身体健康

yanwu5 发表于 2020-10-9 14:02

要是有讲解视频就好了;{:lol:}

wfw69 发表于 2020-11-27 13:48

现在回头看看,还是入门的好教材!

开溜123 发表于 2021-4-5 12:28

谢谢鸿哥

kqgdlz123 发表于 2021-6-2 15:32

鸿个,写的太好了

kqgdlz123 发表于 2021-6-23 10:55

jianhong_wu 发表于 2015-11-28 01:39
第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。         我今天在做数 ...

看完了,感谢鸿哥,真是感概良多啊,在看到鸿哥的资料前,我蹉跎了进10年,这么好的教材,卖视频的做不错,学校做不出,偏偏鸿哥免费提供,大恩不言谢,好人会有好报。

sdpylee 发表于 2022-2-14 15:37

讲的太好了
谢谢

xianglin 发表于 2022-2-14 19:44

#技术资源# Dianzan.

nwjjdwx 发表于 2022-4-23 17:48

谢谢分享
页: 34 35 36 37 38 39 40 41 42 43 [44] 45
查看完整版本: 从业将近十年!手把手教你单片机程序框架(连载)