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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5649|回復(fù): 0
收起左側(cè)

CT107D藍(lán)橋杯板子 矩陣鍵盤的運用

[復(fù)制鏈接]
ID:217409 發(fā)表于 2017-7-5 17:55 | 顯示全部樓層 |閱讀模式
值得注意的是:藍(lán)橋杯給的板子上鍵盤的第一列和第二列不是由 P37和P36控制的,分別是P44 和P42控制的

分別判斷P3的前4位和后四位確定按下了哪個鍵,其中P44和P42要分開討論

矩陣鍵盤

矩陣鍵盤


單片機源程序如下:
  1. //#include "reg52.h"  //定義51單片機特殊功能寄存器
  2. //#include "absacc.h"
  3. //
  4. //unsigned char temp;       
  5. //unsigned char value;
  6. //void delay()
  7. //{
  8. //        unsigned char i, j;
  9. //
  10. //        i = 108;
  11. //        j = 145;
  12. //        do
  13. //        {
  14. //                while (--j);
  15. //        } while (--i);
  16. //}
  17. //
  18. //void keydown()
  19. //{
  20. //        P3 = 0x0f;
  21. //        delay();                                      
  22. //    temp = P3;                                    
  23. //    if(temp != 0x0f)
  24. //    {
  25. //                switch(temp)
  26. //                {
  27. //                        case 0x0e: value = 1;break;
  28. //                        case 0x0d: value = 5;break;
  29. //                        case 0x0b: value = 9;break;
  30. //                        case 0x07: value = 13;break;
  31. //                }
  32. //        }
  33. //        P3 = 0xf0;
  34. //        delay();                                 
  35. //    temp = P3;
  36. //    if(temp != 0xf0)
  37. //        {
  38. //                switch(temp)
  39. //                {
  40. //                        case 0xe0: value += 3;break;
  41. //                        case 0xd0: value += 2;break;
  42. //                        case 0xb0: value += 1;break;
  43. //                        case 0x70: value += 0;break;
  44. //                }
  45. //        }
  46. //         while(P3 != 0xf0);
  47. //}
  48. //
  49. //int number(int x)
  50. //{
  51. //        switch(x)
  52. //        {
  53. //                case 0:return 0xC0;break;
  54. //                case 1:return 0xF9;break;
  55. //                case 2:return 0xA4;break;
  56. //                case 3:return 0xB0;break;
  57. //                case 4:return 0x99;break;
  58. //                case 5:return 0x92;break;
  59. //                case 6:return 0x82;break;
  60. //                case 7:return 0xF8;break;
  61. //                case 8:return 0x80;break;
  62. //                case 9:return 0x90;break;
  63. //                default :return 0xF3;break;
  64. //        }
  65. //}
  66. //
  67. //void main()
  68. //{       
  69. //        while(1)
  70. //        {
  71. //                keydown();
  72. //                P2 = ((P2&0x1f)|0xE0);
  73. //                P0 = 0xff;
  74. //                P2 &= 0x1f;
  75. //       
  76. //                P2 = ((P2&0x1f)|0xC0);
  77. //                P0 = 0x80;
  78. //                P2 &= 0x1f;
  79. //
  80. //                P2 = ((P2&0x1f)|0xE0);
  81. //                P0 = number(value);
  82. //                P2 &= 0x1f;
  83. //        }
  84. //}






  85. #include "reg52.h"  //定義51單片機特殊功能寄存器
  86. #include "absacc.h"

  87. sfr AUXR = 0x8E;
  88. sfr P4   = 0xC0;        //P4
  89. sbit P42 = P4^2;
  90. sbit P44 = P4^4;
  91.                            //  0    1    2    3    4    5    6    7    8    9   熄滅
  92. code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
  93. unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10};  //顯示緩沖區(qū)
  94. unsigned char dspcom = 0;

  95. bit key_re;
  96. unsigned char key_press;
  97. unsigned char key_value;

  98. bit key_flag = 0;
  99. unsigned char intr = 0;

  100. unsigned char read_keyboard(void);
  101. void display();

  102. //主函數(shù)
  103. void main(void)
  104. {
  105.     unsigned char key_temp = 0xff;
  106.    
  107.         AUXR |= 0x80;        //1T模式,IAP15F2K61S2單片機特殊功能寄存器
  108.        
  109.         TMOD &= 0xF0;
  110.         TL0 = 0xCD;       
  111.         TH0 = 0xD4;       
  112.         TF0 = 0;       
  113.         TR0 = 1;
  114.         ET0 = 1;
  115.         EA = 1;
  116.    
  117.     while(1)
  118.     {
  119.         if(key_flag)
  120.         {
  121.             key_flag = 0;
  122.                         key_temp = read_keyboard();
  123.                         if(key_temp != 0xFF){
  124.                                 dspbuf[7] = key_temp%10;
  125.                                 dspbuf[6] = key_temp/10;
  126.                         }
  127.         }
  128.         
  129.     }
  130. }

  131. //定時器中斷服務(wù)函數(shù)
  132. void isr_timer_0(void)  interrupt 1  //默認(rèn)中斷優(yōu)先級 1
  133. {     
  134.         display();
  135.         if(++intr == 10)  //1ms執(zhí)行一次
  136.         {
  137.         intr = 0;
  138.                 key_flag = 1;  //10ms按鍵掃描標(biāo)志位置1
  139.     }
  140. }

  141. //讀取矩陣鍵盤鍵值:轉(zhuǎn)接板中使用P42和P44代替8051引腳
  142. //順序中的P36和P37引腳
  143. unsigned char read_keyboard(void)
  144. {
  145.     static unsigned char col;
  146.    
  147.         P3 = 0xf0; P42 = 1; P44 = 1;

  148.     if((P3 != 0xf0)||(P42 != 0)||(P44 != 0)) //有按鍵按下
  149.         key_press++;
  150.         else
  151.                 key_press = 0;  //抖動
  152.    
  153.     if(key_press == 3)
  154.     {
  155.                 key_press = 0;
  156.                 key_re = 1;
  157.                
  158.                 if(P44 == 0)                        col = 1;
  159.                 if(P42 == 0)                        col = 2;
  160.                 if((P3 & 0x20) == 0)        col = 3;
  161.                 if((P3 & 0x10) == 0)        col = 4;
  162.         
  163.         P3 = 0x0F; P42 = 0; P44 = 0;

  164.                 if((P3&0x01) == 0)        key_value = (col-1);
  165.                 if((P3&0x02) == 0)        key_value = (col+3);
  166.                 if((P3&0x04) == 0)        key_value = (col+7);
  167.                 if((P3&0x08) == 0)        key_value = (col+11);
  168.     }
  169.    
  170.         //連續(xù)三次檢測到按鍵被按下,并且該按鍵已經(jīng)釋放
  171.         P3 = 0x0f; P42 = 0; P44 = 0;
  172.        
  173.     if(((key_re == 1) && (P3 == 0x0f))&&(P42 == 0)&&(P44 == 0))
  174.     {
  175.         key_re = 0;
  176.         return key_value;
  177. ……………………

  178. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
矩陣鍵盤.rar (27.03 KB, 下載次數(shù): 35)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品久久 | 99久久精品国产毛片 | 美女精品一区 | 国产成人精品久久二区二区91 | 成人av在线大片 | 全免一级毛片 | 午夜视频在线观看网站 | 国产成人精品一区二区三区视频 | 午夜视频免费在线观看 | 欧美黄色大片在线观看 | 精品国产青草久久久久96 | 日韩在线中文字幕 | 亚洲精品一区二区三区蜜桃久 | 欧美久久一级 | 国产精品毛片在线 | 国产人成精品一区二区三 | 国产一区二区精 | 日本又色又爽又黄又高潮 | 久久久久久国产精品免费免费 | 成年人视频在线免费观看 | 在线亚洲电影 | 91精品国产综合久久婷婷香蕉 | 国产精品大片 | 国产精品久久久99 | 在线小视频 | 国产精品久久久久久久久久三级 | 激情五月综合 | 日本免费视频在线观看 | 久久精品免费观看 | 激情在线视频 | 蜜桃视频在线观看www社区 | 一级特黄色毛片 | 欧美精品成人 | 成年人在线观看视频 | 免费一区二区三区在线视频 | 国产一级免费在线观看 | 亚洲不卡| 免费中文字幕 | 精品二| 色在线免费 | av片在线观看网站 |