找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1495|回复: 6
收起左侧

有大佬能详细讲一下这个51单片机独立按键的扫描程序吗

[复制链接]
ID:1047681 发表于 2022-10-14 14:22 | 显示全部楼层 |阅读模式
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
Snipaste_2022-10-14_14-20-46.jpg
回复

使用道具 举报

ID:161164 发表于 2022-10-14 17:01 | 显示全部楼层
哪里不懂?
回复

使用道具 举报

ID:1047681 发表于 2022-10-18 10:51 | 显示全部楼层

就是那个keybuf移位之后与的操作,keybuf不都是0xff嘛,也就是1111 1111,那与上KEY1是不会出现0x00的吧?
还有就是KEY1都是位操作,也就是sbit,那它们的值默认的是多少呢?我只知道按位操作的话,当按键1按下时,KEY1 = 0,也就是IO口呈低电平。
回复

使用道具 举报

ID:624769 发表于 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)  | 是或操作,不是与操作。

基础补一下吧。
回复

使用道具 举报

ID:1047681 发表于 2022-10-20 08:50 | 显示全部楼层
188610329 发表于 2022-10-18 11:08
1)  移位后补0,   即  0xff   左移后   0xfe  左移8次 就变 0x00了
2)  | 是或操作,不是与操作。

好的好的,非常感谢,那这个函数的意思就是,一直在main函数里面循环,然后每执行一次keybuf就会左移一位,等移位8次才会变成0x00,也就实现了消除抖动的功能对吗?再或上按键的位状态,就可以判断出按下了哪个按键对吧
回复

使用道具 举报

ID:624769 发表于 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了,不就知道了?
回复

使用道具 举报

ID:1047681 发表于 2022-10-21 09:14 | 显示全部楼层
188610329 发表于 2022-10-20 09:56
按键按下  为 0, 按键释放 为 1,  你不需要管keybuf 原来是什么值, 只要知道,每次会把 按键状态 补入 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表