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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4392|回復: 19
收起左側

求大神指導我需要一個能做到30個按鍵掃描的鍵盤用51單片機

[復制鏈接]
回帖獎勵 60 黑幣 回復本帖可獲得 20 黑幣獎勵! 每人限 1 次
ID:696382 發(fā)表于 2020-5-29 11:33 | 顯示全部樓層 |閱讀模式
需要用lcd液晶顯示來顯示按鍵掃描里哪里沒有被按下希望得到大神指點
回復

使用道具 舉報

ID:401564 發(fā)表于 2020-5-29 15:16 | 顯示全部樓層
使用ADC端口加分壓電阻,三四個端口就可以有30個按鍵了,自己參考一下 51hei截圖20200529151533.jpg
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-5-29 19:22 | 顯示全部樓層
除了按下的就是都沒按下!
回復

使用道具 舉報

ID:420836 發(fā)表于 2020-5-29 22:53 | 顯示全部樓層
可以使用IO擴展電路,或IO和電阻矩陣電路來創(chuàng)建大鍵盤。
回復

使用道具 舉報

ID:213173 發(fā)表于 2020-5-29 23:29 | 顯示全部樓層
給你寫一個5*6矩陣鍵盤數(shù)碼管動態(tài)顯示示例參考,端口可以按實際需要自行更改,再把數(shù)碼管顯示改為LCD顯示。
無標題.jpg

  1. //P1.0~1.5接行線,P1.6~1.7、P2.0~2.2接列線
  2. //數(shù)碼管顯示鍵值
  3. #include<reg51.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define PD (P2&0x07)<<8|P1 //宏定義5*6矩陣端口
  7. sbit wela1=P2^6;//數(shù)碼管十位
  8. sbit wela2=P2^7;//數(shù)碼管個位
  9. uchar code table[]={//共陰數(shù)碼管段碼"0~f"
  10.                 0x3f,0x06,0x5b,0x4f,
  11.                 0x66,0x6d,0x7d,0x07,
  12.                 0x7f,0x6f,0x77,0x7c,
  13.                 0x39,0x5e,0x79,0x71};
  14. uint key=0;                                                        //鍵值變量
  15. uchar ge,shi;
  16. bit flag;

  17. void PX(uint i)                                        //寫入16位數(shù)據(jù)
  18. {   
  19.         P1=i;
  20.         P2&=0xf8;//清0 P2低3位不影響高5位狀態(tài)
  21.         P2|=i>>8;//
  22. }

  23. void keyscan()                                                //按鍵掃描程序
  24. {
  25.         static bit sign=0;                                //按鍵自鎖標志
  26.         static uint count=0;                        //消抖計數(shù)變量                       
  27.         uint num=0;                                                //臨時變量
  28.         PX(0x07C0);                                                //賦值PX 11111 000000
  29.         num=PD;                                                        //保存PD值 xxxxx 000000,x為0或1
  30.         if(num!=0x07C0)                                        //檢測有按鍵按下
  31.         {
  32.                 if(++count>=10 && sign==0)  //根據(jù)主循環(huán)周期調整約10~20ms
  33.                 {                       
  34.                         sign=1;                                        //按鍵自鎖標志置1
  35.                         num|=0x003f;                        //保存num按位或003f值 xxxxx 111111
  36.                         PX(num);                                //賦值PX              xxxxx 111111
  37.                         num=PD;                                        //保存PD值            xxxxx xxxxxx
  38.                         switch(num)
  39.                         {
  40.                                 case 0x07be: key= 1; break;//011110 111110
  41.                                 case 0x077e: key= 2; break;//011101 111110
  42.                                 case 0x06fe: key= 3; break;//011011 111110
  43.                                 case 0x05fe: key= 4; break;//010111 111110
  44.                                 case 0x03fe: key= 5; break;//001111 111110

  45.                                 case 0x07bd: key= 6; break;//011110 111101
  46.                                 case 0x077d: key= 7; break;//011101 111101
  47.                                 case 0x06fd: key= 8; break;//011011 111101
  48.                                 case 0x05fd: key= 9; break;//010111 111101
  49.                                 case 0x03fd: key=10; break;//001111 111101

  50.                                 case 0x07bb: key=11; break;//011110 111011
  51.                                 case 0x077b: key=12; break;//011101 111011
  52.                                 case 0x06fb: key=13; break;//011011 111011
  53.                                 case 0x05fb: key=14; break;//010111 111011
  54.                                 case 0x03fb: key=15; break;//001111 111011

  55.                                 case 0x07b7: key=16; break;//011110 110111
  56.                                 case 0x0777: key=17; break;//011101 110111
  57.                                 case 0x06f7: key=18; break;//011011 110111
  58.                                 case 0x05f7: key=19; break;//010111 110111
  59.                                 case 0x03f7: key=20; break;//001111 110111

  60.                                 case 0x07af: key=21; break;//011110 101111
  61.                                 case 0x076f: key=22; break;//011101 101111
  62.                                 case 0x06ef: key=23; break;//011011 101111
  63.                                 case 0x05ef: key=24; break;//010111 101111
  64.                                 case 0x03ef: key=25; break;//001111 101111

  65.                                 case 0x079f: key=26; break;//011110 011111
  66.                                 case 0x075f: key=27; break;//011101 011111
  67.                                 case 0x06df: key=28; break;//011011 011111
  68.                                 case 0x05df: key=29; break;//010111 011111
  69.                                 case 0x03df: key=30; break;//001111 011111
  70.                         }
  71.                 }
  72.         }
  73.         else                                                //鍵抬起
  74.         {
  75.                 sign=0;                                        //按鍵自鎖標志清0
  76.                 count=0;                                //消抖計數(shù)清0
  77.         }
  78. }
  79. void main()                                                //主函數(shù)
  80. {
  81.         while(1)
  82.         {
  83.                 keyscan();                                //按鍵掃描程序
  84.                 if(flag)
  85.                 {
  86.                         P0=0x00;
  87.                         wela1=0;
  88.                         wela2=1;
  89.                         P0=table[key/10];
  90.                         flag=~flag;
  91.                 }
  92.                 else
  93.                 {
  94.                         P0=0x00;
  95.                         wela1=1;
  96.                         wela2=0;
  97.                         P0=table[key%10];
  98.                         flag=~flag;
  99.                 }
  100.         }
  101. }
復制代碼




回復

使用道具 舉報

ID:386602 發(fā)表于 2020-5-30 07:15 | 顯示全部樓層
可以做成按鈕矩陣鏈接占用11個IO口
回復

使用道具 舉報

ID:307407 發(fā)表于 2020-5-30 08:56 | 顯示全部樓層
有很多種方法:
第一種:采用獨立按鍵直接并接到I/O口上;
優(yōu)點:程序和硬件電路都簡單;
缺點:占用過多的I/O口,需用到I/O口比較多的單片機;
第二種:矩陣掃描,使用12個I/O口,就可以掃描6x6=36個按鍵,只需用到30個按鍵就能完成此功能;
優(yōu)點:硬件電路簡單;
缺點:矩陣按鍵掃描程序變得更復雜;
第三種:采用并轉串芯片增加I/O口,例如74HC165;
缺點:須另加多片165芯片,硬件電路復雜,軟件也相對復雜
第四種:采用自帶ADC的單片機;每個開關都接上不同的分壓比,將不同的電壓值送入單片機ADC處理,轉換成對應的ADC數(shù)值,再通過程序對應每個開關,即可實現(xiàn)一個I/O口掃描30個按鍵;
優(yōu)點:占用極少的I/O資源,電路也相對容易;
缺點:需要用到帶ADC的單片機,如STC12C5612AD;

以上方法都可以實現(xiàn)30個按鍵的掃描!!
回復

使用道具 舉報

ID:696382 發(fā)表于 2020-5-30 08:57 | 顯示全部樓層
Y_G_G 發(fā)表于 2020-5-29 15:16
使用ADC端口加分壓電阻,三四個端口就可以有30個按鍵了,自己參考一下

謝謝大佬提供新思路
回復

使用道具 舉報

ID:696382 發(fā)表于 2020-5-30 08:58 | 顯示全部樓層
TTQ001 發(fā)表于 2020-5-29 22:53
可以使用IO擴展電路,或IO和電阻矩陣電路來創(chuàng)建大鍵盤。

謝謝,我去查一下資料
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-5-30 14:09 | 顯示全部樓層
不用擴展不用6*6,使用4*4就可以組合實現(xiàn)32個按鍵,之前發(fā)布的電路圖已經(jīng)24個按鍵了,可再加8個按鍵。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-5-30 21:37 | 顯示全部樓層
無標題.png

評分

參與人數(shù) 1黑幣 +12 收起 理由
8092553 + 12 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:332444 發(fā)表于 2020-5-30 21:51 | 顯示全部樓層
這個圖調整的精致點好看點
無標題.png


回復

使用道具 舉報

ID:332444 發(fā)表于 2020-5-31 05:40 | 顯示全部樓層
無標題.png

回復

使用道具 舉報

ID:332444 發(fā)表于 2020-5-31 14:42 | 顯示全部樓層
2種按鍵掃描結合起來即可實現(xiàn)32按鍵功能。4*4矩陣按鍵掃描代碼也不多可參
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-1 08:26 | 顯示全部樓層
錄像14_轉.gif
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-1 15:07 | 顯示全部樓層
錄像15_轉.gif
回復

使用道具 舉報

ID:696382 發(fā)表于 2020-6-2 11:57 | 顯示全部樓層
wulin 發(fā)表于 2020-5-29 23:29
給你寫一個5*6矩陣鍵盤數(shù)碼管動態(tài)顯示示例參考,端口可以按實際需要自行更改,再把數(shù)碼管顯示改為LCD顯示。 ...

謝謝大佬
回復

使用道具 舉報

ID:696382 發(fā)表于 2020-6-2 13:33 | 顯示全部樓層

謝謝大佬提供思路,我現(xiàn)在是使用的38譯碼器來設計的,我的按鍵都是常開繼電器,我想通電后線路無誤,其對應的繼電器就會閉合,但是我沒技術找到比較好的存儲按鍵信息的方法,我想用顯示屏來顯示某號繼電器未閉合。請問大佬有案例供我們初學者學習的嗎
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-2 13:59 | 顯示全部樓層
你的30個常開繼電器觸點按4*4矩陣按鍵電路接法來檢測?如果是的話,那么,對應不同的IO讀取值,是可以判斷哪個沒閉合。
回復

使用道具 舉報

ID:332444 發(fā)表于 2020-6-2 16:03 | 顯示全部樓層
扯點閑篇,這是剛設計出來的使用數(shù)碼管顯示A-Z字母,有些字母需要一點想象力。
錄像17_轉.gif

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产高清视频 | 91国内精品久久 | 天天射视频 | 精品视频在线一区 | 国产激情视频在线 | 日本一区二区不卡 | 在线中文字幕av | 亚洲精品v日韩精品 | 久久久www成人免费无遮挡大片 | 精品久久视频 | 国产亚洲网站 | 久久99国产精一区二区三区 | 精品国产一二三区 | 中文字幕一区在线观看视频 | 美女天天干天天操 | 久久精品中文字幕 | 在线视频 欧美日韩 | 国产免费一区二区三区网站免费 | 久久久久久99 | 97起碰 | 亚洲综合在线视频 | www..99re| 国产精品久久久久久一区二区三区 | 一本大道久久a久久精二百 国产成人免费在线 | 黑人中文字幕一区二区三区 | 三级黄色网址 | 国产草草视频 | 亚洲精品免费在线观看 | 国产美女高潮 | 欧美日韩国产一区二区三区 | 成人在线视频免费观看 | 麻豆精品一区二区三区在线观看 | 欧美一级片在线看 | 亚洲国产午夜 | 日韩资源| 九色在线视频 | 欧美一区在线视频 | 一区二区三区四区电影视频在线观看 | 99re66在线观看精品热 | 日本一区二区三区在线观看 | 三级黄色片在线观看 |