爱吃西红柿 发表于 2024-3-28 15:32:09

关于程序冲突的问题

if(!(P11 & 0x01) && iskey11 == 0) {
Delay5ms();
iskey11 = 1;               
flag11 = 1;
keyPadData |= 0x08;
}
else if((P11 & 0x01) && iskey11 == 1) {
Delay5ms();
iskey11 = 0;               
flagt = 1;
keyPadData |= 0x08;
}
if(!(P17 & 0x01) && iskey17 == 0) {

Delay5ms();
iskey17 = 1;               
flag17 = 1;
keyPadData |= 0x08;
}
else if((P17 & 0x01) && iskey17 == 1) {
Delay5ms();
iskey17 = 0;               
flag17t = 1;
keyPadData |= 0x08;
}
问一下大佬们,这段程序正常运行是没问题的,但是如果两个按钮几乎同时按下的时候,会写入冲突导致丢失一次触发,问一下有什么方法,类似于排队触发,或者先将按键存起来怎么实现

chen 发表于 2024-3-28 16:00:17

外部中断

电子DIY小家 发表于 2024-3-28 16:09:45

PWM硬件移相测试卡教程(一)按键点灯测试@STC8H2K12U系列
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7023
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

参考这个按键的写法,非阻塞的按键就可以了

jwd 发表于 2024-3-28 16:29:42

延时耽误了

xiangzichen 发表于 2024-3-29 00:31:59

本帖最后由 xiangzichen 于 2024-3-29 00:40 编辑

//都在一个端口上,为何不把端口读取了,然后用 && 去判断到底是哪个口?
u8 GetKey() {

u8 k_tmp = P1 & 0x81;               //读取P1口,如果有不用的口, P11 P17为按键
u8 rt = 0;

if(k_tmp) {                         //有数值,
    _delay_ms(10);                  //延时消抖
    if(k_tmp == P1) {               //再次判断,且相等
      if(~k_tmp & 0x80) {         //P17 有按下
            rt = 7;
      }
      else if(~k_tmp & 0x01) {    //P11 有按下
            rt = 1;
      }
      .
      .
      .
    }
}
return rt;                        //返回按键
页: [1]
查看完整版本: 关于程序冲突的问题