资讯详情

51单片机矩阵键盘(16路抢答器)

矩阵键盘在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;    }   }  }  }

标签: sj63二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台