|
本人初學(xué)單片機(jī),前幾天看到論壇里"qinshuai"發(fā)的“堪稱一絕的“IO口掃鍵”法-單片機(jī)端口不夠用時(shí)鍵盤掃描方法”一文,發(fā)現(xiàn)真是把IO口的復(fù)用玩到了極致!按照原文的說明,如果在電路中借助二極管,那么N個(gè)IO口最多能掃描N^2個(gè)按鍵!一般8腳的單片機(jī)有6個(gè)IO口,在不用其他IC的情況下最多能掃描36個(gè)按鍵!
下面是該方法的示意圖:

首先,我們將IO1~5全部置1,掃描IO1~5,如果有0就說明最下面K61~K65中對應(yīng)的按鍵被觸發(fā)。接下來,將IO1置0,IO2~5置1,掃描IO2~5;將IO2置0,IO1,IO3~5置1并掃描;······;將IO5置0,IO1~4置1并掃描。以上便是一個(gè)完整的掃描周期,25個(gè)鍵都能夠被掃描到。
我自己仿真了用6個(gè)IO口掃描30個(gè)按鍵的程序,效果還不錯,代碼、hex燒錄文件和仿真文件都打包放在文章末尾了。不過暫時(shí)還沒有在實(shí)際中實(shí)驗(yàn),等我焊好按鍵鍵盤之后再試試!
下面是我的仿真電路圖,理論上6個(gè)IO口最多可以掃描36個(gè)按鍵,不過我只需要30個(gè)就夠了(6行5列),所以接地的六個(gè)按鍵我沒有接(寫程序也省事 )。按鍵按下后,程序需要把對應(yīng)的數(shù)字顯示在數(shù)碼管上。
51hei截圖20220824012254.png (150.98 KB, 下載次數(shù): 47)
下載附件
2022-8-24 01:23 上傳
按鍵對應(yīng)的數(shù)字:
第1行 01 02 03 04 05
第2行 06 07 08 09 10
第3行 11 12 13 14 15
第4行 16 17 18 19 20
第5行 21 22 23 24 25
第6行 26 27 28 29 30
實(shí)現(xiàn)該功能的代碼如下 :
- #include <reg52.h>
- //CTRL1與CTRL2控制兩位數(shù)碼管的使能
- sbit CTRL1 = P3^0;
- sbit CTRL2 = P3^1;
- //BUTTON是按鍵端口,本次使用P0的0~5這6個(gè)io口。(P0:0x80, P1:0x90, P2:0xA0, P3:0xB0)
- sfr BUTTON = 0x80;
- //點(diǎn)亮數(shù)碼管(共陽)的函數(shù)
- void dig_num(unsigned int x)
- {
- unsigned int i;
- unsigned int y;
- //共陽數(shù)碼管0~9對應(yīng)的編碼
- unsigned char code num[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- y = x % 10;
- x = x / 10;
- CTRL1 = 0;
- CTRL2 = 1;
- P2 = num[y];
- for(i=0;i<20;i++);
- CTRL2 = 0;
- CTRL1 = 1;
- P2 = num[x];
- for(i=0;i<20;i++);
- P2 = 0xFF;
- CTRL1 = 0;
- }
- void main()
- {
- unsigned int i, j;
- //key_map用于定義每個(gè)按鍵的功能
- unsigned int key_map[6][5] = {{1, 2, 3, 4, 5},
- {6, 7, 8, 9, 10},
- {11, 12, 13, 14, 15},
- {16, 17, 18, 19, 20},
- {21, 22, 23, 24, 25},
- {26, 27, 28, 29, 30}};
- unsigned char mask = 0x01;
-
- BUTTON = 0xFF;
- while (1)
- {
- //逐行掃描
- for (i=0; i<6; i++)
- {
- BUTTON = 0xFF ^ mask;
- //逐列掃描
- for (j=0; j<6; j++)
- {
- //檢測到某個(gè)io口低電平,可能是按鈕被按下
- if (((BUTTON >> j) & 0x01) == 0x00)
- {
- //i == j時(shí)的低電平io口恰好是逐行掃描設(shè)定的io口,不用管
- if (i < j) dig_num(key_map[i][5-j]);
- else if (i > j) dig_num(key_map[i][4-j]);
- }
- }
- mask = mask << 1;
- }
- mask = 0x01;
- }
- }
復(fù)制代碼
下面是仿真的效果展示:
https://v.youku.com/v_show/id_XNTg5NTk3OTU2OA==.html
proteus仿真文件、hex文件、c源碼文件在這個(gè)壓縮包里:
6個(gè)引腳控制30個(gè)開關(guān).zip
(40.1 KB, 下載次數(shù): 13)
2022-8-24 01:19 上傳
點(diǎn)擊文件名下載附件
|
|