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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機4*4矩陣鍵盤掃描Proteus仿真程序(含松手檢測消抖處理)

[復制鏈接]
跳轉到指定樓層
樓主
ID:964116 發表于 2021-9-9 15:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
功能:
        掃描讀取4*4矩陣鍵盤的輸入,并顯示在數碼管上,掃描含消抖處理。包含C源碼及Proteus仿真文件,包含原理圖;

注:僅實現了0-15的顯示,6根數碼管顯示的數相同。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit wela = P2^7;          //位選端口
  5. sbit dula = P2^6;          //段選端口
  6. sbit beep = P2^3;          //蜂鳴器端口

  7. uchar temp, num;   

  8. void keyscan();
  9. void delay(uchar num);
  10. void display(uchar num);
  11. void initialization();

  12. uchar code Table[] =                //數碼管段碼數組
  13. {
  14.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,  //共陰極段碼 0 1 2 3 4 5
  15.     0x7D,0x07,0x7F,0x6F,0x77,0x7C,  //共陰極段碼 6 7 8 9 A b
  16.     0x39,0x5E,0x79,0x71,0x73,0x3E,  //共陰極段碼 C d E F P U
  17.     0x31,0x6E,0x76,0x38,0x00        //共陰極段碼 T y H L 滅燈
  18. };  

  19. void main()
  20. {   
  21.     initialization();
  22.     while (1)
  23.     {
  24.         beep = 0;
  25.         keyscan();
  26.     }
  27. }
  28. /************延時函數*************/
  29. void delay(uchar num)        //延時 num ms
  30. {
  31.     uint x, y;
  32.     for(x = num; x > 0; x--)
  33.     {
  34.         for(y = 110; y > 0; y--);
  35.     }
  36. }

  37. /****       鍵盤掃描函數        ****
  38. ****          函數功能        ****
  39. ****   掃描4*4矩陣鍵盤的輸入    ****/
  40. void keyscan()
  41. {
  42.    
  43.     P3 = 0xfe;      //檢測第一行矩陣鍵盤(0-3)
  44.     temp = P3;
  45.     temp = temp & 0xf0;     //判斷是否有按鍵按下
  46.     while(temp != 0xf0)   
  47.     {
  48.         delay(5);      
  49.         P3 = 0xfe;
  50.         temp = temp & 0xf0;
  51.         while(temp != 0xf0)    //延時消抖 確認有按鍵按下
  52.         {
  53.             temp = P3;
  54.             switch (temp)
  55.             {
  56.             case 0xee: num = 0;     //檢測到第一個鍵按下
  57.                 break;
  58.             case 0xde: num = 1;     //檢測到第二個鍵按下
  59.                 break;
  60.             case 0xbe: num = 2;     //檢測到第三個鍵按下
  61.                 break;
  62.             case 0x7e: num = 3;     //檢測到第四個鍵按下
  63.                 break;
  64.             }
  65.             while(temp != 0xf0)   //松手檢測
  66.             {
  67.                 temp = P3;
  68.                 temp = temp & 0xf0;
  69.             }
  70.             display(num);
  71.         }
  72.     }

  73.     P3 = 0xfd;      //檢測第二行矩陣鍵盤(4-7)
  74.     temp = P3;
  75.     temp = temp & 0xf0;     //判斷是否有按鍵按下
  76.     while(temp != 0xf0)     
  77.     {
  78.         delay(5);      
  79.         P3 = 0xfd;
  80.         temp = temp & 0xf0;
  81.         while(temp != 0xf0)     //延時消抖 確認有按鍵按下
  82.         {
  83.             temp = P3;
  84.             switch (temp)
  85.             {
  86.             case 0xed: num = 4;     //檢測到第一個鍵按下
  87.                 break;
  88.             case 0xdd: num = 5;     //檢測到第二個鍵按下
  89.                 break;
  90.             case 0xbd: num = 6;     //檢測到第三個鍵按下
  91.                 break;
  92.             case 0x7d: num = 7;     //檢測到第四個鍵按下
  93.                 break;
  94.             }
  95.             while(temp != 0xf0)    //松手檢測
  96.             {
  97.                 temp = P3;
  98.                 temp = temp & 0xf0;
  99.             }
  100.             display(num);  
  101.         }
  102.     }

  103.     P3 = 0xfb;      //檢測第三行矩陣鍵盤(8-11)
  104.     temp = P3;
  105.     temp = temp & 0xf0;     //判斷是否有按鍵按下
  106.     while(temp != 0xf0)     
  107.     {
  108.         delay(5);      
  109.         P3 = 0xfb;
  110.         temp = temp & 0xf0;
  111.         while(temp != 0xf0)     //延時消抖 確認有按鍵按下
  112.         {
  113.             temp = P3;
  114.             switch (temp)
  115.             {
  116.             case 0xeb: num = 8;     //檢測到第一個鍵按下
  117.                 break;
  118.             case 0xdb: num = 9;     //檢測到第二個鍵按下
  119.                 break;
  120.             case 0xbb: num = 10;     //檢測到第三個鍵按下
  121.                 break;
  122.             case 0x7b: num = 11;     //檢測到第四個鍵按下
  123.                 break;
  124.             }
  125.             while(temp != 0xf0)   //松手檢測
  126.             {
  127.                 temp = P3;
  128.                 temp = temp & 0xf0;
  129.             }
  130.             display(num);
  131.         }
  132.     }
  133.    
  134.     P3 = 0xf7;      //檢測第四行矩陣鍵盤(12-15)
  135.     temp = P3;
  136.     temp = temp & 0xf0;     //判斷是否有按鍵按下
  137.     while(temp != 0xf0)   
  138.     {
  139.         delay(5);      
  140.         P3 = 0xf7;
  141.         temp = temp & 0xf0;
  142.         while(temp != 0xf0)     //延時消抖 確認有按鍵按下
  143.         {
  144.             temp = P3;
  145.             switch (temp)
  146.             {
  147.             case 0xe7: num = 12;     //檢測到第一個鍵按下
  148.                 break;
  149.             case 0xd7: num = 13;     //檢測到第二個鍵按下
  150.                 break;
  151.             case 0xb7: num = 14;     //檢測到第三個鍵按下
  152.                 break;
  153.             case 0x77: num = 15;     //檢測到第四個鍵按下
  154.                 break;
  155.             }
  156.             while(temp != 0xf0)   //松手檢測
  157.             {
  158.                 temp = P3;
  159.                 temp = temp & 0xf0;
  160.             }
  161.             display(num);   
  162.         }
  163.     }
  164. }

  165. void display(uchar num)      //數碼管顯示函數
  166. {
  167.     beep = 1;
  168.     dula = 1;
  169.     P0 = Table[num];
  170.     dula = 0;
  171. }

  172. void initialization()       //數碼管初始化
  173. {
  174.     dula = 1;       //開段碼鎖存
  175.     P0 = 0x00;      //設數碼管初值      
  176.     dula = 0;
  177.     wela = 1;
  178.     P0 = 0xc0;      //選通6根數碼管
  179.     wela = 0;
  180. }
復制代碼

所有資料51hei附件下載:
Key_scan.rar (29.94 KB, 下載次數: 43)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:928738 發表于 2022-1-14 17:26 | 只看該作者
P3 = 0xfe;      //檢測第一行矩陣鍵盤(0-3)
temp = P3;
temp = temp & 0xf0;     //判斷是否有按鍵按下
代碼有問題,一直在賦值。試過了,沒法判斷按鍵是否按下。
回復

使用道具 舉報

板凳
ID:964116 發表于 2022-6-30 19:37 | 只看該作者
yayayunyun 發表于 2022-1-14 17:26
P3 = 0xfe;      //檢測第一行矩陣鍵盤(0-3)
temp = P3;
temp = temp & 0xf0;     //判斷是否有按鍵按 ...

這個稍等,我看看,過兩天回復
回復

使用道具 舉報

地板
ID:964116 發表于 2022-6-30 21:03 | 只看該作者
大一王 發表于 2022-6-30 19:37
這個稍等,我看看,過兩天回復

驗證過了,給的代碼沒問題,你把給的代碼重新燒錄進芯片。我打包的芯片里的是另一個。
回復

使用道具 舉報

5#
ID:964116 發表于 2022-6-30 21:06 | 只看該作者
矩陣鍵盤上的數字與數碼管有細微差別,改一下就可。

key_scan.rar

92.14 KB, 下載次數: 4, 下載積分: 黑幣 -5

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区免费观看 | 在线观看国产视频 | 精区3d动漫一品二品精区 | 91在线免费观看网站 | 性色综合 | 久久视频精品 | 欧美三级电影在线播放 | 国产一区二区av | 草逼网站 | 91热在线| 日韩精品在线一区 | 久久精品网 | 91精品在线播放 | 日韩高清一区二区 | 欧美亚洲国产日韩 | 亚洲自拍偷拍免费视频 | 欧美成人精品欧美一级 | 国产精品久久久久久模特 | 国产小网站 | 日韩免费1区二区电影 | 欧美中文字幕 | 91麻豆精品国产91久久久更新资源速度超快 | 国产a区 | 午夜国产 | 99热视 | 91久久精品| 伦理一区二区 | 精品视频一区二区三区在线观看 | 黄色日本片 | 一区二区三区欧美大片 | 久久精品无码一区二区三区 | 国产成人精品a视频一区www | 奇米视频777 | 亚洲电影成人 | 成人国产一区二区三区精品麻豆 | 99国产精品99久久久久久 | 天堂网色 | 99久久久久久99国产精品免 | 日韩人体视频 | 中文字幕第十页 | 人人做人人澡人人爽欧美 |