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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

掃鍵極限復用IO口的單片機實現代碼

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

首先,我們將IO1~5全部置1,掃描IO1~5,如果有0就說明最下面K61~K65中對應的按鍵被觸發。接下來,將IO1置0,IO2~5置1,掃描IO2~5;將IO2置0,IO1,IO3~5置1并掃描;······;將IO5置0,IO1~4置1并掃描。以上便是一個完整的掃描周期,25個鍵都能夠被掃描到。

我自己仿真了用6個IO口掃描30個按鍵的程序,效果還不錯,代碼、hex燒錄文件和仿真文件都打包放在文章末尾了。不過暫時還沒有在實際中實驗,等我焊好按鍵鍵盤之后再試試!

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


按鍵對應的數字:
第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

實現該功能的代碼如下
  1. #include <reg52.h>

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

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

  7. //點亮數碼管(共陽)的函數
  8. void dig_num(unsigned int x)
  9. {
  10.         unsigned int i;
  11.         unsigned int y;
  12.         //共陽數碼管0~9對應的編碼
  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用于定義每個按鍵的功能
  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.                                 //檢測到某個io口低電平,可能是按鈕被按下
  50.                                 if (((BUTTON >> j) & 0x01) == 0x00)
  51.                                 {
  52.                                         //i == j時的低電平io口恰好是逐行掃描設定的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. }
復制代碼


下面是仿真的效果展示:


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

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



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

使用道具 舉報

沙發
ID:807591 發表于 2022-8-24 08:23 | 只看該作者
這些只合適娛樂,實際應用性也不大,全鍵按下無沖突貌似不行,另外程序負擔多一點點
回復

使用道具 舉報

板凳
ID:161164 發表于 2022-8-24 08:51 | 只看該作者
請問你的proteus是什么版本?
回復

使用道具 舉報

地板
ID:441351 發表于 2022-8-24 15:17 | 只看該作者
szb314 發表于 2022-8-24 08:23
這些只合適娛樂,實際應用性也不大,全鍵按下無沖突貌似不行,另外程序負擔多一點點

全鍵無沖太難了
回復

使用道具 舉報

5#
ID:441351 發表于 2022-8-24 15:19 | 只看該作者
lkc8210 發表于 2022-8-24 08:51
請問你的proteus是什么版本?

版本是7.8 SP2
回復

使用道具 舉報

6#
ID:441351 發表于 2022-8-25 11:18 | 只看該作者
lkc8210 發表于 2022-8-24 08:51
請問你的proteus是什么版本?

版本是7.8 SP2
回復

使用道具 舉報

7#
ID:624769 發表于 2022-8-25 14:11 來自手機 | 只看該作者
地球 發表于 2022-8-24 15:17
全鍵無沖太難了

矩陣是可以全鍵無沖的,關鍵看你代碼怎么寫。單線掃描的話,是可以識別組合鍵的。
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 老外黄色一级片 | 久久五月婷 | 日韩欧美亚洲 | 视频在线一区二区 | 日韩久久久久久久久久久 | 国产99视频精品免费播放照片 | 成人av网站在线观看 | 最新中文字幕第一页视频 | 国产精品99视频 | 韩国精品在线 | 精品综合久久 | 日日碰狠狠躁久久躁96avv | 在线免费黄色小视频 | 久久国产福利 | 精久久久| 在线日韩欧美 | 久久精品国产免费一区二区三区 | 性欧美精品一区二区三区在线播放 | 精品成人免费一区二区在线播放 | 国产精品毛片av | 九九久久精品 | 日韩中文一区二区三区 | 91精品国产乱码久久久久久 | 亚洲视频一区二区三区四区 | 乱一性一乱一交一视频a∨ 色爱av | 九九在线视频 | 日韩国产中文字幕 | 久久久久久久久久久一区二区 | 欧美xxxx日本 | 一区二区三区不卡视频 | 可以在线观看av的网站 | 伊人伊人网 | 国产精品久久久久久久久久久久午夜片 | 欧美成人不卡 | 久久这里只有精品首页 | 武道仙尊动漫在线观看 | 成人在线观看免费爱爱 | 91高清视频在线观看 | 日批日韩在线观看 | 日韩一区二区av | 亚洲在线视频 |