矩阵键盘在51单片机中不可或缺。当键盘中有大量按钮时,为了减少I/O口腔占用通常将按钮排列成矩阵。在矩阵键盘中,每条水平线和垂直线在交叉处不直接连接,而是通过按钮连接。这样,一个端口(如P一口)可以构成4*4=16个按钮是直接使用端口线的两倍,线数越多,差异越明显。例如,添加一条线可以构成一个20键键的键盘,而直接使用端口线只能增加一个键(9键)。由此可见,当所需键数较多时,采用矩阵法制作键盘是合理的。
例如PCB打板实物图:(如果你想知道如何免费打10*10及以下PCB板在评论下回复,小编会写一篇关于如何打板的文章)
接下来我会用矩阵键盘做抢答器:
满足以下设计要求:
(1) 同时为 16 支队提供抢答功能,抢答成功后应通过数字管显示参队
同时点亮发光二极管,表示抢答成功。
(2) 添加独立开关可启动 10 倒计时功能通过数字管显示(倒计时)
抢答功能在计时状态下不起作用,反之亦然)。
在知识竞赛、体育娱乐活动(应答活动)中,可以准确、公正、直观地判断应答者的座位号码。更好地提高各团体的竞争意识,让玩家体验战场压力。
仿真图。
a.能够识别 4*4 按键值并通过数字管显示。
b.同时为 16 支队提供抢答功能,抢答成功后应通过数字管显示参队
同时点亮发光二极管,表示抢答成功。
c添加独立开关,可启动 10 倒计时功能通过数字管显示(倒计时)
抢答功能在计时状态下不起作用,反之亦然)。
读者对自取代码感兴趣:
#include <reg51.h> unsigned char sz[]= {0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f}; unsigned char sj=0,t=0;a=10; time0() interrupt 1 using 0 { TH0=0X3C;TL0=0XB0; t ; } void delay() { unsigned int i ; for (i = 0 ; i < 256 ; i ); } void djs() { TMOD=0X01;TH0=0X3C;TL0=0XB0;EA=1;ET0=1;TR0=1; while(a) { P1=0x7F; if(t==20) { if(sj==10) {sj = 0;} P0 = sz[sj];sj ;a--; t=0; } } } void main() { djs(); P1 = 0x00;// 初始化P0端口,数码管熄灭 while (1) { P2 = 0x7f; // 扫描最右列的按钮,使公共端为0 if (P2 != 0x7f)// 当P2值不同于扫描索引值,表示按下按钮 { switch (P2)// 判断按下哪个键 { case 0x7e: P0 =0x4f;while(1); break; case 0x7d: P0 =0x07;while(1);break; case 0x7b: P0 =0x7c;while(1); break; case 0x77: P0 =0x71;while(1); break; } } P2 = 0xbf; // 从右到左扫描第二列按钮,令公共端为0 if (P2 != 0xbf)// 当P2值不同于扫描索引值,表示按下按钮 { switch (P2)// 判断按下哪个键 { case 0xbe: P0 =0x5b;while(1); break; case 0xbd: P0 =0x7d;while(1); break; case 0xbb: P0 =0x77;while(1); break; case 0xb7: P0 =0x79;while(1); break; } } P2 = 0xdf; // 从右到左扫描第三列按钮,令公共端为0 if (P2 != 0xbf)// 当P2值不同于扫描索引值,表示按下按钮 { switch (P2)// 判断按下哪个键 { case 0xde: P0 = 0x06;while(1); break; case 0xdd: P0 = 0x6d;while(1); break; case 0xdb: P0 = 0x6f;while(1); break; case 0xd7: P0 = 0x5e;while(1); break; } } P2 = 0xef; // 扫描最右列的按钮,令公共端为0 if (P2 != 0xef)// 当P2值不同于扫描索引值,表示按下按钮 { switch (P2)// 判断按下哪个键 { case 0xee: P0 = 0x3f;while(1); break; case 0xed: P0 = 0x66;while(1);break; case 0xeb: P0 = 0x7f;while(1); break; case 0xe7: P0 = 0x39;while(1); break; } } } }