STM32
直播中

李敏

7年用户 1366经验值
私信 关注
[问答]

为什么用PD7做按键,第一次按程序是对的,第二次按程序就不对了?

为什么用PD7做按键,第一次按程序是对的,第二次按程序就不对了,第三次按又对了,为什么呢?
程序如下:
while (1)
  {
  static u16 c1=0;
    u8 i,j;
    if(btime)
    {  
      KeyRead() ;
      if(Trg!=0x00)
      {
        i=Trg 0X88;
      }
      if(i == 0x80)
      {
        j = Cont 0x80;
        if(j==0x80)
        {  
          c1++;
          btime = FALSE;   
           if(c1>5000)
           {
             LED3_ON;
           }else
            {
              if(c1>2000)
              {
                LED2_ON;LED3_OFF;
              }else
                {
                  if(c1>20)
                  {
                    LED1_ON;LED2_OFF;LED3_OFF;
                  }
                }
            }      
         }else{i=0;c1=0;j=0;}         
      }
      if (i == 0x08)
      {
        LED1_OFF;LED2_OFF;LED3_OFF;i=0;
      }  
     }
  }
}

void KeyRead(void)
    {
       unsigned char ReadData = PIND^0x88;   // 1
      Trg = ReadData   (ReadData ^ Cont);      // 2
      Cont = ReadData;                                // 3
    }

回帖(2)

徐非姗

2024-5-11 09:34:35
如果没有开启PD7中断 就不会产生中断,如果没做其它复用的话 就是个普通IO 。

或许其它硬件上的原因。
举报

王辉

2024-5-11 17:11:52
从您提供的代码片段来看,这是一个基于嵌入式系统的按键检测程序。程序的主要逻辑是在一个无限循环中检测按键状态,当检测到按键PD7被按下时,执行相应的操作。然而,您提到的问题可能是由于按键抖动、按键扫描频率或程序逻辑中的一些问题导致的。

1. 按键抖动:当按键被按下或释放时,由于机械接触的不稳定,按键的输入信号可能会在短时间内产生多次跳变。这可能导致程序误判按键状态,从而影响程序的正确执行。

解决方案:在按键检测逻辑中加入消抖处理。一种常见的方法是使用软件消抖,即在检测到按键状态变化后,稍作延时,再次检测按键状态,如果状态仍然相同,则认为按键状态稳定。

2. 按键扫描频率:如果按键扫描频率过低,可能导致按键状态的检测不准确。当按键被快速连续按下时,程序可能无法准确捕捉到每次按键事件。

解决方案:提高按键扫描频率,确保程序能够及时检测到按键状态的变化。

3. 程序逻辑问题:从您提供的代码片段来看,存在一些语法错误,如if语句中的条件判断缺少括号。这可能导致程序无法正确执行。

解决方案:修正程序中的语法错误,确保程序逻辑正确。

以下是修改后的代码示例:

```c
while (1) {
    static u16 c1 = 0;
    u8 i, j;
    if (btime) {
        KeyRead();
        if (Trg != 0x00) {
            i = Trg & 0X88;
        }
        if (i == 0x80) {
            // 按键PD7被按下时执行的操作
        }
    }
}
```

请注意,这只是一个示例,您可能需要根据您的具体需求和硬件环境进行相应的调整。希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分