找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

51單片機8個IO口掃描檢測64個按鍵+仿真程序+算法實現(xiàn)和心法要點講解

查看數(shù): 6444 | 評論數(shù): 6 | 收藏 7
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2021-9-11 23:23

正文摘要:

51單片機8個IO口掃描檢測64個按鍵+數(shù)碼管顯示+程序+Proteus仿真+算法實現(xiàn)和心法要點講解掃描原理想通了很簡單,就是通過一個IO拉低,其檢測這一組其他7個IO口狀態(tài),如果檢測到有被拉低了,說明就有按鍵按下了,因為 ...

回復(fù)

ID:795427 發(fā)表于 2021-9-16 10:33
npn 發(fā)表于 2021-9-12 16:58
這個程序還可以優(yōu)化很多,仿真測試OK。

感謝壇友的集思廣益,群策群力,在源代碼基礎(chǔ)上做的優(yōu)化和改進。
ID:954686 發(fā)表于 2021-9-12 17:03
不錯,這個例程好。IO不夠的時候,之前用過4個IO口實現(xiàn)16個按鍵的方法,和樓主的電路差不多。
ID:57657 發(fā)表于 2021-9-12 16:58
這個程序還可以優(yōu)化很多,仿真測試OK。
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. sbit P36 = P3 ^ 6;
  5. sbit P37 = P3 ^ 7;
  6. sbit STCP = P3 ^ 0;//定義74HC595移位寄存器
  7. sbit SHCP = P3 ^ 2;
  8. sbit DS = P3 ^ 1;

  9. u8 code table[16] = {                //共陰數(shù)碼管段碼16進制
  10.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  11. };

  12. void delay(){
  13.     u8 a,b;
  14.     for(b=19;b>0;b--)
  15.         for(a=130;a>0;a--);
  16. }

  17. void txd595(u8 d) {
  18.         u8 i;
  19.         for (i = 0; i < 8; i++) {
  20.                 DS = d & 0x80;
  21.                 SHCP = 0;
  22.                 d <<= 1;
  23.                 SHCP = 1;
  24.         }
  25.         STCP=0;_nop_();STCP=1;
  26. }

  27. void display(u8 d) {
  28.         P37 = 0;
  29.         txd595(table[d%10]);
  30.         delay();
  31.         P37 = 1;
  32.         _nop_();
  33.         P36 = 0;
  34.         txd595(table[d/10]);
  35.         delay();
  36.         P36 = 1;
  37. }

  38. u8 b0(u8 dat) {                //取一個字節(jié)中有多少個二進制0 返回0~8
  39.         u8 i, j = 0;
  40.         for (i = 0; i < 8; i++) {
  41.                 if (!(dat & (1 << i))) {
  42.                         j++;
  43.                 }
  44.         }
  45.         return j;
  46. }

  47. u8 key_scan() {                //無按鍵返回0 有按鍵返回1~64 (禁止多個按鍵同時按下,出錯返回99)
  48.         u8 i, j, k, l, m;
  49.         P0 = 0xFF;
  50.         _nop_();
  51.         k = P0;
  52.         if (k != 0xFF) {
  53.                 if (b0(k) != 1) return 99;
  54.                 for (i = 0; i < 8; i++) {
  55.                         if (!(k & (1 << i))) {
  56.                                 return 57 + i;
  57.                         }
  58.                 }
  59.         }

  60.         for (i = 0; i < 8; i++) {
  61.                 j = ~(1 << i);
  62.                 P0 = j;
  63.                 _nop_();
  64.                 k= P0;
  65.                 if (k != j) {
  66.                         if (k & ~j || b0(k) != 2) return 99;
  67.                         m = 0;
  68.                         for (l = 0; l < 8; l++) {
  69.                                 if (i == l) continue;
  70.                                 m++;
  71.                                 if (!(k & (1 << l))) {
  72.                                         return i * 7 + m;
  73.                                 }
  74.                         }
  75.                 }

  76.         }
  77.         return 0;
  78. }

  79. void main() {
  80.         while (1) {
  81.                 display(key_scan());
  82.         }
  83. }
復(fù)制代碼
ID:164385 發(fā)表于 2021-9-12 10:14
樓主很厲害,辛苦了
ID:284488 發(fā)表于 2021-9-12 09:14
感謝樓主的分享,學(xué)習(xí)了。
ID:333678 發(fā)表于 2021-9-12 07:51
感謝樓主的無私奉獻,下載學(xué)習(xí)了。

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

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

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