很想进步 2024-10-24 19:04 采纳率: 50%
浏览 1
已结题

按键检测控制流水灯反向

按键检测会有延迟,应该是被流水灯延时干扰,不知道怎么解决

按键检测控制流水灯反向

```c
#include <REGX51.H>
#include <INTRINS.H>
unsigned int count;
void delay(unsigned int n)
{
    unsigned int i ;
    unsigned int j ;
    for(i = 0 ; i < n ; i++)
      for(j = 0; j < 124 ;j++)
    {}
}
//unsigned char led[4] = {0xFE, 0xFD, 0xFB, 0xF7};
//unsigned char del[4] = {0xFD, 0xFB, 0xF7, 0xFE};
void led()
{
    P1  =_crol_ (P1,1);
                    delay(400);
}

void del()
{
     P1 = _cror_ (P1,1);
                    delay(400);
}
    
void main()
{
    P1 = 0xfe;
    while(1)
    {
        if(P3_2==0)
        {
            delay(10);
            while(P3_2==0);
            while(1)
            {
                while(count == 0) 
                {
                    
                    P1  =_crol_ (P1,1);
                    delay(400);    
                    if(P3_2==0)
                    {
                    
                    count = 1;
                    }
                            
                }
                while(count == 1)
                {
                    P1 = _cror_ (P1,1);    
                    delay(400);
                    if(P3_2==0)
                    {
                    count = 0;
                    }    
                    
                }
            }
        }
    }
}

```

  • 写回答

2条回答

  • 无疆76 2024-10-24 19:05
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    解决按键检测延迟的问题,可以尝试以下几个方法:

    方法一:使用外部中断或者定时器中断来检测按键状态,而不是在主循环中进行轮询。这种方式可以减少对流水灯操作的干扰。同时确保你的按键与流水灯控制之间具有独立的电路,避免相互影响。以下是一个使用外部中断的例子:

    #include <REGX51.H>
    #include <INTRINS.H>
    unsigned char led_state = 0xFE; //初始状态为流水灯的第一个状态
    unsigned char reverse_flag = 0; //标志位,用于判断是否需要反向运行流水灯
    
    void delay(unsigned int n) { /*延迟函数不变*/}
    void LED_Rotate() { /*流水灯正向运行函数不变*/}
    void LED_ReverseRotate() { /*流水灯反向运行函数不变*/}
    
    void ExternalInterruptHandler() interrupt 2 //外部中断处理函数,假设使用INT2中断检测按键状态
    {
        if (INT2_FLAG) //假设INT2_FLAG为外部中断标志位,当检测到按键按下时置位
        {
            delay(10); //消抖处理,避免误触发
            if (stillPressed()) //检测按键仍然被按下,仍然有效状态进行反转逻辑控制
            {
                reverse_flag = 1; //设置反转标志位
            }
            while (!INT2_FLAG); //等待中断标志位清除前不能退出中断服务程序
            INT2_FLAG = 0; //清除中断标志位以重新进入外部中断处理程序或者返回到主程序中去处理其它事件。        
        }
    }
    
    void main() { /*初始化代码不变*/}
    ```然后在主循环中根据`reverse_flag`的值决定流水灯的运行方向:```cwhile(1) {if (reverse_flag) {LED_ReverseRotate(); } else {LED_Rotate(); }}``` 方法二:增加滤波算法来消除按键抖动现象。在检测到按键按下时,使用软件延时或延时函数来等待按键稳定地按下再进行处理。这样可以减少误触发的情况。同时在延时函数中可以使用计时器,使得按键响应更为准确和迅速。总之要解决按键检测的延迟问题需要考虑以下几个方面:避免干扰、独立电路、外部中断、滤波算法等。这些策略可以根据具体硬件环境和需求进行选择和调整。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月1日
  • 已采纳回答 10月24日
  • 创建了问题 10月24日