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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2076|回復: 6
打印 上一主題 下一主題
收起左側

有大佬能詳細講一下這個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
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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)  | 是或操作,不是與操作。

基礎補一下吧。
回復

使用道具 舉報

5#
ID:1047681 發表于 2022-10-20 08:50 | 只看該作者
188610329 發表于 2022-10-18 11:08
1)  移位后補0,   即  0xff   左移后   0xfe  左移8次 就變 0x00了
2)  | 是或操作,不是與操作。

好的好的,非常感謝,那這個函數的意思就是,一直在main函數里面循環,然后每執行一次keybuf就會左移一位,等移位8次才會變成0x00,也就實現了消除抖動的功能對嗎?再或上按鍵的位狀態,就可以判斷出按下了哪個按鍵對吧
回復

使用道具 舉報

6#
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了,不就知道了?
回復

使用道具 舉報

7#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品一区二区三区精品 | 亚洲欧美在线观看 | 黄色大全免费看 | 国产一区二区三区四区在线观看 | 国产福利在线播放 | 91国产精品| 美女二区 | 日日干日日射 | 国产视频一区二区三区四区五区 | 91av免费看| 日韩精品一区二区三区视频播放 | 午夜视频在线视频 | 久久精品国产99国产精品亚洲 | 亚洲v区| 婷婷久久一区 | 亚洲最大成人综合 | 日韩中文字幕在线播放 | 99精品久久 | 欧美videosex性极品hd | 波多野吉衣久久 | 中文字幕在线二区 | 日韩免费在线 | 国产专区在线 | 国产精品久久久久久模特 | 天天插日日操 | 91热爆在线观看 | 中文字幕二区三区 | 国产精品视频一 | 日韩和的一区二区 | 男人天堂久久 | 日韩精品免费在线 | 欧美在线视频网 | 成人二区三区 | 亚洲欧美另类在线观看 | 国产剧情一区二区三区 | 久久久久久亚洲 | 天天草草草| 91精品中文字幕一区二区三区 | av在线免费播放 | 国产在线视频一区 | 久久精品99 |