1.22 TM1637 四位数码管显示模块(来自~的贡献)
1.22.1 模块来源
资料下载:(基于该模块的资料,百度云链接等)
https://pan.baidu.com/s/1TtbN_LEAzAUtrHLhBDxqxQ*
提取码:f6fv
实物展示图
1.22.2 规格参数
工作电压:3V~5v
工作电流:30~80mA
通信方式:IIC
引脚数量:4
1.22.3 模块原理
TM1637 管脚说明
特别注意此数码管的 IIC,从低位开始收,普遍的 IIC 标准是从高位开始收。
要是数码管显示数字,有两个条件:1.是要在 VT 端加合适的电源(一般每颗 LED 还需串上合适的电阻,起限流作用);2.要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。这样才能显示的。
例如下图的共阴极数码管,须在 VT 端接上地端,(a,b,c,d,e,f,g,dp)端接到单片机的引脚上;如果要使其中一个 LED 亮时,对应的 TM1637 引脚给出高电平,即可点亮 LED 等。
1.22.4 引脚选择
1.22.5 移植步骤
因模块采用的是 IIC 接口,我们使用软件 IIC 的方式进行通信,避免不了要使用到延时等时序控制类。
在 systick.c 中由于原来的文档只能定时 1ms,不符合 IIC 时序的要求,因此将其改为 us 延时。
cpp
#include "gd32f4xx.h"
#include "systick.h"
volatile static uint32_t delay;
/******************************************************************
* 函 数 名 称:systick_config
* 函 数 说 明:配置滴答定时器时间
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void systick_config(void)
{
/* setup systick timer for 1000Hz interrupts */
if(SysTick_Config(SystemCoreClock / 1000000U)) {
/* capture error */
while(1) {
}
}
/* configure the systick handler priority */
NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
/******************************************************************
* 函 数 名 称:delay_1us
* 函 数 说 明:微秒级延时
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void delay_1us(uint32_t count)
{
delay = count ;
while(0U != delay) {
}
}
/******************************************************************
* 函 数 名 称:delay_1ms
* 函 数 说 明:毫秒级延时
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void delay_1ms(uint32_t xms)
{
while(xms--)
{
delay_1us(1000);
}
}
/******************************************************************
* 函 数 名 称:delay_decrement
* 函 数 说 明:放下定时器中断delay--
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void delay_decrement(void)
{
if(0U != delay) {
delay--;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
systick.h
cpp
#ifndef SYS_TICK_H
#define SYS_TICK_H
#include <stdint.h>
/* configure systick */
void systick_config(void);
/* delay a time in milliseconds */
void delay_1ms(uint32_t count);
void delay_1us(uint32_t count);
/* delay decrement */
void delay_decrement(void);
#endif /* SYS_TICK_H */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
在 TM1637.c 文件中编写如果下:
cpp
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: ~
* 修改日期: 2023年08月29日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "TM1637.h"
uint8_t dpFlag = 0;//主函数有说明
unsigned char Data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
struct {
char shi;
char ge;
}Hour;
struct {
char shi;
char ge;
}Min;
/******************************************************************
* 函 数 名 称:GPIO_Config
* 函 数 说 明:引脚初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void GPIO_Config(void)
{
rcu_periph_clock_enable(TM_DIO_CLK);
rcu_periph_clock_enable(TM_CLK_CLK);
/* 配置SCL */
gpio_mode_set(TM_DIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,TM_DIO_PIN);
gpio_output_options_set(TM_DIO_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,TM_DIO_PIN);
/* 配置SDA */
gpio_mode_set(TM_CLK_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,TM_CLK_PIN);
gpio_output_options_set(TM_CLK_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,TM_CLK_PIN);
}
/******************************************************************
* 函 数 名 称:IIC_Start
* 函 数 说 明:IIC起始时序
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void I2C_Start(void)
{
CLK_1;
DIO_1;
delay_1us(140);
DIO_0;
delay_1us(140);
CLK_0;
delay_1us(140);
}
/******************************************************************
* 函 数 名 称:IIC_Stop
* 函 数 说 明:IIC停止信号
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void I2C_stop(void)
{
CLK_0;
delay_1us(140);
DIO_0;
delay_1us(140);
CLK_1;
delay_1us(140);
DIO_1;
delay_1us(140);
}
/******************************************************************
* 函 数 名 称:TM1637_WriteBit
* 函 数 说 明:写一个bit位
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:无
******************************************************************/
void TM1637_WriteBit(unsigned char mBit)
{
CLK_0;
delay_1us(140);
if(mBit)
DIO_1;
else
DIO_0;
delay_1us(140);
CLK_1;
delay_1us(140);
}
/******************************************************************
* 函 数 名 称:TM1637_WriteByte
* 函 数 说 明:写一个字节
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:先写低位
******************************************************************/
void TM1637_WriteByte(unsigned char Byte)
{
char loop = 0;
for(loop = 0;loop<8;loop++)
{
TM1637_WriteBit((Byte>>loop) & 0x01);//先写低位
}
CLK_0;
delay_1us(140);
DIO_1;
delay_1us(140);
CLK_1;
delay_1us(140);
while(gpio_input_bit_get(TM_DIO_PORT ,TM_DIO_PIN) == 0x01);
//等待应答信号
}
/******************************************************************
* 函 数 名 称:TM1637_WriteCommand
* 函 数 说 明:写指令函数
* 函 数 形 参:无
* 函 数 返 回:无
* 备 注:B7:B6 =01 数据命令控制
11地址命令控制
10显示命令控制
******************************************************************/
void TM1637_WriteCommand(unsigned char mData)
{
I2C_Start();
TM1637_WriteByte(mData);
I2C_stop();
}
/******************************************************************
* 函 数 名 称:Time_Display
* 函 数 说 明:显示数值
* 函 数 形 参:无
* 函 数 返 回:无
******************************************************************/
void TM1637_WriteData(unsigned char addr,unsigned char mData)
{
I2C_Start();
TM1637_WriteByte(addr);
TM1637_WriteByte(mData);
I2C_stop();
}
/******************************************************************
* 函 数 名 称:Time_Display
* 函 数 说 明:显示数值
* 函 数 形 参:无
* 函 数 返 回:无
******************************************************************/
void Time_Display(void)
{
//设置模式普通模式写显示
TM1637_WriteCommand(0x44);
//写入地址,之后写入要显示的数据
TM1637_WriteData(0xc0,Data[Hour.shi]);
if(dpFlag)
TM1637_WriteData(0xc1,DataDp[Hour.ge]);
else
TM1637_WriteData(0xc1,DataDp[Hour.ge]);
TM1637_WriteData(0xc2, Data[Min.shi]);
TM1637_WriteData(0xc3, Data[Min.ge]);
TM1637_WriteCommand(0x8a);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
在 TM1637.h 文件中编写如果下:
cpp
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: ~
* 修改日期: 2023年08月29日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#ifndef _TM1673_H
#define _TM1673_H
#include "gd32f4xx.h" // Device header
#include "systick.h"
//引脚的时钟使能函数的宏定义
//DIO和CLK相关引脚的宏定义,用户只需要修改相关宏即可
#define TM_DIO_PORT GPIOA
#define TM_DIO_CLK RCU_GPIOA
#define TM_DIO_PIN GPIO_PIN_2
#define TM_CLK_PORT GPIOA
#define TM_CLK_CLK RCU_GPIOA
#define TM_CLK_PIN GPIO_PIN_3
//时钟线和数据线高低电平的宏定义,不需修改
#define CLK_1 gpio_bit_set(TM_CLK_PORT,TM_CLK_PIN)
#define CLK_0 gpio_bit_reset(TM_CLK_PORT,TM_CLK_PIN)
#define DIO_1 gpio_bit_set(TM_DIO_PORT,TM_DIO_PIN)
#define DIO_0 gpio_bit_reset(TM_DIO_PORT,TM_DIO_PIN)
//相关函数声明
void GPIO_Config(void);
void I2C_Start(void);
void I2C_stop(void);
void TM1637_WriteBit(unsigned char mBit);
void TM1637_WriteByte(unsigned char Byte);
void TM1637_WriteCommand(unsigned char mData);
void TM1637_WriteData(unsigned char addr,unsigned char mData);
void Time_Display(void);
#endif /* _TM1673_H*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1.22.6 移植验证
在 main.c 中编写如下代码:
cpp
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: ~
* 修改日期: 2022年04月19日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "gd32f4xx.h"
#include "gd32f4xx.h" // Device header
#include "systick.h"
#include "TM1637.h"
extern uint8_t dpFlag; //为1显示中间冒号
extern unsigned char Data[];//不加冒号的段选
extern unsigned char DataDp[];//加冒号的段选
//定义显示数据的结构体
extern struct
{
char shi;
char ge;
}Hour;
extern struct
{
char shi;
char ge;
}Min;
int main (void)
{
systick_config(); //滴答定时器初始化 1us
GPIO_Config();
/**
* @brief 主函数显示 67:59
*/
Hour.shi = 6;
Hour.ge = 7;
Min.shi = 5;
Min.ge = 9;
dpFlag = 0;
//配置GPIO
GPIO_Config();
//显示67:59
Time_Display();
while(1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
实物验证:
移植成功示例代码与文档。
代码工程文件