当前位置:   article > 正文

蓝桥杯51单片机-矩阵键盘扫描原理和基本应用_51单片机c4

51单片机c4

基本功能:编写矩阵按键程序,实现每按下一个按键依次显示0-F。

以上为我们实现基本功能所需要使用的元器件

注意:我们需要使用矩阵键盘,需要将J5的跳帽盖在1,2的位置。由于使用的是IAP单片机,则P36,P37端口分别改为P42,P44

接下来我们来分析矩阵键盘的扫描原理,我们以具体的代码来分析

  1. sbit R1=P3^0;
  2. sbit R2=P3^1;
  3. sbit R3=P3^2;
  4. sbit R4=P3^3;
  5. sbit C1=P4^4;
  6. sbit C2=P4^2;
  7. sbit C3=P3^5;
  8. sbit C4=P3^4;
  9. void Delay1ms(unsigned char x)
  10. {
  11. while(x--)
  12. {
  13. unsigned char i,j;
  14. i=12;
  15. j=169;
  16. do
  17. {
  18. while(--j);
  19. } while(--i);
  20. }
  21. }
  22. void ScanKeysMulti()//ROW行/column列
  23. {
  24. R1=0;
  25. R2=R3=R4=1;
  26. C1=C2=C3=C4=1;
  27. if(C1==0)
  28. {
  29. Delay1ms(5);
  30. if(C1==0)
  31. {
  32. while(C1==0);
  33. key=0;
  34. }
  35. }
  36. else if(C2==0)
  37. {
  38. Delay1ms(5);
  39. if(C2==0)
  40. {
  41. while(C2==0);
  42. key=1;
  43. }
  44. }
  45. else if(C3==0)
  46. {
  47. Delay1ms(5);
  48. if(C3==0)
  49. {
  50. while(C3==0);
  51. key=2;
  52. }
  53. }
  54. else if(C4==0)
  55. {
  56. Delay1ms(5);
  57. if(C4==0)
  58. {
  59. while(C4==0);
  60. key=3;
  61. }
  62. }
  63. }

矩阵键盘的扫描原理我们可以把键盘分为两部分理解,分别为行和列,我们来看这行代码

    R1=0;
    R2=R3=R4=1;
    C1=C2=C3=C4=1;

每一列我们都设为高电平,而在行里,只有第一行是低电平,其他行是高电平,根据原理图,当我们随机按下第一行的一个按键S7,S11,S15,S19时,那它对应的列也会被拉低,变成低电平,而其他列一直保持高电平,此时我们就能通过哪一列为低电平来判断是哪个按键被按下。也就是说,当执行以上代码时,按键的行先被确定,默认为第一行,再通过哪一列为低电平判断按键的列,当这两个部分都被确定好之后,那么是哪个按键被按下我们就能得知了,明白这些之后,我们就能很轻松地完成基本功能,以下是代码。

  1. #include "reg52.h"
  2. sfr P4 = 0xC0;
  3. sbit R1 = P3^0;
  4. sbit R2 = P3^1;
  5. sbit R3 = P3^2;
  6. sbit R4 = P3^3;
  7. sbit C4 = P3^4;
  8. sbit C3 = P3^5;
  9. sbit C2 = P4^2;
  10. sbit C1 = P4^4;
  11. unsigned char code SMG_duanma[18]=
  12. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  13. 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
  14. 0xbf,0x7f};
  15. void SelectHC573(unsigned char channel)
  16. {
  17. switch(channel)
  18. {
  19. case 4:
  20. P2 = (P2 & 0x1f) | 0x80;
  21. break;
  22. case 5:
  23. P2 = (P2 & 0x1f) | 0xa0;
  24. break;
  25. case 6:
  26. P2 = (P2 & 0x1f) | 0xc0;
  27. break;
  28. case 7:
  29. P2 = (P2 & 0x1f) | 0xe0;
  30. break;
  31. }
  32. }
  33. void DisplayKeyNum(unsigned char value)
  34. {
  35. P0 = 0xff;
  36. SelectHC573(6);
  37. P0 = 0x01;
  38. SelectHC573(7);
  39. P0 = value;
  40. }
  41. unsigned char key_num;
  42. void ScanKeysMulti()//ROW行/column列
  43. {
  44. R1 = 0;
  45. R2 = R3 = R4 = 1;
  46. C1 = C2 = C3 = C4 =1;
  47. if(C1 == 0)
  48. {
  49. while(C1 == 0);
  50. key_num = 0;
  51. DisplayKeyNum(SMG_duanma[key_num]);
  52. }
  53. else if(C2 == 0)
  54. {
  55. while(C2 == 0);
  56. key_num = 1;
  57. DisplayKeyNum(SMG_duanma[key_num]);
  58. }
  59. else if(C3 == 0)
  60. {
  61. while(C3 == 0);
  62. key_num = 2;
  63. DisplayKeyNum(SMG_duanma[key_num]);
  64. }
  65. else if(C4 == 0)
  66. {
  67. while(C4 == 0);
  68. key_num = 3;
  69. DisplayKeyNum(SMG_duanma[key_num]);
  70. }
  71. R2 = 0;
  72. R1 = R3 = R4 = 1;
  73. C1 = C2 = C3 = C4 =1;
  74. if(C1 == 0)
  75. {
  76. while(C1 == 0);
  77. key_num = 4;
  78. DisplayKeyNum(SMG_duanma[key_num]);
  79. }
  80. else if(C2 == 0)
  81. {
  82. while(C2 == 0);
  83. key_num = 5;
  84. DisplayKeyNum(SMG_duanma[key_num]);
  85. }
  86. else if(C3 == 0)
  87. {
  88. while(C3 == 0);
  89. key_num = 6;
  90. DisplayKeyNum(SMG_duanma[key_num]);
  91. }
  92. else if(C4 == 0)
  93. {
  94. while(C4 == 0);
  95. key_num = 7;
  96. DisplayKeyNum(SMG_duanma[key_num]);
  97. }
  98. R3 = 0;
  99. R2 = R1 = R4 = 1;
  100. C1 = C2 = C3 = C4 =1;
  101. if(C1 == 0)
  102. {
  103. while(C1 == 0);
  104. key_num = 8;
  105. DisplayKeyNum(SMG_duanma[key_num]);
  106. }
  107. else if(C2 == 0)
  108. {
  109. while(C2 == 0);
  110. key_num = 9;
  111. DisplayKeyNum(SMG_duanma[key_num]);
  112. }
  113. else if(C3 == 0)
  114. {
  115. while(C3 == 0);
  116. key_num = 10;
  117. DisplayKeyNum(SMG_duanma[key_num]);
  118. }
  119. else if(C4 == 0)
  120. {
  121. while(C4 == 0);
  122. key_num = 11;
  123. DisplayKeyNum(SMG_duanma[key_num]);
  124. }
  125. R4 = 0;
  126. R2 = R3 = R1 = 1;
  127. C1 = C2 = C3 = C4 =1;
  128. if(C1 == 0)
  129. {
  130. while(C1 == 0);
  131. key_num = 12;
  132. DisplayKeyNum(SMG_duanma[key_num]);
  133. }
  134. else if(C2 == 0)
  135. {
  136. while(C2 == 0);
  137. key_num = 13;
  138. DisplayKeyNum(SMG_duanma[key_num]);
  139. }
  140. else if(C3 == 0)
  141. {
  142. while(C3 == 0);
  143. key_num = 14;
  144. DisplayKeyNum(SMG_duanma[key_num]);
  145. }
  146. else if(C4 == 0)
  147. {
  148. while(C4 == 0);
  149. key_num = 15;
  150. DisplayKeyNum(SMG_duanma[key_num]);
  151. }
  152. }
  153. void main()
  154. {
  155. while(1)
  156. {
  157. ScanKeysMulti();
  158. }
  159. }

注意:由于这里使用的是"reg52.h"头文件,而它没有P4端口的内存地址,所以要加上sfr P4    = 0xC0;或者使用#include "STC15F2K60S2.H"头文件

烧录进单片机后就能看到现象了

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

闽ICP备14008679号