久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1958|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日骚视频| 国产激情精品一区二区三区 | 精品一区二区三区在线视频 | 欧美v在线| 国产日韩精品在线 | 蜜桃视频麻豆 | 中文在线a在线 | 亚洲国产精品成人综合久久久 | 国产一区欧美一区 | 国产欧美日韩一区 | 成人九区 | 密室大逃脱第六季大神版在线观看 | 成人午夜激情 | 日本粉嫩一区二区三区视频 | 精品av| 日本高清中文字幕 | 中文字幕一区在线观看视频 | www.887色视频免费 | 男女羞羞免费网站 | 亚洲免费在线观看视频 | 日韩在线| 亚洲免费一区 | 久久999| 欧美日韩亚洲国产综合 | 黄在线免费观看 | 久久丁香 | av天天澡天天爽天天av | 成人午夜高清 | 久草视频网站 | 欧美韩一区二区 | 成人免费共享视频 | 精品成人免费视频 | 成人免费在线网 | 成人av大全| 成人免费观看视频 | www.国产一区 | 欧美日韩中 | 久久国产精品72免费观看 | 一区二区日韩精品 | 99久久婷婷国产亚洲终合精品 | 国产在线一区二区三区 |