STM32单片机编程零基础实战教程:4位数码管显示模块驱动详解(附源码)

文章目录

  • 一.概要
  • 二.4位数码管主要参数
  • 三.数码管显示器的工作原理
  • 四.74HC595芯片介绍
  • 1.74HC595芯片内部框图
  • 2.74HC595通讯时序
  • 五.4位数码管原理图
  • 六.4位数码管显示实验
  • 七.CubeMX工程源代码下载
  • 八.小结
  • 一.概要

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

    二.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数码管显示器具有亮度高、寿命长、节能环保、可视角度大等优点。‌

    作者:光子物联单片机

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32单片机编程零基础实战教程:4位数码管显示模块驱动详解(附源码)

    发表回复