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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2776|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

掃鍵極限復(fù)用IO口的單片機(jī)實(shí)現(xiàn)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:441351 發(fā)表于 2022-8-23 23:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本人初學(xué)單片機(jī),前幾天看到論壇里"qinshuai"發(fā)的“堪稱一絕的“IO口掃鍵”法-單片機(jī)端口不夠用時(shí)鍵盤(pán)掃描方法”一文,發(fā)現(xiàn)真是把IO口的復(fù)用玩到了極致!按照原文的說(shuō)明,如果在電路中借助二極管,那么N個(gè)IO口最多能掃描N^2個(gè)按鍵!一般8腳的單片機(jī)有6個(gè)IO口,在不用其他IC的情況下最多能掃描36個(gè)按鍵!
下面是該方法的示意圖:

首先,我們將IO1~5全部置1,掃描IO1~5,如果有0就說(shuō)明最下面K61~K65中對(duì)應(yīng)的按鍵被觸發(fā)。接下來(lái),將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è)按鍵的程序,效果還不錯(cuò),代碼、hex燒錄文件和仿真文件都打包放在文章末尾了。不過(guò)暫時(shí)還沒(méi)有在實(shí)際中實(shí)驗(yàn),等我焊好按鍵鍵盤(pán)之后再試試!

下面是我的仿真電路圖,理論上6個(gè)IO口最多可以掃描36個(gè)按鍵,不過(guò)我只需要30個(gè)就夠了(6行5列),所以接地的六個(gè)按鍵我沒(méi)有接(寫(xiě)程序也省事)。按鍵按下后,程序需要把對(duì)應(yīng)的數(shù)字顯示在數(shù)碼管上。


按鍵對(duì)應(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)該功能的代碼如下
  1. #include <reg52.h>

  2. //CTRL1與CTRL2控制兩位數(shù)碼管的使能
  3. sbit CTRL1 = P3^0;
  4. sbit CTRL2 = P3^1;

  5. //BUTTON是按鍵端口,本次使用P0的0~5這6個(gè)io口。(P0:0x80, P1:0x90, P2:0xA0, P3:0xB0)
  6. sfr BUTTON = 0x80;

  7. //點(diǎn)亮數(shù)碼管(共陽(yáng))的函數(shù)
  8. void dig_num(unsigned int x)
  9. {
  10.         unsigned int i;
  11.         unsigned int y;
  12.         //共陽(yáng)數(shù)碼管0~9對(duì)應(yīng)的編碼
  13.         unsigned char code num[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  14.         y = x % 10;
  15.         x = x / 10;

  16.         CTRL1 = 0;
  17.         CTRL2 = 1;
  18.         P2 = num[y];
  19.         for(i=0;i<20;i++);

  20.         CTRL2 = 0;
  21.         CTRL1 = 1;
  22.         P2 = num[x];
  23.         for(i=0;i<20;i++);

  24.         P2 = 0xFF;
  25.         CTRL1 = 0;
  26. }

  27. void main()
  28. {
  29.         unsigned int i, j;
  30.         //key_map用于定義每個(gè)按鍵的功能
  31.         unsigned int key_map[6][5] = {{1, 2, 3, 4, 5},
  32.                                                                 {6, 7, 8, 9, 10},
  33.                                                                 {11, 12, 13, 14, 15},
  34.                                                                 {16, 17, 18, 19, 20},
  35.                                                                 {21, 22, 23, 24, 25},
  36.                                                                 {26, 27, 28, 29, 30}};
  37.         unsigned char mask = 0x01;
  38.         
  39.         BUTTON = 0xFF;
  40.         while (1)
  41.         {
  42.                 //逐行掃描
  43.                 for (i=0; i<6; i++)
  44.                 {
  45.                         BUTTON = 0xFF ^ mask;
  46.                         //逐列掃描
  47.                         for (j=0; j<6; j++)
  48.                         {
  49.                                 //檢測(cè)到某個(gè)io口低電平,可能是按鈕被按下
  50.                                 if (((BUTTON >> j) & 0x01) == 0x00)
  51.                                 {
  52.                                         //i == j時(shí)的低電平io口恰好是逐行掃描設(shè)定的io口,不用管
  53.                                         if (i < j) dig_num(key_map[i][5-j]);
  54.                                         else if (i > j) dig_num(key_map[i][4-j]);
  55.                                 }
  56.                         }
  57.                         mask = mask << 1;
  58.                 }
  59.                 mask = 0x01;
  60.         }
  61. }
復(fù)制代碼


下面是仿真的效果展示:


https://v.youku.com/v_show/id_XNTg5NTk3OTU2OA==.html

proteus仿真文件、hex文件、c源碼文件在這個(gè)壓縮包里:
6個(gè)引腳控制30個(gè)開(kāi)關(guān).zip (40.1 KB, 下載次數(shù): 13)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:807591 發(fā)表于 2022-8-24 08:23 | 只看該作者
這些只合適娛樂(lè),實(shí)際應(yīng)用性也不大,全鍵按下無(wú)沖突貌似不行,另外程序負(fù)擔(dān)多一點(diǎn)點(diǎn)
回復(fù)

使用道具 舉報(bào)

板凳
ID:161164 發(fā)表于 2022-8-24 08:51 | 只看該作者
請(qǐng)問(wèn)你的proteus是什么版本?
回復(fù)

使用道具 舉報(bào)

地板
ID:441351 發(fā)表于 2022-8-24 15:17 | 只看該作者
szb314 發(fā)表于 2022-8-24 08:23
這些只合適娛樂(lè),實(shí)際應(yīng)用性也不大,全鍵按下無(wú)沖突貌似不行,另外程序負(fù)擔(dān)多一點(diǎn)點(diǎn)

全鍵無(wú)沖太難了
回復(fù)

使用道具 舉報(bào)

5#
ID:441351 發(fā)表于 2022-8-24 15:19 | 只看該作者
lkc8210 發(fā)表于 2022-8-24 08:51
請(qǐng)問(wèn)你的proteus是什么版本?

版本是7.8 SP2
回復(fù)

使用道具 舉報(bào)

6#
ID:441351 發(fā)表于 2022-8-25 11:18 | 只看該作者
lkc8210 發(fā)表于 2022-8-24 08:51
請(qǐng)問(wèn)你的proteus是什么版本?

版本是7.8 SP2
回復(fù)

使用道具 舉報(bào)

7#
ID:624769 發(fā)表于 2022-8-25 14:11 來(lái)自觸屏版 | 只看該作者
地球 發(fā)表于 2022-8-24 15:17
全鍵無(wú)沖太難了

矩陣是可以全鍵無(wú)沖的,關(guān)鍵看你代碼怎么寫(xiě)。單線掃描的話,是可以識(shí)別組合鍵的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99久久国产视频 | 国产精品久久久久久久久久久久午夜片 | 激情都市亚洲 | 99精品视频在线 | 青青草精品 | 青青草国产精品 | 中国一级毛片免费看 | 亚洲午夜视频 | 国产精品欧美在线 | www.免费视频. | 国产日韩在线播放 | 久久久精品一区 | 黄片毛片在线观看 | 午夜久久久久久 | 奇米av| 综合一区二区三区 | 成人欧美视频 | 欧美激情视频一区二区三区 | 久久久久国产一区二区三区 | 香蕉视频一区二区三区 | 成年人免费看视频 | 欧美vieox另类极品 | 色在线视频 | 欧日韩av| 天天干b | 丝袜美腿一区二区三区 | a级片免费在线观看 | 亚洲精品1 | 日韩精品久久久久久久 | 亚洲午夜激情 | 天堂中文在线视频 | 最新中文字幕在线观看 | 久久久久一 | 美女黄色在线观看 | 国产又猛又黄又爽 | 国产成人亚洲精品自产在线 | 色天堂视频 | 久久精品视频免费看 | 伊人免费| 中文字幕在线资源 | av在线播放网址 |