单片机学习笔记(五)—— 键盘

1、键盘的分类
        · 编码式键盘
        · 非编码式键盘

        编码式键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值。(如:计算机键盘)
        非编码式键盘:软件编程来识别。(单片机中使用最多)

2、非编码式键盘
         · 独立键盘
         · 矩阵键盘

    (1)独立键盘

原理:当按键被按下时,P3.4 / P3.7 将会与 GND 连通,即为低电平(0);

     随手代码:    
  
  
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit d1=P1^0;
  5. sbit dula=P2^6; //数码管段选信号
  6. sbit wela=P2^7; //数码管位选信号
  7. sbit key1=P3^4; //独立按键key1
  8. uchar code table[]={ //数码管显示编码
  9. 0x3f,0x06,0x5b,0x4f,
  10. 0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,
  12. 0x39,0x5e,0x79,0x71};
  13. uchar num;
  14. void delay(uint z) //延时 (防抖)
  15. {
  16. uint x,y;
  17. for(x=z;x>0;x--)
  18. for(y=110;y>0;y--);
  19. }
  20. void main()
  21. {
  22. wela=1;
  23. P0=0xfe; //打开低一数码管
  24. wela=0;
  25. P3=0xff;
  26. while(1)
  27. {
  28. if(key1==0) //监听按键是否被按下
  29. {
  30. delay(5);//延时5ms (具体解释见本文尾)
  31. if(key1==0)//再次确认按键是否被按下
  32. {
  33. d1=0;
  34. num++;
  35. if(num==10)
  36. num=0;
  37. }
  38. while(!key1);//松手监测
  39. delay(5);
  40. while(!key1);//再次确认是否松手
  41. }
  42. else
  43. d1=1;
  44. dula=1;
  45. P0=table[num];//数码管显示
  46. dula=0;
  47. }
  48. }
    (2)矩阵键盘
              通常,矩阵式键盘 8 个引脚接在单片机的 P3.0 ~P3.7上

原理:(以下为第一行键盘,以此类推)
         (1)将 P3 口赋值为 0xfe (1111,1110)
         (2)定义一个变量 temp = P3, 通过 temp &=  0xf0,取其高四位,判断是否有键被按下
         (3)重读 P3 口,判断是哪一个键被按下

随手代码:
  
  
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit dula = P2 ^ 6;
  5. sbit wela = P2 ^ 7;
  6. uchar code table[]={
  7. 0x3f,0x06,0x5b,0x4f,
  8. 0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x77,0x7c,
  10. 0x39,0x5e,0x79,0x71,0};
  11. uchar num,temp,num1;
  12. void delay(uint z)
  13. {
  14. uint x,y;
  15. for(x = z; x > 0; x--)
  16. for(y = 110; y > 0; y--);
  17. }
  18. uchar keyscan();
  19. void display(uchar aa);
  20. void main()
  21. {
  22. num = 17;
  23. dula = 1;
  24. P0 = 0;
  25. dula = 0;
  26. wela = 1;
  27. P0 = 0xc0;
  28. wela = 0;
  29. while(1)
  30. {
  31. display(keyscan());
  32. }
  33. }
  34. void display(uchar aa)//数码管显示
  35. {
  36. dula = 1;
  37. P0 = table[ aa - 1 ];
  38. dula = 0;
  39. }
  40. uchar keyscan()
  41. {
  42. P3 = 0xfe;
  43. temp = P3;
  44. temp = temp & 0xf0;
  45. while(temp != 0xf0)//防抖
  46. {
  47. delay(5);
  48. temp = P3;
  49. temp = temp & 0xf0;
  50. while(temp != 0xf0)
  51. {
  52. temp = P3;
  53. switch(temp)
  54. {
  55. case 0xee: num = 1;
  56. break;
  57. case 0xde: num = 2;
  58. break;
  59. case 0xbe: num = 3;
  60. break;
  61. case 0x7e: num = 4;
  62. break;
  63. }
  64. while(temp != 0xf0)//松手监测
  65. {
  66. temp=P3;
  67. temp=temp&0xf0;
  68. }
  69. }
  70. }
  71. P3 = 0xfd;
  72. temp = P3;
  73. temp = temp & 0xf0;
  74. while(temp != 0xf0)
  75. {
  76. delay(5);
  77. temp = P3;
  78. temp = temp & 0xf0;
  79. while(temp != 0xf0)
  80. {
  81. temp = P3;
  82. switch(temp)
  83. {
  84. case 0xed: num = 5;
  85. break;
  86. case 0xdd: num = 6;
  87.     break;
  88. case 0xbd: num = 7;
  89. break;
  90. case 0x7d: num = 8;
  91. break;
  92. }
  93. while(temp != 0xf0)
  94. {
  95. temp = P3;
  96. temp = temp & 0xf0;
  97. }
  98. }
  99. }
  100. P3 = 0xfb;
  101. temp = P3;
  102. temp = temp & 0xf0;
  103. while(temp != 0xf0)
  104. {
  105. delay(5);
  106. temp = P3;
  107. temp = temp & 0xf0;
  108. while(temp != 0xf0)
  109. {
  110. temp = P3;
  111. switch(temp)
  112. {
  113.      case 0xeb: num = 9;
  114. break;
  115. case 0xdb: num = 10;
  116. break;
  117. case 0xbb: num = 11;
  118. break;
  119. case 0x7b: num = 12;
  120. break;
  121. }
  122. while(temp != 0xf0)
  123. {
  124. temp = P3;
  125.     temp = temp & 0xf0;
  126. }
  127. }
  128. }
  129. P3 = 0xf7;
  130. temp = P3;
  131. temp = temp & 0xf0;
  132. while(temp != 0xf0)
  133. {
  134. delay(5);
  135. temp = P3;
  136. temp = temp & 0xf0;
  137. while(temp != 0xf0)
  138. {
  139. temp = P3;
  140. switch(temp)
  141. {
  142. case 0xe7: num = 13;
  143. break;
  144. case 0xd7: num = 14;
  145. break;
  146. case 0xb7: num = 15;
  147. break;
  148. case 0x77: num = 16;
  149. break;
  150. }
  151.     while(temp != 0xf0)
  152. {
  153. temp = P3;
  154. temp = temp & 0xf0;
  155. }
  156. }
  157. }
  158.     return num;
  159. }
3、抖动现象
        按键在闭合和断开时,触点会存在抖动现象

                                 图  1                                                                   图  2
           如图1,我们可以在 delay(5)后,重新读取,可消除抖动; 图2是硬件防抖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值