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

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

img

img

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: 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 =

是想要实现,按下K1灭,按下K2亮

img