当前位置:   article > 正文

蓝桥杯-单片机(矩阵键盘)_蓝桥杯单片机

蓝桥杯单片机

一、矩阵键盘电路原理图

如果需要使用矩阵键盘的时候,需要将CON3的1和2进行短接。

在上一讲已经讲过按键的原理,在本文就不再赘述了,直接讲解一下矩阵键盘的工作原理:

        前文提到过,如果单片机需要检测到有一个按键是否被按下最好的解决方案是直接检测与该按键直接相连的单片机引脚上的电平变化,如果在除抖操作后检测到一个上升沿或者下降沿,则认为该按键被按下。在矩阵键盘中也采用相同的处理措施。

        15单片机的引脚都是采用的外接上拉电阻处理,所以在没有任何外设的影响下,单片机的引脚是处在高电平状态,所以,我们对于按键而言,只能采用捕获下降沿的方式(5V->0v)来判断按键是否被按下,而不可采用获取上升沿的方式来检验按键。

        通过观察原理图,我们可以发现,矩阵键盘是有四行,四列,共16个节点组成的按键矩阵,我们可以将其用坐标方式给每个按键一个新的表述:

仔细读矩阵键盘的原理图,(1,1)坐标下的按键是由P3^0(P3寄存器的第3位)和P4^4(P4寄存器的第4位)两个引脚控制的,那我们想要制造一个下降沿,可以让P44为低点位或者让P30为低huan电位,然后检测另一个引脚的电位变化,就可以得到我们想要的一个结果。

  如果前面设置都没问题,那么按照理论,按下(1,1)按键,P30的引脚上会出现一个下降沿,由此可以判断,(1,1)按键被按下。

        按照如此理论,我们只要去模仿(1,1)按键的例子,就能完成矩阵键盘的检测工作,仔细观察不难发现,我们其实并不需要去用一个for或者while的循环,循环16次来检测,我们可以从原理图中看出,每一列与4行相交都会有4个交点,我们只需呀将某一列/(某一行)的电位置为0V,其余列/(其余行)的电位置为5V,然后循环检测4行/(4列)上面的电位变化,就可以得到矩阵键盘上第一列中哪一个按键被按下,然后依此改变后面三列上的电位,就可以实现矩阵键盘的键位检测了。

二:代码部分

  1. /*实现功能:根据矩阵键盘对应的数值,led显示其二进制数*/
  2. #include <stc15f2k60s2.h>
  3. sbit HC_A=P2^5;
  4. sbit HC_B=P2^6;
  5. sbit HC_C=P2^7;
  6. char result = 0;
  7. void delay(unsigned int t)
  8. {
  9. while(t--);
  10. }
  11. /*矩阵键盘部分*/
  12. char button()
  13. {
  14. P35 = 1;
  15. P36 = 1;
  16. P42 = 1;
  17. P44 = 0;
  18. if(P30 == 0 && P44 == 0)
  19. {
  20. delay(200);
  21. while(P30 == 0);
  22. delay(200);
  23. return 0x01;
  24. }
  25. if(P31 == 0 && P44 == 0)
  26. {
  27. delay(200);
  28. while(P31 == 0 );
  29. delay(200);
  30. return 0x05;
  31. }
  32. if(P32 == 0 && P44 == 0)
  33. {
  34. delay(200);
  35. while(P32 == 0);
  36. delay(200);
  37. return 0x09;
  38. }
  39. if(P33 == 0 && P44 == 0)
  40. {
  41. delay(200);
  42. while(P33 == 0);
  43. delay(200);
  44. return 0x0D;
  45. }
  46. P34 = 1;
  47. P35 = 1;
  48. P42 = 0;
  49. P44 = 1;
  50. if(P30 == 0 && P42 == 0)
  51. {
  52. delay(200);
  53. while(P30 == 0);
  54. delay(200);
  55. return 0x02;
  56. }
  57. if(P31 == 0 && P42 == 0)
  58. {
  59. delay(200);
  60. while(P31 == 0);
  61. delay(200);
  62. return 0x06;
  63. }
  64. if(P32 == 0 && P42 == 0)
  65. {
  66. delay(200);
  67. while(P32 == 0);
  68. delay(200);
  69. return 0x0A;
  70. }
  71. if(P33 == 0 && P42 == 0)
  72. {
  73. delay(200);
  74. while(P33 == 0);
  75. delay(200);
  76. return 0x0E;
  77. }
  78. P34 = 1;
  79. P35 = 0;
  80. P42 = 1;
  81. P44 = 1;
  82. if(P30 == 0 && P35 == 0)
  83. {
  84. delay(200);
  85. while(P30 == 0);
  86. delay(200);
  87. return 0x03;
  88. }
  89. if(P31 == 0 && P35 == 0)
  90. {
  91. delay(200);
  92. while(P31 == 0);
  93. delay(200);
  94. return 0x07;
  95. }
  96. if(P32 == 0 && P35 == 0)
  97. {
  98. delay(200);
  99. while(P32 == 0);
  100. delay(200);
  101. return 0x0B;
  102. }
  103. if(P33 == 0 && P35 == 0)
  104. {
  105. delay(200);
  106. while(P33 == 0);
  107. delay(200);
  108. return 0X0F;
  109. }
  110. P34 = 0;
  111. P35 = 1;
  112. P42 = 1;
  113. P44 = 1;
  114. if(P30 == 0 && P34 == 0)
  115. {
  116. delay(200);
  117. while(P30 == 0);
  118. delay(200);
  119. return 0x04;
  120. }
  121. if(P31 == 0 && P34 == 0)
  122. {
  123. delay(200);
  124. while(P31 == 0);
  125. delay(200);
  126. return 0x08;
  127. }
  128. if(P32 == 0 && P34 == 0)
  129. {
  130. delay(200);
  131. while(P32 == 0);
  132. delay(200);
  133. return 0x0C;
  134. }
  135. if(P33 == 0 && P34 == 0)
  136. {
  137. delay(200);
  138. while(P33 == 0);
  139. delay(200);
  140. return 0xff;
  141. }
  142. }
  143. /*主函数*/
  144. void main()
  145. {
  146. HC_A = 0;
  147. HC_B = 0;
  148. HC_C = 1;
  149. P0 = 0xff;
  150. while(1)
  151. {
  152. result = button();
  153. P0 = ~result;
  154. }
  155. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/553017
推荐阅读
相关标签
  

闽ICP备14008679号