weixin_52592778 2021-06-08 07:10 采纳率: 0%
浏览 333

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

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

 

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

 

1.画出程序流程图

 

2.编写程序

 

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

 

  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-17 04:01
    关注

    参考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;
    }
    

    展开全部

    评论
    编辑
    预览

    报告相同问题?

    手机看
    程序员都在用的中文IT技术交流社区

    程序员都在用的中文IT技术交流社区

    专业的中文 IT 技术社区,与千万技术人共成长

    专业的中文 IT 技术社区,与千万技术人共成长

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    客服 返回
    顶部