数码之家

 找回密码
 立即注册
搜索
查看: 1796|回复: 2

[ARM] 用CH32V103驱动TM1637四位数码管

[复制链接]
发表于 2023-5-9 13:38:02 | 显示全部楼层 |阅读模式
本人参考官方例程,用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. }
复制代码
完整的项目工程下载网址:
https://wwar.lanzout.com/iimuZ0v27oyj  
密码:cwbn

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 2家元 +130 收起 理由
jf201006 + 10 謝謝分享
家睦 + 120

查看全部打赏

发表于 2023-5-9 14:20:25 | 显示全部楼层
谢谢提供,正好买了几个TIM1637的4位数码管想试下。
回复 支持 反对

使用道具 举报

发表于 2023-5-12 05:43:36 来自手机浏览器 | 显示全部楼层
只用过1650的路过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-12 08:07:29 | 显示全部楼层
msvcp60 发表于 2023-5-12 05:43
只用过1650的路过

1650与1637的时序好像有区别
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 00:16 , Processed in 0.312001 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表