发现一个神奇的问题
本帖最后由 江上酒酒 于 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;
}
}
看代码逻辑很简单,不大可能出现你描述的这种问题 可以进入仿真,看看实际运行中的输入是进入了哪一行。
方便确定是哪里的问题 是不是STC32单片机太快了,矩阵按键的扫描激励通过IO送出去后,尚不稳定就开始了状态读取呢?
可以在分别激励1、2、3、4列的P0赋值语句后面,试着增加一点点延时,例如加3个_nop_()函数 据说流行“万事不决,先问网路”,其实很多问题是我们没有仔细阅读STC官方手册造成的。论坛中有很多问题也是不肯先看手册,张嘴就问的,其实正确的答案和解决问题的方法就已经在STC官方手册中了。因此我们应该养成碰到问题先看手册上有没有解答,“万事不决,先看手册”的习惯。
逐个IO检测,感觉好奇怪啊 是挺奇怪的 soma 发表于 2024-11-5 07:21
逐个IO检测,感觉好奇怪啊
矩阵按键检测不是就两种方法吗
1十字交叉
2先确定一行或一列,再检测列或行,逐步循环扫描
还有其他方法吗 杨为民 发表于 2024-11-5 00:39
据说流行“万事不决,先问网路”,其实很多问题是我们没有仔细阅读STC官方手册造成的。论坛中有很多问题也 ...
受教了,主要是新手,看手册有些难度。 晓飛飛 发表于 2024-11-4 23:37
看代码逻辑很简单,不大可能出现你描述的这种问题
这种问题我之前也遇见过,之前用的是十字交叉进行矩阵按键扫描,也是有个键没反应。
页:
[1]
2