【51单片机】矩阵按键实现数码管显示

这篇具有很好参考价值的文章主要介绍了【51单片机】矩阵按键实现数码管显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

闲的没事看一看玩一玩·········

矩阵按键

数码管

数码管是一种导体发光器件,其基本单元是发光二极管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管

共阴极数码管

共阴极数码管是指将所有发光二极管的阴极接到一起形成共阴极的数码管,共阴极的数码管在应用时将公共级的COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应的字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

但是,IC芯片驱动能力往往是较小的,如果采用共阴极接法,因为它的驱动在非公共端,就有可能受限于IC芯片输出电流不够而显示昏暗,要外加上拉电阻或者是增加三极管加大驱动能力。

共阳极数码管

共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极 (COM) 的数码管,共阳极数码管在应用时应将公共极COM接到 +5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮

与共阴极相反,一般共阳极数码管更为常用,因为将驱动数码管的工作交到公共端(一般接驱动电源),加大驱动电源的功率自然要比加大IC芯片I/O口的驱动电流简单许多。另一方面,这样也能减轻主芯片的负担。

共阴极数码管表

【51单片机】矩阵按键实现数码管显示

我的开发板上使用的数码管是24位一体的共阴极数码管(即8LED的阳极全部并联在一起引出,阴极分别引出A、B…DP),如果要让共阴极数码管显示数字0,即对应的段ABCDEF要给它高电平,其他的段给低电平。下面是共阴极数码管的 0 - F 段码数据表示。

0x3f 0x06 0x5b 0x4f 0x66 0x6d
0 1 2 3 4 5
0x7d 0x07 0x7f 0x6f 0x77 0x7c
6 7 8 9 A B
0x39 0x5e 0x79 0x71 0x00
C D E F 无显示

数码管硬件设计

开发板上的晶体数码管模块电路图如下:
【51单片机】矩阵按键实现数码管显示

【51单片机】矩阵按键实现数码管显示
上面的数码管电路使用的是两个四位一体的共阴数码管组成,假设我们控制SMG1最左边的那个数码管默认显示0,因为单片机的IO口外部都增加了外部上拉电阻,因此P22P23P24引脚默认就是高电平,根据38译码器输出特点,此时Y7脚(LED8)输出有效,即低电平。而数码管的段选a-dp连接在了74HC245驱动芯片输出口,由P0端口控制。所以只要控制P0口输出高电平,SMG1最左边的那个数码管默认就可以显示。(如果有兴趣的话可以去了解一下38译码器的工作原理)。
74HC245作为驱动芯片使用,目的是让数码管能获得更大的电流,为防止因电流过大烧坏数码管,在74HC245芯片输出管脚又串联了24位的100欧排阻后连接数码管段码a-dp脚。

数码管显示软件设计

#include "reg52.h"
typedef unsigned int u16;//对系统默认数据进行重定义
typedef unsigned char u8;
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口

//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//延时函数
void delay_10us(u16 ten_us)
{
	while(ten_us--);
}

//功能函数
void smg_display(void)
{
	u8 i=0;
	for(i=0;i<8;i++)
	{
		switch(i)//λѡ
		{
			case 0: LSC=1;LSB=1;LSA=1;break;
			case 1: LSC=1;LSB=1;LSA=0;break;
			case 2: LSC=1;LSB=0;LSA=1;break;
			case 3: LSC=1;LSB=0;LSA=0;break;
			case 4: LSC=0;LSB=1;LSA=1;break;
			case 5: LSC=0;LSB=1;LSA=0;break;
			case 6: LSC=0;LSB=0;LSA=1;break;
			case 7: LSC=0;LSB=0;LSA=0;break;
		}
	SMG_A_DP_PORT=gsmg_code[i];//传送段选数据
	delay_10us(100000);
	SMG_A_DP_PORT=0x00;
	}
}

void main()
{
	while(1)
	{
		smg_display();
	}
}

矩阵按键

按键介绍

按键是一种电子开关,使用时按下开关按钮就可以使开关接通,当松手时,开关断开。
【51单片机】矩阵按键实现数码管显示
按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态,如果按键按下,初始导通状态变为断开,初始断开状态变为导通。

按键消抖

由于机械弹性的作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的一瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms10ms。按键稳定闭合时间的长短则由操作人员的按键动作决定的,一般为零点几秒到数秒。按键抖动会引起按键被误读多次。为确保CPU对按键的一次闭合仅做一次处理,必须进行消抖。
【51单片机】矩阵按键实现数码管显示
消抖一般分为硬件消抖软件消抖两种方式。
我们一般采用的是软件消抖,简单来说就是先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下了,其中延时10ms就是软件消抖处理。

矩阵按键硬件设计

我的开发板上的是44的矩阵按键,模块电路图如下
【51单片机】矩阵按键实现数码管显示
从图中可以看出,4
4 矩阵按键引出的8根控制线直接连接到51单片机的P1口上。电路中的P17连接矩阵键盘的第一行,P13连接矩阵键盘的第一列。

矩阵按键实现数码管显示软件设计

#include"reg52.h"

typedef unsigned int u16;//对系统默认数据进行重定义
typedef unsigned char u8;

#define KEY_MATRIX_PORT P1//使用宏定义矩阵按键控制口

#define SMG_A_DP_PORT P0//使用宏定义数码管段码口

//共阴极数码管显示0~F的段码数据

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//延时函数
void delay_10us(u16 ten_us)
{
	while(ten_us--);
}

u8 key_matrix_ranks_scan(void)
{
	u8 key_value=0;
	
	KEY_MATRIX_PORT=0xf7;//给第一列赋值为0,其余全为1
	if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下
	{
		delay_10us(1000);//消抖
		switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值
		{
			case 0x77: key_value=1;break;
			case 0xb7: key_value=5;break;
			case 0xd7: key_value=9;break;
			case 0xe7: key_value=13;break;
		}
	}
	while(KEY_MATRIX_PORT!=0xf7);//等待按键松开
	
	KEY_MATRIX_PORT=0xfb;//给第二列赋值为0,其余全为1
	if(KEY_MATRIX_PORT!=0xfb)//判断第二列按键是否按下
	{
		delay_10us(1000);//消抖
		switch(KEY_MATRIX_PORT)//保存第二列按键按下后的键值
		{
			case 0x7b: key_value=2;break;
			case 0xbb: key_value=6;break;
			case 0xdb: key_value=10;break;
			case 0xeb: key_value=14;break;
		}
	}
	while(KEY_MATRIX_PORT!=0xfb);//等待按键松开
	
	KEY_MATRIX_PORT=0xfd;//第三列赋值为0,其余全为1
	if(KEY_MATRIX_PORT!=0xfd)//判断第三列按键是否按下
	{
		delay_10us(1000);//消抖
		switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值
		{
			case 0x7d: key_value=3;break;
			case 0xbd: key_value=7;break;
			case 0xdd: key_value=11;break;
			case 0xed: key_value=15;break;
		}
	}
	while(KEY_MATRIX_PORT!=0xfd);//等待按键松开
	
	KEY_MATRIX_PORT=0xfe;//第四列赋值为0,其余全为1
	if(KEY_MATRIX_PORT!=0xfe)//判断第四列按键是否按下
	{
		delay_10us(1000);//消抖
		switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值
		{
			case 0x7e: key_value=4;break;
			case 0xbe: key_value=8;break;
			case 0xde: key_value=12;break;
			case 0xee: key_value=16;break;
		}
	}
	while(KEY_MATRIX_PORT!=0xfe);//等待按键松开
	
	return key_value;
}
	
void main()
{
	u8 key=0;
	
	while(1)
	{
		key=key_matrix_ranks_scan();
		if(key!=0)
		{
			SMG_A_DP_PORT=gsmg_code[key-1];//得到的按键值减1换算成数组下标对应0~F段码
		}
	}
}

总结

实验的核心就是通过行列扫描,然后判断每一列中的按键按下的情况,并返回对应的键值。复习了硬件的知识,玩一玩还阔以~文章来源地址https://www.toymoban.com/news/detail-431178.html

到了这里,关于【51单片机】矩阵按键实现数码管显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机实现矩阵键盘密码锁,数码管显示

    板子是普中的,按键按下10为0,按键11为确认,按键12为取消。 输入密码正确时LED D8闪烁(正确密码为5555) #include REGX52.H//头文件定义 unsigned char nixie[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示的段码 unsigned int Code = 0;//用于保存密码的变量 void Tim_int(void);//定时器初

    2024年02月02日
    浏览(51)
  • 51单片机按键控制数码管显示0-9

    实验题目:使用51单片机设计两个按键控制数码管显示0-9,当K1按下减1,当K2按下加1. 理解程序可参考我的另外两个文章; 51单片机数码管显示0-9_学习笔记吧的博客-CSDN博客 51单片机独立按键控制合集_学习笔记吧的博客-CSDN博客 两个文章一结合就是一个新的产物,所以51单片机

    2024年02月11日
    浏览(52)
  • 51单片机——秒表(定时器扫描独立按键和数码管)

            这次实验主要是用定时器来定时扫描独立按键和数码管,代替两个模块函数中的延时函数。用定时器定时扫描的好处就是,主函数中的延时并不会影响按键的检测和数码管的扫描,只会影响响应速度。因为定时器是溢出就会执行中断程序,是定时的扫描。 改进的

    2024年02月10日
    浏览(64)
  • 51单片机“独立按键”控制静态数码管———显示数字0-9

    (1).独立按键模块电路图可以清楚的看到,所有从引脚JP1出来的电流都会接到GND,且当所有按键按下时被执行链接GND。所以,当JP1引脚各端口----识别----到“电流为低电平为0时”,说明按键被按下,否则为高电平按键没有被按下。 ( 2).按键的原理其是需要我们单片机有检

    2024年02月11日
    浏览(49)
  • 【51单片机】EEPROM-IIC实验(按键控制数码管)

    目录   🎁I2C总线 ​编辑 🎁代码 🏳️‍🌈main.c 🏳️‍🌈i2.c 🎆代码分析   I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有两根双向的信号线,一根 数据线SDA 用于收发数据,一根 时钟线SCL 用于通信

    2024年02月11日
    浏览(52)
  • 51单片机实验三:数码管显示时钟 按键调节时间时闪烁提示

    功能效果:1.时分秒的动态显示。2.用三个按键实现时分秒的修改,调节的数字闪烁提示。  

    2024年02月11日
    浏览(42)
  • 51单片机矩阵键盘——数码管显示

    当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了。 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0;按下矩阵键盘S2并松开,数码管第一位显示1;...按下矩阵键盘S16并松开,数码管第一位显示F; 矩阵键盘扫描(输入扫描)     原理:

    2024年02月11日
    浏览(55)
  • 【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯

    实验内容: 利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输入电平。         1.选中 8 位数码管的其中 1 位数码管,当独立按键 1 每按下一次,数码管加一(按下期间加 1),范围为 0—F;         2.选中 8 位数码管的另 1 位数码管,当独立按键 2

    2024年02月06日
    浏览(46)
  • 单片机学习-使用矩阵按键来显示数码管0-F

    1、行列扫码 //数码管字摸 u8 gsmg_code[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};      //共阴 显示0-F 2、线翻转扫描

    2024年02月04日
    浏览(73)
  • C51单片机的电子时钟(数码管显示+独立按键模块修改及暂停时间)

    IMG_1120 通过查看这三个原理图我们可以得知控制K1、K2、K3及K4是通过P31、P30、P32及P33来实现的,控制8个数码管是P22、P23及P24来实现, 控制发光二极管则由P00-P07来实现。 代码分为三部分分别为main.c、key.h、key.c scankey()函数的主要代码,通过软件入手提高系统的可靠性,防止外

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包