创客联盟网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

开思网在线3D打印服务
查看: 21750|回复: 0
打印 上一主题 下一主题

最简按键——按一下亮灯再按一下灭灯

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-16 15:37:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册(开思网用户可以直接登录),结交更多创客好友,享用更多功能,让你轻松玩转创客社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在按键实验的时候,我们学习了用上拉电阻,把接按键检测那个引脚平时钳制在高电平,只有当按键按下才检测到低电平。那有没有更简单的方法呢?

有滴!avr芯片其实引脚内部集成了上拉功能,所以我们做按键实验的时候,如果用上了引脚内部的上拉功能,就再也不用接10K上拉电阻啦

那么如何启动上拉功能呢?

秘密就在引脚初始化的时候:
平时是这样的:pinMode(X,INPUT)
现在是这样的:pinMode(X,INPUT_PULLUP)


PULLUP就是上拉的意思。

那么引脚内部有没有下拉功能呢?是没有的!

另外我们之前做的按键实验是,按住才亮灯,不按就不亮,现在我想要的现象是:按一下亮灯再按一下灭灯

这个程序应该怎么写呢?
如果你把之前的实验做成功了,这个也不会太难,照猫画虎,只是多了一次按键检测。之所以第一次的按键时间没教大家做这个实验是,怕大家理解不了,所以没讲,现在大家入门了。那就来试下这个相对难度大一点的吧!程序那里写了注释,大家理解下就好

硬件接线:

LED正极>>A0
LED负极>>GND(-)

按键一脚>>7
按键另一脚>>GND(-)

程序:
[mw_shl_code=cpp,true]const int button = 7;
const int led = A0;
int flag = 0;
int buttonstate=1;
void setup()
{
    pinMode(button, INPUT_PULLUP);
    pinMode(led, OUTPUT);
}
void loop()
{
    int buttonstate = digitalRead(button); //读回按键状态,按下低电平
    if(buttonstate == LOW) //判断按键状态是否为低电平
    {
        delay(15); //按键感觉不灵敏,可以修改下左右时间
        buttonstate = digitalRead(button); //再读一次,为了躲过按键抖动干扰
        if(buttonstate == LOW)
        {
            flag = !flag;
            digitalWrite(led, flag);//亮,灭LED
            while(!digitalRead(button));//等待按键释放
        }
    }

}[/mw_shl_code]

点击编译下载,然后我们就可以看到现象啦!







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|创客联盟网  

GMT+8, 2024-5-19 09:43 , Processed in 0.013519 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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