零基础STM32单片机编程入门(十九) 4位数码管显示模块实战含源码

一.概要

数码管显示器是一类价格便宜、使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。

在这里插入图片描述

二.4位数码管主要参数

1.采用2片595驱动数码管,需要单片机3路IO口,根据数码管动态扫描原理进行显示
2.宽工作电压3.3V到5V
3.PCB板尺寸:0.36英寸:22mm*40mm
4.数码管型号:4位共阳
5.重量:7g

模块接口说明:
1.VCC 电源引脚(3 ~ 5 V)
2.SCLK 移位寄存器时钟
3.RCLK 锁存器时钟
4.DIO 数据输入
5.GND 电源地

三.数码管显示器的工作原理

在这里插入图片描述

‌数码管显示器的工作原理主要通过控制发光二极管(‌LED)的亮灭来显示数字或其他信息。 这些LED通常被组织成特定的段,通过控制这些段的点亮或熄灭,可以组合出不同的数字和字符。以下是详细的工作原理说明:‌

1.基本构造与工作方式: 数码管通常由七个或八个LED组成,这些LED被安排成特定的段,如a, b, c, d, e, f, g(对于七段数码管)以及可能还包括一个小数点或dp段。每个LED都有一个引脚,用于控制其亮灭状态。根据公共端的连接方式,数码管可以分为共阴极和共阳极两种类型。

2.共阴极与共阳极数码管: 共阴极数码管的公共端连接到地(GND),而共阳极数码管的公共端连接到正电源(VCC)。这两种类型的数码管在电路连接和控制方式上有所不同,但基本原理相同,即通过控制每个LED的亮灭来显示数字。

3.显示数字的方式: 通过选择性地点亮对应的LED段,可以组合出0到9的数字以及其他一些字符。例如,要显示数字8,需要点亮对应的a, b, c, d, e, f, g段。对于多位数的显示,可以通过级联连接多个数码管或使用动态扫描技术来实现。

数码管动态显示是根据人眼视觉残留的原理,在显示的时候,位选依次选择数码管,然后段选控制数码管显示。这种依次选择依次显示的速度非常快,快到人眼反应不过来,从而使4位数码管上的数字同时显示(只是人眼看上去同时显示)。

四.74HC595芯片介绍

74HC595是8位串行输入并行输出的移位寄存器。其使用场景通常为在调用大量LED灯时会占用大量IO口,导致引脚不足,这时我们使用这类寄存器可以起到减少引脚使用的目的,同时还可以有效控制LED的亮灭。市面上常见移位寄存器有74HC595。
在这里插入图片描述
74HC595的11脚,(SRCLK) 移位寄存器时钟引脚,上升沿有效。
74HC595的12脚: (RCLK) 存储寄存器时钟引脚,也是上升沿有效。数据从位移寄存器转移到存储寄存器,也是需要时钟脉冲驱动的,这就是12脚的作用。

1.74HC595芯片内部框图

74HC595的数据来源只有一个口,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。

移位寄存器:
串行输入,已进入的位数据依次下移(所以叫移位寄存器)。

存储寄存器:
存储寄存器是直接和8个输出引脚相通的,将移位寄存器的数据转移到存储寄存器后,QA QB QC QD QE QF QG QH 就可以输出我们开始输入的一个字节的数据。

在这里插入图片描述

2.74HC595通讯时序

SRCLK上升沿,移位寄存器中的数据整体后移,并接受新的数据(从SER输入) 高位先行。
RCLK上升沿时,数据从移位寄存器转存带存储寄存器。

在这里插入图片描述

五.4位数码管原理图

在这里插入图片描述

如电路图所示,图中是4位数码管的电路图,具有两片595驱动芯片,两片595级联在一起,第二片595(U2)是对数码管的8段码进行段码操作,第一片595(U1)是对4位数码管进行位选操作,即选择哪一个数码管进行显示操作。

六.4位数码管显示实验

硬件准备:

STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。

用5根杜邦线把模块与开发板相连
板子3.3----模块VCC
板子A4-----模块SCLK
板子A5-----模块RCLK
板子A6-----模块DIO
板子G------模块GND

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加4位数码管驱动相关代码

在这里插入图片描述

主要代码

#define uchar unsigned char
 unsigned char  fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
 unsigned char  segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
 unsigned char  disbuf[4]={0,0,0,0};
void LED4_Display (void);			// LED显示
void LED_OUT(uchar X);				// LED单字节串行移位函数
unsigned char  LED_0F[17] = //低电平显示
{// 0	 1	  2	   3	4	 5	  6	   7	8	 9	  A	   b	C    d	  E    F    -
	0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0x7F,0x7F
};
	unsigned char Counter=0;
	unsigned long TimeCounter=0;

#define SCLK_PIN GPIO_PIN_4
#define RCLK_PIN GPIO_PIN_5
#define DIO_PIN GPIO_PIN_6
uchar LED[8];	//用于LED的8位显示缓存
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//4位数码管主函数
void LED4_Display (void)
{
	unsigned char  *led_table;          // 查表指针
	uchar i;
	//显示第1位
	led_table = LED_0F + LED[0];
	i = *led_table;
	LED_OUT(i);			
	LED_OUT(0x01);		
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);//管脚输出低
  HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);//管脚输出高
	//显示第2位
	led_table = LED_0F + LED[1];
	i = *led_table;
	LED_OUT(i);		
	LED_OUT(0x02);		
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);
  HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);
	//显示第3位
	led_table = LED_0F + LED[2];
	i = *led_table&0X7F;//带小数点
	LED_OUT(i);			
	LED_OUT(0x04);	
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);
  HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);
	//显示第4位
	led_table = LED_0F + LED[3];
	i = *led_table;
	LED_OUT(i);			
	LED_OUT(0x08);		
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_RESET);
	HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOA, RCLK_PIN, GPIO_PIN_SET);
}
//管脚输出控制
void LED_OUT(uchar X)
{
	uchar i;
	for(i=8;i>=1;i--)
	{
		if (X&0x80) 
		{
			HAL_GPIO_WritePin(GPIOA, DIO_PIN, GPIO_PIN_SET);
		}else 
		{
			HAL_GPIO_WritePin(GPIOA, DIO_PIN, GPIO_PIN_RESET);
		}
		X<<=1;
		HAL_GPIO_WritePin(GPIOA, SCLK_PIN, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA, SCLK_PIN, GPIO_PIN_SET);
	}
}
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();//初始化1毫秒 Tick

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//外部8M晶振,系统72M主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	LED[0]=1;//数字偏移量
	LED[1]=2;
	LED[2]=3;
	LED[3]=4;
	LED[4]=5;
	LED[5]=6;
	LED[6]=7;
	LED[7]=8;
  /* USER CODE END 2 */

	while(1) 
	{		
		LED4_Display();//数码管显示

	}	  
  /* USER CODE END 3 */
}

显示效果,显示43.21数字
在这里插入图片描述

七.CubeMX工程源代码下载

链接:https://pan.baidu.com/s/1O_ACUPT5bFYuOquFnAWLtw
提取码:penk
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

在家用电器,DIY电子产品中,LED数码管显示比较常见,LED数码管显示器具有亮度高、寿命长、节能环保、可视角度大等优点。‌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值