鱼C论坛

 找回密码
 立即注册
查看: 1498|回复: 16

[已解决]单片机用两个按键控制8个LED小灯

[复制链接]
发表于 2022-2-13 21:06:22 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 救赎自我- 于 2022-2-13 21:07 编辑

各位前辈们 鄙人单片机小白 想着用单片机K1 K2两个按键分别实现LED四个小灯的流水点亮 即K1控制高四位 K2控制低四位 共八个小灯 程序如下 找不出哪里出了问题 未能实现 求大佬指点
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;  //最大值65535


sbit led1=P2^0;         //D1指示灯
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;

sbit led5=P2^4;         //D5指示灯
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;

sbit K1=P3^1;
sbit K2=P3^0;
#define led P2

void delay(u16 i)
{
   while(i--);
}

void keypros()
{
   if(K1==0)
   {
          delay(1000);  //10ms 消抖
          if(K1==0)
          {
                   u8 i=0;
         led=0XFE;  //1111 1110
         delay(50000);

         while(1)
         {
             for(i=0;i<3;i++)
                 {
                          led=_crol_(led,1);         //        1111 1110  1111 1101
                        delay(50000);
                         }
                               
         }
          }
          while(!K1);  //判断按键是否松开
       
   }
   if(K2==0)
   {
          delay(1000);  //10ms 消抖
          if(K2==0)
          {
                   u8 i=0;
         led=0xef;  //1110 1111
         delay(50000);
         while(1)
         {
             for(i=0;i<3;i++)
                 {
                          led=_crol_(led,1);         //        1110 1111  1101 1111
                        delay(50000);led=0xef;
                         }
                               
         }
          }
          while(!K2);  //判断按键是否松开
       
   }


}

void main()
{
  while(1)
  {
      keypros();  
  }
}
最佳答案
2022-2-13 21:06:23
楼主代码里面的while(1)这个循环好像没有办法结束,进去这个循环以后,按K2还有反应吗?

最佳答案

查看完整内容

楼主代码里面的while(1)这个循环好像没有办法结束,进去这个循环以后,按K2还有反应吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 21:06:23 | 显示全部楼层    本楼为最佳答案   
楼主代码里面的while(1)这个循环好像没有办法结束,进去这个循环以后,按K2还有反应吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 21:21:02 | 显示全部楼层
本人小白一位,好奇问楼主,为什么要用判断按键是否松开,为什么不用上拉电阻或下拉电阻?效果不是更好吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-13 22:56:57 | 显示全部楼层
傻眼貓咪 发表于 2022-2-13 21:21
本人小白一位,好奇问楼主,为什么要用判断按键是否松开,为什么不用上拉电阻或下拉电阻?效果不是更好吗?

这位仁兄 可否进一步说说 是说直接确定他的高低电平吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 23:42:07 | 显示全部楼层
救赎自我- 发表于 2022-2-13 22:56
这位仁兄 可否进一步说说 是说直接确定他的高低电平吗

是的,因为用按键好象会有时差。
如果有误,抱歉让你看笑话了,哈哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-14 08:59:33 | 显示全部楼层
傻眼貓咪 发表于 2022-2-13 23:42
是的,因为用按键好象会有时差。
如果有误,抱歉让你看笑话了,哈哈。

没有没有  我理解你的意思了  但是问题不在这里好像 现在是我只要按下K1他就8个灯流水点亮 而我是想让他控制4个灯流水点亮 for循环那里我明明设置了i<3 但是他却能点亮8个灯 我就是在这里非常的困惑 兄弟你对此有何见解 救救俺 哭了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-14 10:45:13 | 显示全部楼层
本帖最后由 jhq999 于 2022-2-14 10:47 编辑

学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-14 10:59:40 From FishC Mobile | 显示全部楼层
我上网爬文了关于流水LED代码如下,只是没有按键,可以自行修改代码,希望对你有帮助:
  1. #include <reg52.h>

  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;

  7. void main(){
  8.         unsigned int i = 0;  //定义循环变量 i,用于软件延时
  9.         unsigned char cnt = 0; //定义计数变量 cnt,用于移位控制
  10.         ENLED = 0;
  11.         ADDR3 = 1;
  12.         ADDR2 = 1;
  13.         ADDR1 = 1;
  14.         ADDR0 = 0;
  15.         while (1){  //主循环,程序无限循环执行该循环体语
  16.                 P0 = ~(0x01 << cnt);  //P0 等于 1 左移 cnt 位,控制 8 个 LED
  17.                 for (i = 0; i < 20000; i++); //软件延时
  18.                 cnt++;  //移位计数变量自加 1
  19.                 if (cnt >= 8){  //移位计数超过 7 后,再重新从 0 开始
  20.                         cnt = 0;
  21.                 }
  22.         }
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-14 11:07:36 | 显示全部楼层

代表

本帖最后由 jhq999 于 2022-2-14 14:32 编辑
救赎自我- 发表于 2022-2-14 08:59
没有没有  我理解你的意思了  但是问题不在这里好像 现在是我只要按下K1他就8个灯流水点亮 而我是想让他 ...


  1. if(K1==0)
  2.    {
  3.           delay(1000);  //10ms 消抖
  4.           if(K1==0)
  5.           {
  6.                    u8 i=0;
  7.          //led=0XFE;  //1111 1110
  8.          delay(50000);

  9.          while(1)
  10.          {
  11.              led=0XFE;//////////////////////////////////////////////////////////////如果不这里设定led值和while(1)led=_crol_(led,1);没有区别
  12.              for(i=0;i<3;i++)
  13.                  {
  14.                           led=_crol_(led,1);         //        1111 1110  1111 1101
  15.                         delay(50000);

  16.                     }
  17.                                     
  18.          }
  19.     }
  20.           while(!K1);  //判断按键是否松开
  21.       
  22.    }
复制代码


不懂单片机,为什么不这样写

  1. if(K1==0)
  2.    {
  3.           delay(1000);  //10ms 消抖
  4.           if(K1==0)
  5.           {
  6.                    u8 i=0;
  7.          //led=0XFE;  //1111 1110
  8.          delay(50000);

  9.          while(!K1) /////////////////////判断按键是否松开,为什么不放在这里判断
  10.          {
  11.              led=0XFE;//////////////////////////////////////////////////////////////如果不这里设定led值和while(1)led=_crol_(led,1);没有区别
  12.              for(i=0;i<3;i++)
  13.                  {
  14.                           led=_crol_(led,1);         //        1111 1110  1111 1101
  15.                         delay(50000);

  16.                     }
  17.                                     
  18.            }
  19.        }
  20.          
  21.    }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-14 15:58:32 | 显示全部楼层
你的老师没有告诉过你吗?
读取外部输入之前自己要先输出高电平

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-15 01:24:16 | 显示全部楼层
  1. #include <mcs51/8052.h>
  2. #include <stdint.h>
  3. #include <stdbool.h>

  4. #define K1 0
  5. #define K2 1

  6. void delay(uint16_t count) {
  7.     for(uint16_t i = 0; i < count; ++i);
  8. }

  9. void led_set(uint8_t data) {
  10.     P0 = 0xff;

  11.     // ENLED = 0;
  12.     // ADDR3 = 1;
  13.     // ADDR2 = 1;
  14.     // ADDR1 = 1;
  15.     // ADDR0 = 0;
  16.     P1 = (P1 & 0xe0) | 0x0e;    // LEDS6 on
  17.     P0 = data;
  18. }

  19. bool key_get(uint8_t index) {
  20.     P2 = 0xf7;
  21.     uint8_t mask;
  22.     switch(index) {
  23.         case 0: mask = 0x10; break;
  24.         case 1: mask = 0x20; break;
  25.         default: mask = 0;
  26.     }
  27.     if(P2 & mask) return false;
  28.     delay(5000);
  29.     if(P2 & mask) return false;
  30.     return true;
  31. }

  32. void main() {
  33.     while(1) {
  34.         if(key_get(K1)) {
  35.             uint8_t led_data = 0x10;
  36.             for(uint8_t i = 0; i < 4; ++i) {
  37.                 led_set(~led_data);
  38.                 led_data <<= 1;
  39.                 delay(15000);
  40.             }
  41.         }
  42.         if(key_get(K2)) {
  43.             uint8_t led_data = 0x01;
  44.             for(uint8_t i = 0; i < 4; ++i) {
  45.                 led_set(~led_data);
  46.                 led_data <<= 1;
  47.                 delay(15000);
  48.             }
  49.         }
  50.     }
  51. }
复制代码

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-15 08:34:20 | 显示全部楼层
学习了
精彩

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-15 09:33:42 | 显示全部楼层
傻眼貓咪 发表于 2022-2-14 10:59
我上网爬文了关于流水LED代码如下,只是没有按键,可以自行修改代码,希望对你有帮助:

谢谢大佬  我找到问题所在了 我的程序没有给小灯归位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-15 09:35:33 | 显示全部楼层
zzyet 发表于 2022-2-14 14:23
楼主代码里面的while(1)这个循环好像没有办法结束,进去这个循环以后,按K2还有反应吗?

并没有 不过我找到了问题所在 现在已经可以运行了 谢谢兄弟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-15 09:38:40 | 显示全部楼层
人造人 发表于 2022-2-14 15:58
你的老师没有告诉过你吗?
读取外部输入之前自己要先输出高电平

定义的管脚默认高电平 我是想让他低电平流水点亮 现在已经可以运行了 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-15 09:40:17 | 显示全部楼层
傻眼貓咪 发表于 2022-2-14 10:59
我上网爬文了关于流水LED代码如下,只是没有按键,可以自行修改代码,希望对你有帮助:

谢谢兄弟 问题已经解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-15 09:54:57 | 显示全部楼层
jhq999 发表于 2022-2-14 11:07
不懂单片机,为什么不这样写

问题已经解决了 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-3 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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