江上酒酒 发表于 2024-11-4 23:04:05

发现一个神奇的问题

本帖最后由 江上酒酒 于 2024-11-5 09:32 编辑

用32G12K128试验箱的矩阵按键点灯,
修改前1键控制P61灯,5键控制P65灯,运行后P61灯不会亮,P65可以亮,其余灯正常;
第一次修改后1键控制P65灯,5键控制P61灯,运行后P61灯会亮,P65可以亮,其余灯正常;
第二次修改后把1键连同它所控制的P61灯程序放在5键连同它所控制的P65灯程序后面,所有灯正常亮
但是只能是按照程序注释上的把两个按键程序调换(不含两个按键所控制的灯的程序或含两个按键所控制的灯的程序)才可以,如果按键程序不换顺序,把俩灯的顺序调换还是像修改前一样



总之,必须把按键1的程序放在按键5后面,所有灯都正常亮

#include <STC32G.H>
void Delay10ms(void)      //@24.000MHz
{
      unsigned char data i, j;

      i = 39;
      j = 230;
      do
      {
                while (--j);
      } while (--i);
}

void main()
{
      P0M0=0X00;
      P0M1=0X00;
      P4M0=0X00;
      P4M1=0X00;
      P6M0=0X00;
      P6M1=0X00;
      P40=0;
      while(1)
      {
                P0=0XFE;            //检测第一列
                if(P06==0&&P07==1)//0键按下
                        P60=0;            
                if(P06==1&&P07==0)//4键按下      
                        P64=0;
                P0=0XFD;            //检测第二列
                if(P06==0&&P07==1)//1键按下      修改后这一行换成if(P06==1&&P07==0)
                     P61=0;
                if(P06==1&&P07==0)//5键按下      修改后这一行换成if(P06==0&&P07==1)
                        P65=0;
                P0=0XFB;            //检测第三列
                if(P06==0&&P07==1)//2键按下
                        P62=0;
                if(P06==1&&P07==0)//6键按下
                        P66=0;
                        P0=0XF7;          //检测第四列
                if(P06==0&&P07==1)//3键按下
                        P63=0;
                if(P06==1&&P07==0)//7键按下
                        P67=0;
      }
}


晓飛飛 发表于 2024-11-4 23:37:21

看代码逻辑很简单,不大可能出现你描述的这种问题

王昱顺 发表于 2024-11-4 23:50:23

可以进入仿真,看看实际运行中的输入是进入了哪一行。
方便确定是哪里的问题

VCC 发表于 2024-11-5 00:13:59

是不是STC32单片机太快了,矩阵按键的扫描激励通过IO送出去后,尚不稳定就开始了状态读取呢?

可以在分别激励1、2、3、4列的P0赋值语句后面,试着增加一点点延时,例如加3个_nop_()函数

杨为民 发表于 2024-11-5 00:39:29

据说流行“万事不决,先问网路”,其实很多问题是我们没有仔细阅读STC官方手册造成的。论坛中有很多问题也是不肯先看手册,张嘴就问的,其实正确的答案和解决问题的方法就已经在STC官方手册中了。因此我们应该养成碰到问题先看手册上有没有解答,“万事不决,先看手册”的习惯。

soma 发表于 2024-11-5 07:21:26

逐个IO检测,感觉好奇怪啊

wlhet 发表于 2024-11-5 07:34:31

是挺奇怪的

江上酒酒 发表于 2024-11-5 09:11:03

soma 发表于 2024-11-5 07:21
逐个IO检测,感觉好奇怪啊

矩阵按键检测不是就两种方法吗
1十字交叉
2先确定一行或一列,再检测列或行,逐步循环扫描
还有其他方法吗

江上酒酒 发表于 2024-11-5 09:12:26

杨为民 发表于 2024-11-5 00:39
据说流行“万事不决,先问网路”,其实很多问题是我们没有仔细阅读STC官方手册造成的。论坛中有很多问题也 ...

受教了,主要是新手,看手册有些难度。

江上酒酒 发表于 2024-11-5 09:14:45

晓飛飛 发表于 2024-11-4 23:37
看代码逻辑很简单,不大可能出现你描述的这种问题

这种问题我之前也遇见过,之前用的是十字交叉进行矩阵按键扫描,也是有个键没反应。
页: [1] 2
查看完整版本: 发现一个神奇的问题