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
谢谢分享