打印

用单片机的一个普通IO口实现按键和指示灯的控制

[复制链接]
楼主: tanpinwu
手机看帖
扫描二维码
随时随地手机跟帖
21
功能上还是可以实现的,看要求是不是很严格,IO初始化为输出低
每隔10ms设置为输入检测按键,
1、在LED亮的状态下按键按下会导致LED灭(也不影响逻辑,反正亮的状态按键就是该灭)
2、设置为输入瞬间如果LED在灭的状态可能LED会闪一下(检测按键时间要尽量短,一般就是us级别的,不会很明显)

使用特权

评论回复
22
创隆电子| | 2013-8-19 13:09 | 只看该作者
这种现象在横多设备中都有,比如遥控的开关不就是一个按键吗?解决上面的办法横简单,楼主可把你现在的程序给我,我帮你看看、改改,告诉你问题出在哪,当让了你也可以加非门,把LED的信号‘非’一下再给按键,程序只管把案件的状态再给LED,不过只讨论程序,这种方法不要用。我的QQ;42955683

使用特权

评论回复
23
创隆电子| | 2013-8-19 13:11 | 只看该作者
看错了

使用特权

评论回复
24
创隆电子| | 2013-8-19 13:14 | 只看该作者
你这图画的有问题吧,以你的图看,是不是想实验动态扫描中片选接按键的电路。

使用特权

评论回复
25
创隆电子| | 2013-8-19 13:24 | 只看该作者
是不是想实现这种功能

QQ图片20130819132240.jpg (29.31 KB )

QQ图片20130819132240.jpg

使用特权

评论回复
26
mcu5i51| | 2013-8-19 13:46 | 只看该作者
思路可行,电路有错

使用特权

评论回复
27
dog_xin| | 2013-8-19 14:10 | 只看该作者
这个图,吧、不够理想,14#的图比较好

使用特权

评论回复
28
lanchong1980| | 2013-8-19 14:24 | 只看该作者
够用了吧

使用特权

评论回复
29
DYCN| | 2013-8-19 14:30 | 只看该作者
用个自锁开关不就不就搞定了!
理论是没有问题的,但很可能你的灯的亮度会有问题,要加一级三极管驱动会比较好。并且可以在三极管的基极增加一个小电容去除灯的闪烁。

使用特权

评论回复
30
新光科技| | 2013-8-19 14:47 | 只看该作者
赞成楼上观点,硬件比软件好解决的多,也稳定。

使用特权

评论回复
31
tergy2012| | 2013-8-19 15:58 | 只看该作者
路过学习的

使用特权

评论回复
32
cubasa| | 2013-8-19 17:37 | 只看该作者
LED用负逻辑,=0时亮,=1时灭。就是14楼的办法。
给个定时中断,比如20ms一次,迅速变高检查一下按键的状态再返回。应该不会影响到LED的显示的。

使用特权

评论回复
33
tanpinwu|  楼主 | 2013-8-19 22:20 | 只看该作者
coody 发表于 2013-8-19 10:16
LZ的按下键,LED就会灭掉。我用STC倒是做过,键与LED不会有明显干涉。

是不是改成STC就可以啊,图上的电阻参数可以改,只要功能上能实现就可以。我见别人做过,是可以实现的,可是不知道程序怎么编。

使用特权

评论回复
34
6825681| | 2013-8-19 22:25 | 只看该作者
led取反可以吗???

使用特权

评论回复
35
tanpinwu|  楼主 | 2013-8-19 22:32 | 只看该作者
joyme 发表于 2013-8-19 11:09
功能上还是可以实现的,看要求是不是很严格,IO初始化为输出低
每隔10ms设置为输入检测按键,
1、在LED亮的 ...

要求不严格,只要功能上能实现就可以了,而且灯灭的状态其实不是完全灭,而是微亮状态(此时io口输出的是个占空比较低的方波)

使用特权

评论回复
36
xyz549040622| | 2013-8-19 23:21 | 只看该作者
如果单纯要达到你的功能,直接用开关不就OK么

使用特权

评论回复
37
2012CMD| | 2013-8-20 06:22 | 只看该作者
以前网上看到的这个,PROTEUS可以实现,电路为#14

可以在一个口上同时实现两种不同功能。举例:1S的工作周期,其中990ms做输出用来点亮指示灯,10ms做输入检测外围信号,灯灭10ms人眼是分辨不了的,这样就实现了一个口同时支持两种不同的功能。

使用特权

评论回复
38
HDU_LHT| | 2013-8-21 00:46 | 只看该作者
在6楼的两次回复合并修改了一下
sbit led=P1^7;
sbit key=P1^7;
unsigned char x=0;//临时变量,用于判断按键按下led的亮灭状态
while(1)
{
  key=1;//由于端口复用,所以如果灯是熄灭状态时(即key=0),需要先将端口重新设置为输入,以判断按键是否按下
  if(key==0)
{
   if(x==0)
   {
      x=1;
    }
   else
   {
      x=0;
    }
}

if(x==0)
{
   led=0;
   delay();//适当延时一下,保证视觉暂留并充当按键消抖
}
else
{
   led=1;
   delay();//适当延时一下,保证视觉暂留并充当按键消抖
}
}总结一下,这个复用的端口其实一直在循环判断,只是灯亮的时候是key=1(端口输入设置)到led=1的变换;灯灭是key=1到led=0的变换,但由于延时led=0占主要部分,key=1时间很短所以感觉不到

使用特权

评论回复
39
electrictor| | 2013-8-21 09:05 | 只看该作者
这样不行的,一上电灯就会亮的

使用特权

评论回复
40
京江自动化| | 2013-8-21 21:37 | 只看该作者
ningling_21 发表于 2013-8-18 17:49
x是一个变量
led 和key 都是一个IO口。

我看看我觉得不行啊,按你的电路图,只有p口为低电平才会点亮的,这样就不能检测键是否按下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则