当前位置:   article > 正文

单片机蓝桥杯——按键(独立按键和矩阵键盘)_一个按键实现3个功能的电路

一个按键实现3个功能的电路

电路原理图:

独立按键(S4、S5、S6、S7)

        当跳线帽接通J5的2 3引脚时,P3.6接地,检测P3.0、P3.1、P3.2、P3.3,若检测到该引脚为低电平,则该按键被按下(J5跳线帽接BTN)。

代码实现:当S7、S6、S5、S4被按下时,数码管依次显示1、2、3、4

  1. #include"reg51.h"
  2. #include"intrins.h"
  3. unsigned char code SMG_DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  4. 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
  5. 0xbf,0xff};
  6. sbit S7=P3^0;
  7. sbit S6=P3^1;
  8. sbit S5=P3^2;
  9. sbit S4=P3^3;
  10. void Delay10ms() //10ms延时(消抖)
  11. {
  12. unsigned char i, j;
  13. i = 108;
  14. j = 145;
  15. do
  16. {
  17. while (--j);
  18. } while (--i);
  19. }
  20. void Init_74HC138(unsigned char n)
  21. {
  22. switch(n)
  23. {
  24. case 4:
  25. P2=(P2 & 0x1f) | 0x80;
  26. break;
  27. case 5:
  28. P2=(P2 & 0x1f) | 0xa0;
  29. break;
  30. case 6:
  31. P2=(P2 & 0x1f) | 0xc0;
  32. break;
  33. case 7:
  34. P2=(P2 & 0x1f) | 0xe0;
  35. break;
  36. }
  37. }
  38. //********数码管显示子函数,smg_val为第一位数码管显示的数字********
  39. void SMG_Disp(unsigned char smg_val)
  40. {
  41. Init_74HC138(6);
  42. P0=0x01;//选通数码管第一位
  43. Init_74HC138(7);
  44. P0=SMG_DuanMa[smg_val];
  45. }
  46. //********按键扫描函数********
  47. void ScanKeys()
  48. {
  49. if(S7 == 0) //检测到S7按下
  50. {
  51. Delay10ms(); //延时消抖
  52. if(S7 == 0)//确定S7按下
  53. {
  54. SMG_Disp(1);//当S7被按下时,数码管显示“1
  55. }
  56. }
  57. if(S6 == 0)
  58. {
  59. Delay10ms();
  60. if(S6 == 0)
  61. {
  62. SMG_Disp(2);//当S6被按下时,数码管显示“2
  63. }
  64. }
  65. if(S5 == 0)
  66. {
  67. Delay10ms();
  68. if(S5 == 0)
  69. {
  70. SMG_Disp(3);//当S5被按下时,数码管显示“3
  71. }
  72. }
  73. if(S4 == 0)
  74. {
  75. Delay10ms();
  76. if(S4 == 0)
  77. {
  78. SMG_Disp(4);//当S4被按下时,数码管显示“4
  79. }
  80. }
  81. }
  82. void main()
  83. {
  84. while(1)
  85. {
  86. ScanKeys();
  87. }
  88. }

矩阵键盘

思路:先扫描行,再扫描列(也可先扫描列,再扫描行)。令其中某一行或某一列为0(等同于独立键盘的接地),判断对应的位置的列或行是否为0,从而确定是哪一个按键被按下(此时J5跳线帽接KBD)。

代码实现:当第1行第2列有按键按下时,数码管第二位第三位分别显示1 2; 当第3行第2列有按键按下时,数码管第二位第三位分别显示3 2......当按键松开,数码管熄灭。

  1. #include"reg51.h"
  2. #include"intrins.h"
  3. sfr P4=0xc0;//定义P4,便于程序的识别和运行
  4. sbit R1=P3^0;//1
  5. sbit R2=P3^1;//2
  6. sbit R3=P3^2;//3
  7. sbit R4=P3^3;//4
  8. sbit C1=P4^4;//1
  9. sbit C2=P4^2;//2
  10. sbit C3=P3^5;//3
  11. sbit C4=P3^4;//4
  12. //数码管段码表
  13. unsigned char code SMG_DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  14. 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
  15. 0xbf,0xff};
  16. void Init74HC138(unsigned char n)
  17. {
  18. switch(n)
  19. {
  20. case 4:
  21. P2=(P2 & 0x1f) | 0x80;
  22. break;
  23. case 5:
  24. P2=(P2 & 0x1f) | 0xa0;
  25. break;
  26. case 6:
  27. P2=(P2 & 0x1f) | 0xc0;
  28. break;
  29. case 7:
  30. P2=(P2 & 0x1f) | 0xe0;
  31. break;
  32. }
  33. }
  34. void SMG_Disp(unsigned char pos,unsigned char val)
  35. {
  36. Init74HC138(6);
  37. P0=(0x01<<pos);
  38. Init74HC138(7);
  39. P0=SMG_DuanMa[val];
  40. }
  41. void Delay10ms()
  42. {
  43. unsigned char i, j;
  44. i = 117;
  45. j = 184;
  46. do
  47. {
  48. while (--j);
  49. } while (--i);
  50. }
  51. //************数码管全灭子函数**************************
  52. void SMG_Mie()
  53. {
  54. SMG_Disp(0,17);
  55. Delay10ms();
  56. SMG_Disp(1,17);
  57. Delay10ms();
  58. SMG_Disp(2,17);
  59. Delay10ms();
  60. SMG_Disp(3,17);
  61. Delay10ms();
  62. SMG_Disp(4,17);
  63. Delay10ms();
  64. SMG_Disp(5,17);
  65. Delay10ms();
  66. SMG_Disp(6,17);
  67. Delay10ms();
  68. SMG_Disp(7,17);
  69. Delay10ms();
  70. }
  71. //************按键扫描函数**************************
  72. void ScanKeys()
  73. {
  74. R1=0; //扫描第一行
  75. R2=R3=R4=1;
  76. C1=C2=C3=C4=1;
  77. if(C1 == 0)
  78. {
  79. while(C1 == 0)//判断按键是否释放,没有释放则显示按键序号
  80. {
  81. SMG_Disp(1,1);
  82. Delay10ms();
  83. SMG_Disp(2,1);
  84. Delay10ms();
  85. }
  86. SMG_Mie();//按键松开,数码管熄灭
  87. }
  88. else if(C2 == 0)
  89. {
  90. while(C2 == 0)
  91. {
  92. SMG_Disp(1,1);
  93. Delay10ms();
  94. SMG_Disp(2,2);
  95. Delay10ms();
  96. }
  97. SMG_Mie();
  98. }
  99. else if(C3 == 0)
  100. {
  101. while(C3 == 0)
  102. {
  103. SMG_Disp(1,1);
  104. Delay10ms();
  105. SMG_Disp(2,3);
  106. Delay10ms();
  107. }
  108. SMG_Mie();
  109. }
  110. else if(C4 == 0)
  111. {
  112. while(C4 == 0)
  113. {
  114. SMG_Disp(1,1);
  115. Delay10ms();
  116. SMG_Disp(2,4);
  117. Delay10ms();
  118. }
  119. SMG_Mie();
  120. }
  121. R2=0; //扫描第二行
  122. R1=R3=R4=1;
  123. C1=C2=C3=C4=1;
  124. if(C1 == 0)
  125. {
  126. while(C1 == 0)
  127. {
  128. SMG_Disp(1,2);
  129. Delay10ms();
  130. SMG_Disp(2,1);
  131. Delay10ms();
  132. }
  133. SMG_Mie();
  134. }
  135. else if(C2 == 0)
  136. {
  137. while(C2 == 0)
  138. {
  139. SMG_Disp(1,2);
  140. Delay10ms();
  141. SMG_Disp(2,2);
  142. Delay10ms();
  143. }
  144. SMG_Mie();
  145. }
  146. else if(C3 == 0)
  147. {
  148. while(C3 == 0)
  149. {
  150. SMG_Disp(1,2);
  151. Delay10ms();
  152. SMG_Disp(2,3);
  153. Delay10ms();
  154. }
  155. SMG_Mie();
  156. }
  157. else if(C4 == 0)
  158. {
  159. while(C4 == 0)
  160. {
  161. SMG_Disp(1,2);
  162. Delay10ms();
  163. SMG_Disp(2,4);
  164. Delay10ms();
  165. }
  166. SMG_Mie();
  167. }
  168. R3=0; //扫描第三行
  169. R1=R2=R4=1;
  170. C1=C2=C3=C4=1;
  171. if(C1 == 0)
  172. {
  173. while(C1 == 0)
  174. {
  175. SMG_Disp(1,3);
  176. Delay10ms();
  177. SMG_Disp(2,1);
  178. Delay10ms();
  179. }
  180. SMG_Mie();
  181. }
  182. else if(C2 == 0)
  183. {
  184. while(C2 == 0)
  185. {
  186. SMG_Disp(1,3);
  187. Delay10ms();
  188. SMG_Disp(2,2);
  189. Delay10ms();
  190. }
  191. SMG_Mie();
  192. }
  193. else if(C3 == 0)
  194. {
  195. while(C3 == 0)
  196. {
  197. SMG_Disp(1,3);
  198. Delay10ms();
  199. SMG_Disp(2,3);
  200. Delay10ms();
  201. }
  202. SMG_Mie();
  203. }
  204. else if(C4 == 0)
  205. {
  206. while(C4 == 0)
  207. {
  208. SMG_Disp(1,3);
  209. Delay10ms();
  210. SMG_Disp(2,4);
  211. Delay10ms();
  212. }
  213. SMG_Mie();
  214. }
  215. R4=0; //扫描第四行
  216. R1=R2=R3=1;
  217. C1=C2=C3=C4=1;
  218. if(C1 == 0)
  219. {
  220. while(C1 == 0)
  221. {
  222. SMG_Disp(1,4);
  223. Delay10ms();
  224. SMG_Disp(2,1);
  225. Delay10ms();
  226. }
  227. SMG_Mie();
  228. }
  229. else if(C2 == 0)
  230. {
  231. while(C2 == 0)
  232. {
  233. SMG_Disp(1,4);
  234. Delay10ms();
  235. SMG_Disp(2,2);
  236. Delay10ms();
  237. }
  238. SMG_Mie();
  239. }
  240. else if(C3 == 0)
  241. {
  242. while(C3 == 0)
  243. {
  244. SMG_Disp(1,4);
  245. Delay10ms();
  246. SMG_Disp(2,3);
  247. Delay10ms();
  248. }
  249. SMG_Mie();
  250. }
  251. else if(C4 == 0)
  252. {
  253. while(C4 == 0)
  254. {
  255. SMG_Disp(1,4);
  256. Delay10ms();
  257. SMG_Disp(2,4);
  258. Delay10ms();
  259. }
  260. SMG_Mie();
  261. }
  262. }
  263. void main()
  264. {
  265. while(1)
  266. {
  267. ScanKeys();
  268. }
  269. }

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

闽ICP备14008679号