设计与开发

单片机矩阵键盘显示 单片机入门-C51语言实现矩阵键盘按键检测和数码管显示

小编 2024-11-24 设计与开发 23 0

单片机入门-C51语言实现矩阵键盘按键检测和数码管显示

单片机入门-C51语言实现矩阵键盘按键检测和数码管显示视频教程:

视频加载中...

按键是一种常开型按钮开关,平时键的二个触点处于断开状态,按下键时它们才闭合。按键控制电路就是用来实时监视按键,当有键接下时,电路监控中的输入引脚电平发生变化,检测到这种变化后,控制电路进行按键扫描,定位按键的位置,并把相关的按键信息反馈回上一层应用中。

单片机系统在需要按键较多的场合中普遍使用这种行列式非编码键盘,或者叫矩阵键盘。矩阵按键相当于 4 组每组各 4 个独立按键,一共是 16 个按键。在使用这类键盘时主要解决以下几个问题:

①键的识别。有很多种方法,一般采用逐行扫描和逐列扫描的方式,得到行号和列号,根据键号=列号+4*行号,得到键值。

②键的抖动。按键通常有按下、松手、长按这几个状态,需要支持按下检测、松手检测、长按、连击的功能,并且需要对按键进行去抖滤波,这些方法相对复杂,一般采用延时的方法比较简单。

代码如下:

教你玩单片机之矩阵键盘(附程序)

以下所有内容,仅适合新手,大神请绕道。

原理图解析:

组成结构:

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵键盘扫描原理

方法一:

逐行扫描: 我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。

方法二:

行列扫描: 我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。

51单片机矩阵键盘实验程序:

使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3

#include<reg51.h>

#define GPIO_DIG P0

#define GPIO_KEY P1

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4; // 138译码器接入端

unsigned char code DIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char KeyValue;

//用来存放读取到的键值

void Delay10ms(); //延时10ms

void KeyDown(); //检测按键函数

void main(void)

{

LSA=0; //给一个数码管提供位选

LSB=0;

LSC=0;

while(1)

{

KeyDown();

GPIO_DIG=DIG_CODE[KeyValue];

}

}

void KeyDown(void)

{

char a=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)//读取按键是否按下

{

Delay10ms();//延时10ms进行消抖

if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

{

//测试列

GPIO_KEY=0X0F;

switch(GPIO_KEY)

{

case(0X07):KeyValue=0;break;

case(0X0b):KeyValue=1;break;

case(0X0d): KeyValue=2;break;

case(0X0e):KeyValue=3;break;

}

//测试行

GPIO_KEY=0XF0;

switch(GPIO_KEY)

{

case(0X70):KeyValue=KeyValue;break;

case(0Xb0):KeyValue=KeyValue+4;break;

case(0Xd0): KeyValue=KeyValue+8;break;

case(0Xe0):KeyValue=KeyValue+12;break;

}

while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测

{

Delay10ms();

a++;

}

}

}

}

void Delay10ms(void) //误差 0us

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

相关问答

51 单片机矩阵键盘 如何实现两个键同时按下的时候 显示 其他数字,用c语言程序实现?

定义一个按键缓冲区用普通的按键扫描程序,当扫描到有按键按下的时候。按键键的值写入缓冲区。继续扫描直到完成。然后返回缓冲区地址就可以得到多个按键的数...

用汇编语言写 单片机矩阵键盘 的程序,有什么需要注意的?

汇编语言是直接操作单片机的寄存器的,非得要说需要注意的是你用过的寄存器,一定记得。哪些用过,哪些没用,哪些寄存器用后可以再用,哪些用后数据需要保存。这...

单片机 按键排列成 矩阵 形式的主要目的是?

按键排列成矩阵形式的主要目的是提高输入输出的效率和可靠性。矩阵按键可以让多个按键共享同一个引脚,从而减少单片机的引脚数量,降低成本。此外,矩阵按键还可...

单片机键盘显示 电路设计的程序要求输入64个按键,8个LED显示?

用8*8的矩阵键盘组成64个按键,只需要16个IO口,8个LED需要8个IO口,所以选用STC89C51的单片机就够用了。用8*8的矩阵键盘组成64个按键,只需要16个IO口,8个LED需...

单片机 的独立 键盘 有什么用?

很多的嵌入式或者单片机系统中,一般都需要向嵌入式或者单片机系统输入信息的外设,以及嵌入式或者单片机向外输出信息的外设我们常见的显示屏,数码管等就是嵌...

设计用2×2 矩阵键盘 ,一位数码管和8051 单片机 的接口电路?

2×2矩阵键盘,共四个键,需要四条I/O线。如果用独立按键,也是四条I/O线。所以,在按键较少时,是没有必要用矩阵键盘的。2×2矩阵键盘,共四个键,需要四条I/O线。...

线反转法识别4*4 矩阵键盘 的功能 - 业百科

线反转法识别4*4矩阵键盘的功能,线反转法识别4*4矩阵键盘的功能是通过给行输出低电平,列置上拉输入,当有按键按下时,列的电位被拉低,此时通过读取列的输入引脚的...

单片机矩阵 灯不亮?

首先检查硬件,驱动方式有没有问题,电流够不够大,延时合不合理?如果硬件不确定的的话,试一试用软件仿真,你是直接驱动IO口,功能还是很简单的,keil的软件...首...

4×4 矩阵式 按钮 单片机 实习报告-ZOL问答

4*4矩阵键盘扫描程序如下:ucharkbscan(void){unsignedcharsccode,recode;P1=0x0f;//发0扫描,列线输入if((P2&0x...

51 单片机 数码管动态 显示 从右往左?

这是四位数码管从右从左流动显示,像滚动字幕一样的。用不着矩阵按键哪。其实程序很简单,没那么复杂。程序如下#include这是四位数码管从右从左流动显示,像滚...

猜你喜欢