找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2091|回復(fù): 6
收起左側(cè)

有大佬能詳細(xì)講一下這個51單片機(jī)獨立按鍵的掃描程序嗎

[復(fù)制鏈接]
ID:1047681 發(fā)表于 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() {                                                         //鍵盤驅(qū)動
        uchar i;
        for (i = 0; i < 4; i++) {
                if (keystr[i] != backup[i]) {
                        if (keystr[i] == 0)
                                KeyAction(i);//這里適當(dāng)修改程序可以實現(xiàn)組合按鍵的效果
                }
                backup[i] = keystr[i];
        }
}

Snipaste_2022-10-14_14-20-34.jpg
Snipaste_2022-10-14_14-20-46.jpg
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-10-14 17:01 | 顯示全部樓層
哪里不懂?
回復(fù)

使用道具 舉報

ID:1047681 發(fā)表于 2022-10-18 10:51 | 顯示全部樓層

就是那個keybuf移位之后與的操作,keybuf不都是0xff嘛,也就是1111 1111,那與上KEY1是不會出現(xiàn)0x00的吧?
還有就是KEY1都是位操作,也就是sbit,那它們的值默認(rèn)的是多少呢?我只知道按位操作的話,當(dāng)按鍵1按下時,KEY1 = 0,也就是IO口呈低電平。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-10-18 11:08 | 顯示全部樓層
powerhope 發(fā)表于 2022-10-18 10:51
就是那個keybuf移位之后與的操作,keybuf不都是0xff嘛,也就是1111 1111,那與上KEY1是不會出現(xiàn)0x00的吧 ...

1)  移位后補(bǔ)0,   即  0xff   左移后   0xfe  左移8次 就變 0x00了
2)  | 是或操作,不是與操作。

基礎(chǔ)補(bǔ)一下吧。
回復(fù)

使用道具 舉報

ID:1047681 發(fā)表于 2022-10-20 08:50 | 顯示全部樓層
188610329 發(fā)表于 2022-10-18 11:08
1)  移位后補(bǔ)0,   即  0xff   左移后   0xfe  左移8次 就變 0x00了
2)  | 是或操作,不是與操作。

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

使用道具 舉報

ID:624769 發(fā)表于 2022-10-20 09:56 | 顯示全部樓層
powerhope 發(fā)表于 2022-10-20 08:50
好的好的,非常感謝,那這個函數(shù)的意思就是,一直在main函數(shù)里面循環(huán),然后每執(zhí)行一次keybuf就會左移一位 ...

按鍵按下  為 0, 按鍵釋放 為 1,  你不需要管keybuf 原來是什么值, 只要知道,每次會把 按鍵狀態(tài) 補(bǔ)入keybuf, 那么,如果 keybuf 為0xff  意味著 最后8次檢測的狀態(tài) 都是1,按鍵處在穩(wěn)定的 “釋放”狀態(tài), 反之,keybuf 為 0x00, 意味著 最后8次檢測的狀態(tài) 都是0,按鍵處在穩(wěn)定的 “按下”狀態(tài), 所以,除了0x00,或者 0xff, 其他任何值都代表,按鍵在變化的過程中,或者在抖動中。
至于按下的是哪個鍵,就看 keybuf[0]~keybuf[3]  哪個變 0x00了,不就知道了?
回復(fù)

使用道具 舉報

ID:1047681 發(fā)表于 2022-10-21 09:14 | 顯示全部樓層
188610329 發(fā)表于 2022-10-20 09:56
按鍵按下  為 0, 按鍵釋放 為 1,  你不需要管keybuf 原來是什么值, 只要知道,每次會把 按鍵狀態(tài) 補(bǔ)入 ...

嗯嗯,講的很清楚很明白,感謝大佬不吝賜教!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表