STM32CubeMX TM1637驱动数码管

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: STM32CubeMX TM1637驱动数码管

一、TM1637简介    


      TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。主要应用于电磁炉、 微波炉及小家电产品的显示屏驱动。采用DIP/SOP20的封装形式。


 采用功率CMOS 工艺

 显示模式(8 段×6 位),支持共阳数码管输出

 键扫描(8×2bit),增强型抗干扰按键识别电路

 辉度调节电路(占空比 8 级可调)

 两线串行接口(CLK,DIO)

 振荡方式:内置RC 振荡(450KHz+5%)

 内置上电复位电路

 内置自动消隐电路

 封装形式:DIP20/SOP20


      微处理器的数据通过两线总线接口和 TM1637 通信,在输入数据时当 CLK 是高电平时,DIO 上的信号 必须保持不变;只有 CLK 上的时钟信号为低电平时,DIO 上的信号才能改变。数据输入的开始条件是 CLK 为高电平时,DIO 由高变低;结束条件是 CLK 为高时,DIO 由低电平变为高电平。


    TM1637 的数据传输带有应答信号 ACK,当传输数据正确时,会在第八个时钟的下降沿,芯片内部会 产生一个应答信号 ACK 将 DIO 管脚拉低,在第九个时钟结束之后释放 DIO 口线。



二、CubeMX配置


时钟配置



定时器4配置,产生us延时



引脚配置这里配置PB0为TM1637_CLK,PB1为TM1637_SDA



生成代码



三、程序代码


tm1637.h


 
#ifndef __TM1637_H
#define __TM1637_H
 
#include "main.h"
 
#define TM1637_CLK_H()  HAL_GPIO_WritePin(GPIOB,TM1637_CLK_Pin,GPIO_PIN_SET)
#define TM1637_CLK_L()  HAL_GPIO_WritePin(GPIOB,TM1637_CLK_Pin,GPIO_PIN_RESET)
#define TM1637_SDA_H()  HAL_GPIO_WritePin(GPIOB,TM1637_SDA_Pin,GPIO_PIN_SET)
#define TM1637_SDA_L()  HAL_GPIO_WritePin(GPIOB,TM1637_SDA_Pin,GPIO_PIN_RESET)
 
 
 
void TM1637_START(void);
void TM1637_STOP(void);                 //结束条件
 
void TM1637_WRITE_BYTE_DATA(unsigned char mydata);
void TM1637_CHECK_ack(void);
 
void TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(unsigned char addr, unsigned char my_data);
 
#endif
 


tm1637.c

#include "tm1637.h"
extern TIM_HandleTypeDef htim4;
 
const unsigned char SEGMENT_CODE[]=  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
 
 
unsigned int delay_time=1;//us延时设为 1 数码管不会抖动
 
 void delay_us(uint16_t us)
{     //微秒延时
  uint16_t differ = 0xffff-us-5;        
  __HAL_TIM_SET_COUNTER(&htim4,differ); //设定TIM1计数器起始值
  HAL_TIM_Base_Start(&htim4);   //启动定时器 
  
  while(differ < 0xffff-5){ //判断
    differ = __HAL_TIM_GET_COUNTER(&htim4);   //查询计数器的计数值
  }
  HAL_TIM_Base_Stop(&htim4);
}
 
 
 
void TM1637_START()                   //开始条件
{
  
        TM1637_CLK_H();
        delay_us(delay_time);
    
        TM1637_SDA_H();
        delay_us(delay_time);
    
        TM1637_SDA_L();
        delay_us(delay_time);
    
        TM1637_CLK_L();
        delay_us(delay_time);
            
}
 
 
void TM1637_STOP()                     //结束条件
{
        
        TM1637_CLK_L();
        delay_us(delay_time);
    
        TM1637_SDA_L();
        delay_us(delay_time);
    
        TM1637_CLK_H();
        delay_us(delay_time);
    
        TM1637_SDA_H();
        delay_us(delay_time);
    
}
 
 
void TM1637_WRITE_BYTE_DATA(unsigned char mydata)          //送数据    低位先传
{
 
 
        unsigned char  i;
 
        for(i=0;i<8;i++)
        {
            TM1637_CLK_L();
            delay_us(delay_time);        
            
            if(mydata&0x01)
            {
               TM1637_SDA_H();
            }
            else
            {
               TM1637_SDA_L();
            }
            
            delay_us(delay_time);
        
            TM1637_CLK_H();
            delay_us(delay_time);
        
            mydata>>=1;
            delay_us(delay_time);
        
        }
 
        TM1637_CLK_L();
        delay_us(delay_time);
 
 
 
}
 
 
 
 
void TM1637_CHECK_ack()
{
    
        // 检查应答位,
        
     
        TM1637_CLK_L();
    
        delay_us(delay_time);
 
        //DIN 在第9个脉冲被拉低,要检查的
        while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1)    
        {
            
        }
     
     
        TM1637_CLK_H();
        delay_us(delay_time);
     
        TM1637_CLK_L();
        delay_us(delay_time);
 
 
}
 
 
 
/*
     
     采用固定地址模式=============
 
     TM1637---支持6位8段数码管========================================
     
     如果有4个数码管,此程序被反复执行4次
     addr===     0~5,TM1637支持6个数码管
     my_data==== 第0个数码管的数据
 
 
*/
void TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(unsigned char addr, unsigned char my_data)
{
    
        unsigned char get_segment=0;
    
        
        //时序  (1) start
        TM1637_START(); 
 
        //(2)发送commmd1==0X44就是固定地址
        TM1637_WRITE_BYTE_DATA(0x40+addr);
        TM1637_CHECK_ack();
        //注意这个有STOP
        TM1637_STOP();
     
     
        TM1637_START();
        //(3)发送起始地址, 
        TM1637_WRITE_BYTE_DATA(0xC0+addr);
        //要等DIN在第9个脉冲被拉低
        TM1637_CHECK_ack();
 
     
         get_segment =  SEGMENT_CODE[my_data] ;
        //(4) 发送该地址的数据
        TM1637_WRITE_BYTE_DATA(get_segment|0x80);//|0x80 此处发送0x80是打开时间中间的2个点
        //要等DIN在第9个脉冲被拉低
        TM1637_CHECK_ack(); 
     
        TM1637_STOP();    
 
        //==============
        TM1637_START(); 
        TM1637_WRITE_BYTE_DATA(0X8C);              //开显示
        TM1637_STOP();
 
 
}
 


main.c

 /* USER CODE BEGIN 2 */
uint16_t g_usCO2ppm = 1234;
uint8_t g_ucaDispCode[4];
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
          g_ucaDispCode[0] = g_usCO2ppm/1000;
      g_ucaDispCode[1] = g_usCO2ppm/100%10;
      g_ucaDispCode[2] = g_usCO2ppm/10%10;
      g_ucaDispCode[3] = g_usCO2ppm%10;
            TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(0,g_ucaDispCode[0]);
            TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(1,g_ucaDispCode[1]);       
            TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(2,g_ucaDispCode[2]);
            TM1637_WRITE_DISPLAY_BYTE_FIX_ADDRESS(3,g_ucaDispCode[3]); 
 
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */


注意:

程序没有启用按键读取功能,只简单显示。ack也没有判断,直接延时跳过。

添加路径



查看stlink 更改下载完自动复位





运行效果



链接: https://pan.baidu.com/s/1Zfsa5qiYoBfVb26oX4moAg?pwd=dafj 提取码: dafj


原文 STM32 经过TM1637驱动四位数码管_tm1637数码管-CSDN博客

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
小巴陪你搞技术-STM32驱动1602时钟
小巴陪你搞技术-STM32驱动1602时钟
|
3月前
|
传感器
手把手在STM32F103C8T6上构建可扩展可移植的DHT11驱动
【8月更文挑战第29天】本文详细介绍在STM32F103C8T6上构建可扩展且可移植的DHT11温湿度传感器驱动的步骤,包括硬件与软件准备、硬件连接、驱动代码编写及测试。通过这些步骤,可根据实际项目需求优化和扩展代码。
|
4月前
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
67 14
|
4月前
STM32Cubemx PWM驱动SG90舵机
STM32Cubemx PWM驱动SG90舵机
160 13
|
4月前
STM32CubeMX mpu6050驱动
STM32CubeMX mpu6050驱动
72 10
|
4月前
STM32CubeMX EC11旋转编码器驱动
STM32CubeMX EC11旋转编码器驱动
214 10
|
4月前
STM32CubeMX OLED驱动
STM32CubeMX OLED驱动
65 10
|
4月前
STM32CubeMX WS2812B灯驱动
STM32CubeMX WS2812B灯驱动
196 1
|
4月前
STM32CubeMX ULN2003步进电机驱动
STM32CubeMX ULN2003步进电机驱动
57 0