STM32开发(七)STM32F103 显示 —— 数码管显示 详解


一、基础知识点

了解 TM1620芯片手册 。本实验是基于STM32F103开发 通过GPIO模拟时序 实现TM1620数码管显示。

准备好了吗?开始我的show time。


二、开发环境

1、硬件开发准备
主控:STM32F103ZET6
控制数码管芯片:TM1620
在这里插入图片描述
2、软件开发准备
软件开发使用虚拟机 + VScode + STM32Cube 开发STM32,在虚拟机中直接完成编译下载。
该部分可参考:软件开发环境构建


三、STM32CubeMX相关配置

1、STM32CubeMX基本配置
本实验基于CubeMX详解构建基本框架 进行开发。

2、TM1620控制器信号脚配置(GPIO配置)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


四、Vscode代码讲解

1、数码管相关结构体定义与初始化

//定义结构体类型
typedef struct
{
    
    
    Brightness_Mode_t  Brightness;
    
    void (*TM1620_Init)(void);                              //TM1620初始化
    void (*Disp)(Disp_NUM_t,uint8_t,Disp_DP_Status_t);      //数码管显示特定数组内容
    void (*Disp_Other)(Disp_NUM_t,uint8_t,Disp_DP_Status_t);// 数码管自定义内容显示
} Display_t;

Display_t Display ={
    
    
  Brightness_Mode_Level3,    // 显示亮度等级

  TM1620_Init,               // 初始化,下面有具体实现        
  Disp,                      // 数码管根据特定数组内容显示,下面有具体实现
  Disp_Other  				// 数码管自定义内容显示,下面有具体实现
};

2、使用宏定义表示每个引脚的高低电平

#define TM1620_STB_SET   HAL_GPIO_WritePin(GPIOC, TM1620_STB_Pin, GPIO_PIN_SET);
#define TM1620_STB_RESET HAL_GPIO_WritePin(GPIOC, TM1620_STB_Pin, GPIO_PIN_RESET);

#define TM1620_CLK_SET   HAL_GPIO_WritePin(GPIOC, TM1620_CLK_Pin, GPIO_PIN_SET);
#define TM1620_CLK_RESET HAL_GPIO_WritePin(GPIOC, TM1620_CLK_Pin, GPIO_PIN_RESET);

#define TM1620_DIN_SET   HAL_GPIO_WritePin(GPIOC, TM1620_DIN_Pin, GPIO_PIN_SET);
#define TM1620_DIN_RESET HAL_GPIO_WritePin(GPIOC, TM1620_DIN_Pin, GPIO_PIN_RESET);

3、根据芯片写时序,使用GPIO模拟

//TM1620写一个数据
static void TM1620_write_date(uint8_t date)
{
    
    
  uint8_t i = 0;

  TM1620_STB_RESET;                // 使能脚拉低

  for(i=0; i<8; i++){
    
                  // 循环发送数据位
    TM1620_CLK_RESET;                // 时钟拉低

    if((date & 0x01) == 0x01){
    
          // 取出最低位
      TM1620_DIN_SET;
    }              // 数据位拉高  
    else
      TM1620_DIN_RESET;            // 数据位拉低 

    date = date>>1;                // 移位,准备下一个发送的数据
    TM1620_CLK_SET;                // 时钟拉高,发送数据
  }
}

4、初始化数码管默认状态
初始化过程中设置数据命令是Disp_Addr_Mode_Auto,使用的是地址自增模式。时序根据芯片手册,实现数码管连续显示。

//TM1620初始化 地址增加模式   
static void TM1620_Init(void)      
{
    
    
  TM1620_write_date(Disp_Mode_GRID6_SGE8);            // 设置显示模式
  TM1620_STB_SET;

  TM1620_write_date(Disp_Addr_Mode_Auto);            // 设置数据命令
  TM1620_STB_SET;

  TM1620_write_date(Disp_Register_00H);            // 设置显示地址

  for(int i=0; i<Disp_Register_NUM; i++){
    
    
    TM1620_write_date(0x00);                        // Date
  }
  TM1620_STB_SET;

  TM1620_write_date(Display.Brightness);            // 设置控制命令
  TM1620_STB_SET;
}  

5、制作固定地址显示数码管接口

uint8_t Date[16]    = {
    
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};  //数码管译码 0 - 9

static void Disp(Disp_NUM_t disp_num, uint8_t disp_value, Disp_DP_Status_t dp_status)  
{
    
    
  //参数范围检查
  if(disp_value > 0x0F)
  {
    
    
    System.Assert_Failed();
  }

  TM1620_write_date(Disp_Mode_GRID6_SGE8);            // 设置显示模式
  TM1620_STB_SET;

  TM1620_write_date(Disp_Addr_Mode_Fix);            // 设置数据命令
  TM1620_STB_SET;

  TM1620_write_date(disp_num);                       // 设置显示地址
  if(dp_status == Disp_DP_ON)
    TM1620_write_date(Date[disp_value]+0x80);
  else
    TM1620_write_date(Date[disp_value]);                     // Date
  TM1620_STB_SET;

  TM1620_write_date(Display.Brightness);            // 设置控制命令
  TM1620_STB_SET;
}

6、数码管显示自定义内容

static void Disp_Other(Disp_NUM_t Disp_NUM,uint8_t Dat,Disp_DP_Status_t Disp_DP_Status) 
{
    
    
	//设置显示模式
	TM1620_write_date(Disp_Mode_GRID6_SGE8); 
	TM1620_STB_SET;
	
	//地址固定
	TM1620_write_date(Disp_Addr_Mode_Fix); 
	TM1620_STB_SET;
	
	//写地址
	TM1620_write_date(Disp_NUM);
	//写数据
	if(Disp_DP_Status == Disp_DP_ON)
		TM1620_write_date(Dat + 0x80);
	else
		TM1620_write_date(Dat);
	TM1620_STB_SET;
	
	//显示
  TM1620_write_date(Display.Brightness);
	TM1620_STB_SET; 
}


五、结果演示

通过调用 Display.Disp 接口控制数码管显示。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43564241/article/details/129410421