51单片机,键控流水灯——中断方式

参照下图,实现当KEY键第1次按下时8个LED从上向下依次显示,KEY键第2次按下时LED从下向上依次显示。

 

要求:按键必须采用中断方式实现。

 

1.画出程序流程图

 

2.编写程序

 

说明:程序含有中断函数时主函数、中断函数流程图要分开画

 

参考GPT和自己的思路:

作为人工智能,我可以为您提供简单的代码示例,但是对于具体的实现细节和调试过程,还是建议您咨询相关的技术人员或者深入学习相关的知识。

以下是可能的程序流程图和代码示例:

程序流程图:

程序代码示例:

#include <reg51.h>

sbit KEY1=P3^3;
sbit LED1=P1^0;
sbit LED8=P1^7;

unsigned char LED_Value = 0xfe;  // 初始值,最高位亮

void delay(unsigned int n)       // 延时函数
{
    unsigned int i,j;
    for (i = 0; i < n; i++)
        for (j = 0; j < 120; j++);
}

void key_interrupt(void) interrupt 0  // 中断函数
{
    delay(1000);
    if (KEY1 == 0) {  // 按键按下
        delay(1000);  // 延时一段时间,消除抖动
        if (KEY1 == 0) {  // 判断按键是否还处于按下状态
            LED_Value = ~LED_Value;     // 反转所有LED的状态
            IE0 = 0;   // 关闭外部中断
        }
    }
}

int main(void)
{
    EA = 1;   // 总中断允许
    EX0 = 1;  // 外部中断允许
    while (1) {
        // 判断LED的显示方向
        if (LED_Value == 0x7f) {  // LED显示方向向下
            for (unsigned char i = 0; i < 8; i++) {
                P1 = LED_Value>>i;
                delay(1000);
            }
        }
        else if (LED_Value == 0xfe) {  // LED显示方向向上
            for (unsigned char i = 0; i < 8; i++) {
                P1 = LED_Value<<i;
                delay(1000);
            }
        }
    }
    return 0;
}