找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6768|回复: 18
收起左侧

怎样用单片机C语言编写一个按钮按一下LED一直亮,再按一下一直灭?

  [复制链接]
ID:103131 发表于 2021-4-22 17:18 | 显示全部楼层 |阅读模式
  由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现,谢谢大家

    用C语言编写,用一个按钮和LED灯,按一下一直亮,不灭,然后再按一下就一直灭?
回复

使用道具 举报

ID:910466 发表于 2021-4-22 19:40 | 显示全部楼层
检测与按钮连接的端口是否处于低电平(或者高电平),如果检测到端口低电平(高电平),就令与led相连的端口高(低)
回复

使用道具 举报

ID:103131 发表于 2021-4-22 19:45 | 显示全部楼层
grant110 发表于 2021-4-22 19:40
检测与按钮连接的端口是否处于低电平(或者高电平),如果检测到端口低电平(高电平),就令与led相连的端 ...

我可以在低电平LED1 = 0 上面给个while()吗?
回复

使用道具 举报

ID:103131 发表于 2021-4-22 19:46 | 显示全部楼层
grant110 发表于 2021-4-22 19:40
检测与按钮连接的端口是否处于低电平(或者高电平),如果检测到端口低电平(高电平),就令与led相连的端 ...

我想要的是有没有这样的程序?
回复

使用道具 举报

ID:910466 发表于 2021-4-22 19:52 | 显示全部楼层
外面就是while(1==key)
回复

使用道具 举报

ID:103131 发表于 2021-4-22 20:27 | 显示全部楼层
grant110 发表于 2021-4-22 19:52
外面就是while(1==key)

那就可以一直低电平状态?
回复

使用道具 举报

ID:910513 发表于 2021-4-22 20:31 | 显示全部楼层
goldbirderman 发表于 2021-4-22 20:27
那就可以一直低电平状态?

是的。
while(1==key)
{
GPIO=1;
}
回复

使用道具 举报

ID:883167 发表于 2021-4-22 21:07 | 显示全部楼层
这个简单,就直接用检测按键,然后用松键检测(!key),IO口取反即可,例如 D1=~D1
回复

使用道具 举报

ID:756277 发表于 2021-4-22 21:14 | 显示全部楼层
while(1)
{
    if(0 == KEY)
     {
          delay(15);
          if(0 == KEY)
          {
                 LED =~LED;
          }
      }
}
回复

使用道具 举报

ID:103131 发表于 2021-4-22 21:21 | 显示全部楼层
林大侠 发表于 2021-4-22 21:07
这个简单,就直接用检测按键,然后用松键检测(!key),IO口取反即可,例如 D1=~D1

这个试过了,按钮放手灯就灭掉
回复

使用道具 举报

ID:894154 发表于 2021-4-23 09:00 | 显示全部楼层
按键防抖后加松手检测 while(!key);
回复

使用道具 举报

ID:723547 发表于 2021-4-23 09:09 | 显示全部楼层
goldbirderman 发表于 2021-4-22 21:21
这个试过了,按钮放手灯就灭掉

if(key==1)//检测按下,
{
while(!key);//放开
   led=~led;
}
回复

使用道具 举报

ID:909627 发表于 2021-4-23 09:45 | 显示全部楼层
按下去之后给一个返回值
回复

使用道具 举报

ID:891208 发表于 2021-4-23 09:51 | 显示全部楼层
可以用中断的方法实现。不用中断的话,用死循环也行。不同的电路连接方法,编程不一样
回复

使用道具 举报

ID:326430 发表于 2021-4-23 10:44 | 显示全部楼层
你用个标志位不就行了,按一下改变一次标志位的值,然后判断该值控制亮灭。区分长按,长按不要改变标志位。
回复

使用道具 举报

ID:495628 发表于 2021-4-23 17:06 | 显示全部楼层
一、如果按钮使用的是带自锁的(可以理解成单刀双掷开关)
那么就可以检测按键状态,Key==1.则点亮,若Key==0,则熄灭;

二、如果按钮使用的是轻触开关BUTTON,
方法一:反转法
led=0;   //先给led一个初始值
if(key==1)//按键按下,
{
while(!key);//按键释放放开
   led=~led;
}


方法二:中断法
led=0;   //先给led一个初始值
interrupt key==1;
led=~le
回复

使用道具 举报

ID:808700 发表于 2021-4-23 17:45 | 显示全部楼层
设置一个变量,按下一次改变一次变量,根据变量来控制灯的亮灭
回复

使用道具 举报

ID:796531 发表于 2021-4-23 22:44 | 显示全部楼层
lxbhcy 发表于 2021-4-23 17:45
设置一个变量,按下一次改变一次变量,根据变量来控制灯的亮灭

我也觉得是这样,按一次 计数1 ,第二次计数2 ,计数大于2就死循环不就行了,最好结合中断来实现按键的检测

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:569384 发表于 2021-4-28 11:17 | 显示全部楼层
按键的程序先处理好啊,按一次就处理一次代码,按键扫描也要消抖和做按下提起判断。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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