xxkj2010 发表于 2024-11-5 09:19:23

的确很神奇,有时间得试一试。

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

VCC 发表于 2024-11-5 00:13
是不是STC32单片机太快了,矩阵按键的扫描激励通过IO送出去后,尚不稳定就开始了状态读取呢?

可以在分别 ...

试过了还是不行。

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

xxkj2010 发表于 2024-11-5 09:19
的确很神奇,有时间得试一试。

{:smile:}

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

王昱顺 发表于 2024-11-4 23:50
可以进入仿真,看看实际运行中的输入是进入了哪一行。
方便确定是哪里的问题 ...
嗯嗯,稍后会试一下

晓飛飛 发表于 2024-11-5 10:17:59

VCC 发表于 2024-11-5 00:13
是不是STC32单片机太快了,矩阵按键的扫描激励通过IO送出去后,尚不稳定就开始了状态读取呢?

可以在分别 ...

他这个判断实在while(1)循环里面,就算状态不稳也不会持续很久,若干次循环后总会稳定,而且只有开灯操作,没有闭灯操作,不大可能因为IO速度太快判断出错。

杨为民 发表于 2024-11-5 11:13:35

江上酒酒 发表于 2024-11-5 09:12
受教了,主要是新手,看手册有些难度。

(1)对于工作在“准双向口”模式的端口,在向端口赋值后(“P0=0XFE;   //检测第一列”或者“P0=0XFD;   //检测第二列”),需要等两个时钟周期以上才能正确读到端口的数据(“if(P06==0&&P07==1)//0键按下”或者“if(P06==0&&P07==1)//1键按下”)

(2)因此对于任何行列式(矩阵式)扫描键盘,必须在设置端口后加“NOP”指令延时后再读键盘状态!
(3)“看手册有难度”,抄袭会不会?举一反三会不会?下面是STC官方范例,官方范例就是拿来给你抄的呀:

void IO_KeyDelay(void)
{
    u8 i;
    i = 60;
    while(--i);
}

void IO_KeyScan(void)    //50ms call
{
    u8j;

    j = IO_KeyState1;   //保存上一次状态

    P0 = 0xf0;//X低,读Y
IO_KeyDelay();
    IO_KeyState1 = P0 & 0xf0;

    P0 = 0x0f;//Y低,读X
   IO_KeyDelay();
    IO_KeyState1 |= (P0 & 0x0f);
    IO_KeyState1 ^= 0xff;   //取反

(4)古人都知道“走路走大路,万不要走小路,”,对于STC单片机,STC官方的手册就是大路,STC官方范例就是大路,大路宽,大路直,大路才是最短的路。
(5)感叹:版主、客服、咨询和老总,一个比一个耐心好,要是我的学生这样,他早就被泪眼汪汪了

页: 1 [2]
查看完整版本: 发现一个神奇的问题