[RISC-V MCU 应用开发] 用CH32V103驱动TM1637四位数码管模块

[复制链接]
 楼主| lmn2005 发表于 2023-5-9 13:24 | 显示全部楼层 |阅读模式
本帖最后由 lmn2005 于 2023-5-10 19:23 编辑

本人参考https://bbs.21ic.com/icview-3060796-1-1.html一文,用CH32V103驱动TM1637数码管成功,代码很简单,望各位大佬勿喷。

TM1637.h:
  1. #ifndef __TM1637_H__
  2. #define __TM1637_H__

  3. #include "ch32v10x_conf.h"

  4. #define  TM1637_DIO_H  GPIO_SetBits(GPIOA,GPIO_Pin_1)    //配置SDA接口高电平
  5. #define  TM1637_DIO_L  GPIO_ResetBits(GPIOA,GPIO_Pin_1)  //配置SDA接口低电平

  6. #define  TM1637_CLK_H  GPIO_SetBits(GPIOA,GPIO_Pin_2)    //配置SCL接口高电平
  7. #define  TM1637_CLK_L  GPIO_ResetBits(GPIOA,GPIO_Pin_2)  //配置SCL接口低电平

  8. #define  TM1637_SDA_READ()  GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)  //读SDA口线状态

  9. void TM1637_Init(void);              //初始化TM1637引脚
  10. void TM1637_start(void);               // IIC开始
  11. void TM1637_ack(void);                 // IIC应答
  12. void TM1637_stop(void);                // IIC停止
  13. void TM1637_Write(unsigned char DATA); // 写数据函数
  14. void TM1637_SetBRI(unsigned char i);   // 设置亮度
  15. void TM1637_display(unsigned char a, unsigned char b,
  16.                     unsigned char c, unsigned char d); // 按顺序显示

  17. #endif
TM1637.c:
  1. #include "TM1637.h"
  2. unsigned char tab[] =
  3.     {
  4.         0x3F, /*0*/
  5.         0x06, /*1*/
  6.         0x5B, /*2*/
  7.         0x4F, /*3*/
  8.         0x66, /*4*/
  9.         0x6D, /*5*/
  10.         0x7D, /*6*/
  11.         0x07, /*7*/
  12.         0x7F, /*8*/
  13.         0x6F, /*9*/
  14.         0x77, /*10 A*/
  15.         0x7C, /*11 b*/
  16.         0x58, /*12 c*/
  17.         0x5E, /*13 d*/
  18.         0x79, /*14 E*/
  19.         0x71, /*15 F*/
  20.         0x76, /*16 H*/
  21.         0x38, /*17 L*/
  22.         0x54, /*18 n*/
  23.         0x73, /*19 P*/
  24.         0x3E, /*20 U*/
  25. };


  26. void TM1637_Init(void)//初始化TM1637引脚
  27. {
  28.     GPIO_InitTypeDef GPIO_InitStructure;

  29.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;//使用PA1和PA2作为模拟IIC引脚,PA1对应SDA,PA2对应SCL
  31.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出模式
  32.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  34.     //IIC_Idle_State();
  35. }

  36. void TM1637_start(void) // IIC开始
  37. {
  38.     TM1637_CLK_H;
  39.     TM1637_DIO_H;
  40.     Delay_Us(2);
  41.     TM1637_DIO_L;
  42. }

  43. void TM1637_ack(void) // IIC应答
  44. {
  45.     u8 i=0;
  46.     TM1637_CLK_L;
  47.     Delay_Us(5);
  48.     TM1637_CLK_H;
  49.     while (TM1637_SDA_READ() == 1 && (i < 250))
  50.         i++;
  51.     TM1637_CLK_H;
  52.     Delay_Us(2);
  53.     TM1637_CLK_L;
  54. }

  55. void TM1637_stop(void) // IIC停止
  56. {
  57.     TM1637_CLK_L;
  58.     Delay_Us(2);
  59.     TM1637_DIO_L;
  60.     Delay_Us(2);
  61.     TM1637_CLK_H;
  62.     Delay_Us(2);
  63.     TM1637_DIO_H;
  64.     Delay_Us(2);
  65. }

  66. void TM1637_Write(unsigned char DATA) // 写数据函数
  67. {
  68.     unsigned char i;
  69.     for (i = 0; i < 8; i++)
  70.     {
  71.         TM1637_CLK_L;
  72.         if (DATA & 0x01)
  73.             TM1637_DIO_H;
  74.         else
  75.             TM1637_DIO_L;
  76.         Delay_Us(2);
  77.         DATA = DATA >> 1;
  78.         TM1637_CLK_H;
  79.         Delay_Us(2);
  80.     }
  81.     // TM1637_ack();
  82. }


  83. void TM1637_display(unsigned char a, unsigned char b, unsigned char c, unsigned char d) // 按顺序显示
  84. {
  85.     TM1637_start();
  86.     TM1637_Write(0x40);
  87.     TM1637_ack();
  88.     TM1637_stop();
  89.     TM1637_start();
  90.     TM1637_Write(0xc0);
  91.     TM1637_ack();

  92.     TM1637_Write(tab[a]);
  93.     TM1637_ack();
  94.     TM1637_Write(tab[b]);
  95.     TM1637_ack();
  96.     TM1637_Write(tab[c]);
  97.     TM1637_ack();
  98.     TM1637_Write(tab[d]);
  99.     TM1637_ack();
  100.     TM1637_stop();
  101. }

  102. void TM1637_SetBRI(unsigned char i) // 设置亮度
  103. {
  104.     TM1637_start();
  105.     TM1637_Write(0x87 + i);
  106.     TM1637_ack();
  107.     TM1637_stop();
  108. }
123406459e0ff4365f.jpg

用CH32V103驱动TM1637数码管.rar

465.44 KB, 下载次数: 13

kissdb 发表于 2023-5-10 15:31 | 显示全部楼层
点赞支持一下,
tifmill 发表于 2023-6-10 11:54 | 显示全部楼层

TM1637能替换TM1640吗?  
cemaj 发表于 2023-6-10 13:11 | 显示全部楼层
TM1637: 这款芯片用来同时控制多达6个数码管

评论

对  发表于 2023-6-11 08:57
louliana 发表于 2023-6-13 20:57 | 显示全部楼层
TM1637是一种数字管驱动芯片,主要用于驱动4位共阳或共阴的7段LED数码管。它采用I2C总线通信协议,并且具有集成调光控制器和键扫描功能。

评论

1637只支持共阳,不支持共阴  发表于 2023-7-5 18:49
pmp 发表于 2023-6-13 22:00 | 显示全部楼层
tm1637电压3.3v可以用吗

评论

亮度比正常的低,最好还是用5V  发表于 2023-6-14 09:20
albertaabbot 发表于 2023-6-14 10:21 | 显示全部楼层
TM1637数码管驱动芯片的键扫电路的原理是什么呢
ulystronglll 发表于 2023-6-14 10:36 | 显示全部楼层
模拟I2C总线通信,实现了TM1637驱动4位数码管的功能。
timfordlare 发表于 2023-6-14 11:29 | 显示全部楼层
LED驱动控制专用电路TM1637
hilahope 发表于 2023-6-14 12:59 | 显示全部楼层
TM1637可以通过几个寄存器进行配置和控制。
sesefadou 发表于 2023-7-5 15:56 | 显示全部楼层
建议查阅TM1637库的文档以获取更详细的说明和使用示例。
hudi008 发表于 2023-7-5 16:34 | 显示全部楼层
需要初始化TM1637对象,并设置相关参数,如亮度、引脚等。然后,通过调用相应的函数来显示您想要的数字、字符或符号。
wengh2016 发表于 2023-7-5 16:39 | 显示全部楼层
TM1637是一款常用的四位数码管驱动芯片,具有简单易用和低功耗等特点。

评论

是的,方便易用。  发表于 2023-7-5 18:49
saservice 发表于 2023-7-5 20:46 | 显示全部楼层
调用刷新函数以在数码管上显示设置的内容。这样,设置的内容就会显示在数码管上。
maudlu 发表于 2023-7-5 21:08 | 显示全部楼层
可以通过控制其中两个引脚(DIO和CLK)来实现对四位共阳或共阴数码管的控制。

评论

1637只能支持共阳,不支持共阴的  发表于 2023-7-6 18:13
mnynt121 发表于 2023-7-5 21:56 | 显示全部楼层
将TM1637模块的VCC引脚连接到3.3V或5V电源,GND引脚连接到地线,然后将DIO引脚连接到控制器的一个数字I/O引脚,CLK引脚连接到另一个数字I/O引脚。
 楼主| lmn2005 发表于 2023-7-6 18:14 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

597

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

73

主题

597

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部