Sun rise314 2023-06-13 11:13 采纳率: 77.8%
浏览 60
已结题

按下按键1,实现双向跑马灯;按下按键2,跑马灯全灭

单片机程序。如何在这个的基础上加两个按键。按下按键1,实现双向跑马灯;按下按键2,跑马灯全灭。

img

img

  • 写回答

2条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-13 14:16
    关注
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7406770
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:计算机结构中的冯诺依曼结构、哈佛结构、改进型哈佛结构
    • 除此之外, 这篇博客: 第4讲 组合逻辑电路实例:编码器、译码器、数据选择器、加法器、数值比较器、代码转换器——计算机逻辑基础中的 串行进位加法器 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 有多位数字相加,需将进位信号依次传向高位

      如4位串行进位加法器(行波进位加法器)

      在这里插入图片描述

    • 您还可以看一下 王剑老师的站长必修课:网站是怎样做出来的?课程中的 运营:才刚开始,站长更重要的工作…小节, 巩固相关知识点
    • 以下回答由chatgpt基于相关博客总结生成:

      我能够解决该问题。

      针对该问题,我们需要在单片机程序中添加两个按键,并实现对跑马灯的控制。其中一个按键能够实现双向跑马灯功能,另一个按键则能够使跑马灯全灭。

      以下为解决方案的具体步骤:

      1. 确定使用的单片机型号,并了解该型号的GPIO(General Purpose Input Output)端口数量和功能。 例如,STC89C52单片机有32个GPIO端口,分为4个8位的I/O端口组。我们需要找到两个未被占用的GPIO端口来连接两个按键。

      2. 根据电路原理图,连接两个按键,其中一个按键连接到一个GPIO端口上,作为双向跑马灯功能的触发器;另一个按键则连接到另一个GPIO端口上,作为全灭跑马灯的触发器。 具体的连接方式可参考其他电路设计,如温控风扇的电路设计。

      3. 在程序中编写对按键的控制代码,使用GPIO端口的输入功能来检测按键是否按下,并进行相应的操作。 对于双向跑马灯的触发器,可以编写一个中断函数,在其中实现对跑马灯的方向切换操作;对于全灭跑马灯的触发器,则需要在按下按键后将跑马灯所有的灯都设置为关闭状态。

      4. 对于跑马灯的控制代码,可以使用定时器中断来实现,控制跑马灯灯光的切换速度和方向。 具体的代码实现可参考其他跑马灯程序的设计,这里不再赘述。

      5. 通过编译和下载程序测试,确保添加的按键能够正常控制跑马灯的运行和停止。

      代码的实现示例(仅供参考):

      ```c

      include

      define LED_count 8 //设置跑马灯的灯数为8

      //定义跑马灯的状态和方向 bit direction = 0; //方向标志 bit running = 0; //状态标志

      //定义跑马灯对应的IO口 sbit led1 = P1^0; sbit led2 = P1^1; sbit led3 = P1^2; sbit led4 = P1^3; sbit led5 = P1^4; sbit led6 = P1^5; sbit led7 = P1^6; sbit led8 = P1^7;

      //定义按键对应的IO口 sbit key1 = P2^0; //双向跑马灯触发器 sbit key2 = P2^1; //全灭跑马灯触发器

      void delay_ms(unsigned int time) { unsigned int i,j; for(i=0;i<time;i++) for(j=0;j<1000;j++); }

      void timer0_int() interrupt 1 //定时器中断函数 { static unsigned char count = 0;

      //跑马灯状态为关闭,则直接返回
      if(running == 0) 
          return;
      
      //根据方向标志控制跑马灯的方向
      if(direction == 0) //顺向运行
      {
          switch(count) //根据计数器数值控制灯光的亮灭
          {
              case 0: led1 = 1; break;
              case 1: led2 = 1; break;
              case 2: led3 = 1; break;
              case 3: led4 = 1; break;
              case 4: led5 = 1; break;
              case 5: led6 = 1; break;
              case 6: led7 = 1; break;
              case 7: led8 = 1; break;
          }
      }
      else //逆向运行
      {
          switch(count) //根据计数器数值控制灯光的亮灭
          {
              case 0: led8 = 1; break;
              case 1: led7 = 1; break;
              case 2: led6 = 1; break;
              case 3: led5 = 1; break;
              case 4: led4 = 1; break;
              case 5: led3 = 1; break;
              case 6: led2 = 1; break;
              case 7: led1 = 1; break;
          }
      }
      
      //计数器加一
      count++;
      if(count >= LED_count) //达到一个周期后,计数器清零并修改方向标志
      {
          count = 0;
          if(direction == 0)
              direction = 1;
          else
              direction = 0;
      }
      
      //延时一定时间以控制灯光切换速度
      delay_ms(100);
      
      //灯光全部熄灭
      led1 = 0;
      led2 = 0;
      led3 = 0;
      led4 = 0;
      led5 = 0;
      led6 = 0;
      led7 = 0;
      led8 = 0;
      

      }

      void key1_int() interrupt 0 //双向跑马灯触发器函数 { delay_ms(10); //延时消抖 if(key1 == 0) //检测到按键按下 { if(running == 0) //当前跑马灯处于关闭状态,则需要打开跑马灯 { running = 1; //修改状态标志 direction = 0; //初始化方向标志 TMOD |= 0x01; //定时器0工作在方式1 TH0 = 0xFC; //初始化定时器初值,控制定时器中断频率 TL0 = 0x67; //0xFC67对应的十进制数是65535-12415=53120 ET0 = 1; //允许定时器0中断 TR0 = 1; //启动定时器0 } else //当前跑马灯处于打开状态,则需要修改方向 { direction = ~direction; //反转方向标志 } } }

      void key2_int() interrupt 0 //全灭跑马灯触发器函数 { delay_ms(10); //延时消抖 if(key2 == 0) //检测到按键按下 { running = 0; //关闭跑马灯 direction = 0; //初始化方向标志 TMOD &= 0xFE; //关闭定时器0中断 TR0 =

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月13日