51单片机:数码管和矩阵按键

目录

一:动态数码管模块

1:介绍

2:共阴极和共阳极

A:共阴极

B:共阳极

C:转化表

3:74HC138译码器

4:74HC138译码器控制动态数码管

5:数码管显示完整代码

二:矩阵按键模块

1:介绍

2:原理图

3:矩阵按键代码


一:动态数码管模块

1:介绍

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成"8"字型的器件;

我们的51单片机的1个数码管就相当于由8个发光二极管封装在一起, 所以我们只需要控制8个发光二极管封就可以实现数码管的显示,这款单片机是共阴极连接

数码管扫描(输出扫描) 原理:显示第1位→显示第2位→显示第3位→......,然后快速循环这个过程,最终实现所有数码管同时显示的效果,节省I/O口

2:共阴极和共阳极

我们这款单片机是共阴极所以我们主要介绍共阳极连接

A:共阴极

1.LED共阴极是指LED灯中的二极管的阴极有一个共同的接点,并且该接点连接在GND端,即处于低电平状态。 我们只需要给它一个高电频(1)就可以点亮他

从高位到低位读取

eg:让第一个数码管显示0

数码管段码表对应的0,1,2,3,4,5,6,7,8,9

cpp 复制代码
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

B:共阳极

LED共阳极是指LED灯中的二极管的阳极有一个共同的接点,并且该接点连接在VCC端,即处于高电平状态。 我们只需要给它一个低电频(0)就可以点亮他

数码管段码表对应的0,1,2,3,4,5,6,7,8,9

cpp 复制代码
unsigned char LED7Code[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,
						0xf8, 0x80, 0x90};

C:转化表

3:74HC138译码器

概述 D74HC138D 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品

3个io口控制8位,因为单片机上面的资源有限

通过A0~A2数据的输入来控制Y0~Y7数据的输出;实现 3个io口控制8位,

4:74HC138译码器控制动态数码管

eg:点亮LED8

EDL1对应的是Y7的输出端口,所以只需要控制A,B,C输出Y7即可

从高位到低位读和写; ( 只需要将二进制转化位10进制的7即可**)**

cpp 复制代码
P2_4=1;P2_3=1;P2_2=1;//二进制111转化十机制为:7,输出Y7;当用户选择1时点亮LED8

5:数码管显示完整代码

cpp 复制代码
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时函数的声明
void Delay(unsigned int xms);
/**
  * @brief  数码管的选择和读取
  * @param  Location:选择那一个数码管; Number:选择显示那个数字(0~9)
  * @retval 无
  */
void Nixie(unsigned char Location,Number)
{
    switch (Location)  
    {
        case 1:P2_4=1;P2_3=1;P2_2=1;break;//二进制111转化十机制为:7,当用户选择1时点亮LED8
        case 2:P2_4=1;P2_3=1;P2_2=0;break;//二进制110转化十机制为:6,当用户选择2时点亮LED7
        case 3:P2_4=1;P2_3=0;P2_2=1;break;//二进制101转化十机制为:5,当用户选择3时点亮LED6
        case 4:P2_4=1;P2_3=0;P2_2=0;break;//二进制100转化十机制为:4,当用户选择4时点亮LED5
        case 5:P2_4=0;P2_3=1;P2_2=1;break;//二进制11(高位补零)转化十机制为:3,当用户选择5时点亮LED4
        case 6:P2_4=0;P2_3=1;P2_2=0;break;//二进制10(高位补零)转化十机制为:2,当用户选择6时点亮LED3
        case 7:P2_4=0;P2_3=0;P2_2=1;break;//二进制1(高位补零)转化十机制为:1,当用户选择7时点亮LED2
        case 8:P2_4=0;P2_3=0;P2_2=0;break;//二进制0(高位补零)转化十机制为:0,当用户选择3时点亮LED1 
    }  
    P0=NixieTable[Number];	//段码输出
    Delay(1);				//显示一段时间
	P0=0x00;				//段码清0,消影  
}


void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
void main()
{
	while(1)
	{
		Nixie(1,1);		//在数码管的第1位置显示1
		Delay(20);
		Nixie(2,2);		//在数码管的第2位置显示2
		Delay(20);
		Nixie(3,3);		//在数码管的第3位置显示3
		Delay(20);
	}
}

二:矩阵按键模块

1:介绍

矩阵键盘扫描(输入扫描) 原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ......,然后快速循环这个过程,最终实现所有按键同时检测的效果,节省I/O口

2:原理图

**按下为0;**我们使用列扫描,

eg:按下1,5,9,13

1:使他P1端口全部为1

2:1,5,9,13为一列,他们的共同端口为P1^3,显示共同端口为P1^3为0;

3:依次使P1_7, P1_6, P1_5, P1_4为0,

3:矩阵按键代码

cpp 复制代码
#include <REGX52.H>


//声明
void Delay(unsigned int xms)
/**
  * @brief  矩阵键盘读取按键键码
  * @param  无
  * @retval KeyNumber 按下按键的键码值
			如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
  */
unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
	
	return KeyNumber;
}
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
相关推荐
Bobolink_14 天前
TikTok矩阵账号如何批量养号?工作室级运营方案分享
矩阵·内容运营·跨境电商·tik tok·账号运营
u1521096484914 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd84510150014 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼14 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
wohoo_wangzi14 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
科芯创展14 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司14 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
AI_yangxi14 天前
短视频矩阵系统专业公司
大数据·人工智能·矩阵
踏着七彩祥云的小丑14 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习
望眼欲穿的程序猿14 天前
读取芯片内部温度传感器
嵌入式硬件·rust