找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3428|回复: 0
打印 上一主题 下一主题
收起左侧

单片机矩阵键盘检测实验

[复制链接]
跳转到指定楼层
楼主
实验目的:
学会矩阵键盘的检测,掌握数码管静态显示原理。
实验现象:
依次按下 4*4 矩阵键盘上从第 1 到第 20 个键,同时在六位数码管上依次显示 0、1、2、3、 4、5、6、7、8、9、A、B、C、D、E、F
实验说明:
本开发板上数码管为共阴极。静态数码管显示原理(视频中有详细介绍):这里就共阴极数码管显示原理进行讲解,一位数码管内一共有 8 个发光二极管,对共阴极来说其 8 个发光二极管的阴极在数码管内部全部接在一起,也就是“共阴”说法的来源,阳极是独立的,设计电路时一般把阴极接地,当我们从外部给任一个阳极加一个高电平时这个发光二极管就亮了,如果想要出一个 8 字,并且把右下角的小数点也点亮的话,那可以给 8 个阳极全送高电平,想让数码管显示几就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给 0-9 十个数字编好码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。另外说一下,一般的数码管每一段亮至少需要 10 个毫安的电流,而单片机的 IO 口送不出如此大的电流,所以我们需要加数码管的驱动电路,可以用上拉电阻的方法,也可以使用专门的驱动芯片,本开发板使用的 74HC573,其输出电流较大,足够点亮数码管。本开发板上的六位数码管中每个相同段号(段指 a,b,c,d,e,f,g,h)全部是接在一起的,其中每一个位(阴极)是独立的,所以在做静态显示的时候所有的数码管只能显示相同的数字,当然可以控制哪几位显示,如果让它们显示不同的数字那就得给每一个数码管加一套驱动电路了。但这样做是没有必要的,后面我们会讲到关于数码管动态显示原理。
下面给出本开发板共阴极数码管数字编码

矩阵键盘的四行分别与 P3.0-P3.3 连接,四列分别与 P3.4-P3.7 连接。

硬件电路:

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

全部资料51hei下载地址:
代码.pdf (271.02 KB, 下载次数: 8)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表