标题: 有大佬能详细讲一下这个51单片机独立按键的扫描程序吗 [打印本页]

作者: powerhope    时间: 2022-10-14 14:22
标题: 有大佬能详细讲一下这个51单片机独立按键的扫描程序吗
uchar keystr[] = {1, 1, 1, 1}, backup[] = {1, 1, 1, 1};

void KeyScan() {                                                        //键盘扫描
        static uchar keybuf[4] = {0XFF, 0XFF, 0XFF, 0XFF};
        uchar i;
        keybuf[0] = (keybuf[0] << 1) | KEY1;
        keybuf[1] = (keybuf[1] << 1) | KEY2;
        keybuf[2] = (keybuf[2] << 1) | KEY3;
        keybuf[3] = (keybuf[3] << 1) | KEY4;
        for (i = 0; i < 4; i++) {
                if (keybuf[i] == 0X00)
                        keystr[i] = 0;
                else if (keybuf[i] == 0XFF)
                        keystr[i] = 1;
        }
}

void KeyDriver() {                                                         //键盘驱动
        uchar i;
        for (i = 0; i < 4; i++) {
                if (keystr[i] != backup[i]) {
                        if (keystr[i] == 0)
                                KeyAction(i);//这里适当修改程序可以实现组合按键的效果
                }
                backup[i] = keystr[i];
        }
}

Snipaste_2022-10-14_14-20-34.jpg (83.63 KB, 下载次数: 21)

Snipaste_2022-10-14_14-20-34.jpg

Snipaste_2022-10-14_14-20-46.jpg (47.31 KB, 下载次数: 28)

Snipaste_2022-10-14_14-20-46.jpg

作者: lkc8210    时间: 2022-10-14 17:01
哪里不懂?
作者: powerhope    时间: 2022-10-18 10:51
lkc8210 发表于 2022-10-14 17:01
哪里不懂?

就是那个keybuf移位之后与的操作,keybuf不都是0xff嘛,也就是1111 1111,那与上KEY1是不会出现0x00的吧?
还有就是KEY1都是位操作,也就是sbit,那它们的值默认的是多少呢?我只知道按位操作的话,当按键1按下时,KEY1 = 0,也就是IO口呈低电平。
作者: 188610329    时间: 2022-10-18 11:08
powerhope 发表于 2022-10-18 10:51
就是那个keybuf移位之后与的操作,keybuf不都是0xff嘛,也就是1111 1111,那与上KEY1是不会出现0x00的吧 ...

1)  移位后补0,   即  0xff   左移后   0xfe  左移8次 就变 0x00了
2)  | 是或操作,不是与操作。

基础补一下吧。
作者: powerhope    时间: 2022-10-20 08:50
188610329 发表于 2022-10-18 11:08
1)  移位后补0,   即  0xff   左移后   0xfe  左移8次 就变 0x00了
2)  | 是或操作,不是与操作。

好的好的,非常感谢,那这个函数的意思就是,一直在main函数里面循环,然后每执行一次keybuf就会左移一位,等移位8次才会变成0x00,也就实现了消除抖动的功能对吗?再或上按键的位状态,就可以判断出按下了哪个按键对吧
作者: 188610329    时间: 2022-10-20 09:56
powerhope 发表于 2022-10-20 08:50
好的好的,非常感谢,那这个函数的意思就是,一直在main函数里面循环,然后每执行一次keybuf就会左移一位 ...

按键按下  为 0, 按键释放 为 1,  你不需要管keybuf 原来是什么值, 只要知道,每次会把 按键状态 补入keybuf, 那么,如果 keybuf 为0xff  意味着 最后8次检测的状态 都是1,按键处在稳定的 “释放”状态, 反之,keybuf 为 0x00, 意味着 最后8次检测的状态 都是0,按键处在稳定的 “按下”状态, 所以,除了0x00,或者 0xff, 其他任何值都代表,按键在变化的过程中,或者在抖动中。
至于按下的是哪个键,就看 keybuf[0]~keybuf[3]  哪个变 0x00了,不就知道了?
作者: powerhope    时间: 2022-10-21 09:14
188610329 发表于 2022-10-20 09:56
按键按下  为 0, 按键释放 为 1,  你不需要管keybuf 原来是什么值, 只要知道,每次会把 按键状态 补入 ...

嗯嗯,讲的很清楚很明白,感谢大佬不吝赐教!!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1