一、模塊介紹
TM1637四位數(shù)碼管模塊是一種用于數(shù)字顯示的模塊。它可以通過(guò)接口與微控制器進(jìn)行通信,并將數(shù)字信息顯示在四個(gè)七段數(shù)碼管上。 該模塊具有以下功能:
1. 顯示數(shù)字0-9:模塊能夠?qū)⑽⒖刂破靼l(fā)送的數(shù)字信息顯示在數(shù)碼管上,可以顯示0-9的任何數(shù)字。
2. 顯示符號(hào):模塊支持顯示符號(hào),如負(fù)號(hào)、小數(shù)點(diǎn)等。
3. 亮度調(diào)整:可以通過(guò)接口控制模塊的亮度,調(diào)整數(shù)碼管的顯示亮度。
4. 多位數(shù)顯示:模塊支持同時(shí)顯示多位數(shù),最多可以同時(shí)顯示四位數(shù)。
5. 節(jié)約IO資源:使用TM1637芯片,模塊只需要兩個(gè)IO口即可完成與微控制器的通信,相比其他數(shù)碼管模塊節(jié)省了IO資源。
6. 低功耗:模塊具有低功耗特性,可以有效節(jié)省電力。 通過(guò)對(duì)TM1637四位數(shù)碼管模塊的使用,可以方便地實(shí)現(xiàn)數(shù)字顯示功能,適用于各種需要數(shù)字顯示的應(yīng)用場(chǎng)景,如計(jì)數(shù)器、計(jì)時(shí)器、電子鐘等。
二、資料獲取
關(guān)注微信公眾號(hào)--星之援工作室 發(fā)送關(guān)鍵字(TM1637)
????
?效果展示
三、代碼編寫(xiě)
main
主要進(jìn)行模塊的數(shù)據(jù)刷新功能,含接線方法
/*--------------------------------------------------------*
* *
* 星之援網(wǎng)絡(luò)科技工作室學(xué)習(xí)資料v1.0 *
* 時(shí)間:2023.7.14 *
* 程序介紹:TM1637 *
* 實(shí)現(xiàn)效果:驅(qū)動(dòng)數(shù)碼管 *
* *
*--------------------------------------------------------*
*/
/*接線
VCC-5.0
GND-GND
DIO-PB7
SCK-PB6
*/
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "TM1637.h"
//全局變量
extern unsigned char disp_num[];
extern unsigned char tab[];
int main(void)
{
u8 flag_s=0;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
// LED 端口初始化
LED_GPIO_Config();
// KEY 初始化
Key_GPIO_Config();
// 串口初始化
uart_init(115200);
//數(shù)碼管初始化
TM1637_Init();
printf("init okn");
while ( 1 )
{
#if 1
LED1_TOGGLE;
delay_ms( 1000 );
LED1_TOGGLE;
flag_s = ~flag_s;
disp_num[0] = tab[0];
if( flag_s )
disp_num[1] = tab[1] | 0x80; //最高位設(shè)置為1 顯示":"
else
disp_num[1] = tab[1];
disp_num[2] = tab[2];
disp_num[3] = tab[3];
TM1637_Display_INC();
TM1637_SetBrightness( 7 ); //設(shè)置亮度等級(jí) 0---7
#else //延時(shí)精確測(cè)試代碼
LED1_ON;
delay_us( 1 );
LED1_OFF;
delay_us( 1 );
#endif
}
}
tm1637.c
使用模擬 IIC 通訊進(jìn)行數(shù)據(jù)寫(xiě)入。
#include "TM1637.h"
#include "delay.h"
unsigned char tab[] =
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x77,/*10 A*/
0x7C,/*11 b*/
0x58,/*12 c*/
0x5E,/*13 d*/
0x79,/*14 E*/
0x71,/*15 F*/
0x76,/*16 H*/
0x38,/*17 L*/
0x54,/*18 n*/
0x73,/*19 P*/
0x3E,/*20 U*/
0x00,/*21 黑屏*/
};
// 最高位設(shè)置為1時(shí)顯示 數(shù)碼管上的":" 符號(hào)
unsigned char disp_num[] = {0x3F, 0x06 | 0x80, 0x5B, 0x4F, 0x66, 0x6D}; //存放6個(gè)數(shù)碼管要顯示的內(nèi)容
//端口初始化
void TM1637_Init( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( TM1637_CLK_GPIO_CLK | TM1637_DIO_GPIO_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = TM1637_CLK_GPIO_PIN | TM1637_DIO_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( TM1637_CLK_GPIO_PORT, &GPIO_InitStructure );
}
//起始位 CLK為高電平時(shí),DIO由高變低
void TM1637_Start( void )
{
TM1637_DIO_OUT();
TM1637_CLK = 1;
TM1637_DIO = 1;
delay_us( 2 );
TM1637_DIO = 0;
}
//等待應(yīng)答 傳輸數(shù)據(jù)正確時(shí),在第八個(gè)時(shí)鐘下降沿,芯片內(nèi)部會(huì)產(chǎn)生一個(gè)ACK信號(hào),將DIO管腳拉低,在第九個(gè)時(shí)鐘結(jié)束之后釋放DIO總線。
void TM1637_Ack( void )
{
TM1637_DIO_IN();
TM1637_CLK = 0;
delay_us( 5 ); //在第八個(gè)時(shí)鐘下降沿之后延時(shí) 5us,開(kāi)始判斷 ACK 信號(hào)
while( TM1637_READ_DIO ); //等待應(yīng)答位 這一行代碼也可以不要 不影響實(shí)際使用效果 在使用軟件仿真的時(shí)候需要屏蔽這句代碼,否則程序就會(huì)卡在這里。
TM1637_CLK = 1;
delay_us( 2 );
TM1637_CLK = 0;
}
//停止位 CLK為高電平時(shí),DIO由低變高
void TM1637_Stop( void )
{
TM1637_DIO_OUT();
TM1637_CLK = 0;
delay_us( 2 );
TM1637_DIO = 0;
delay_us( 2 );
TM1637_CLK = 1;
delay_us( 2 );
TM1637_DIO = 1;
}
//輸入數(shù)據(jù)在CLK的低電平變化,在CLK的高電平被傳輸。
//每傳輸一個(gè)字節(jié),芯片內(nèi)部在第八個(gè)時(shí)鐘下降沿產(chǎn)生一個(gè)ACK
// 寫(xiě)一個(gè)字節(jié)
void TM1637_WriteByte( unsigned char oneByte )
{
unsigned char i;
TM1637_DIO_OUT();
for( i = 0; i < 8; i++ )
{
TM1637_CLK = 0;
if( oneByte & 0x01 ) //低位在前
{
TM1637_DIO = 1;
}
else
{
TM1637_DIO = 0;
}
delay_us( 3 );
oneByte = oneByte >> 1;
TM1637_CLK = 1;
delay_us( 3 );
}
}
//寫(xiě)顯示寄存器 地址自增
void TM1637_Display_INC( void )
{
unsigned char i;
TM1637_Start();
TM1637_WriteByte( 0x40 ); //寫(xiě)數(shù)據(jù)到顯示寄存器 40H 地址自動(dòng)加1 模式,44H 固定地址模式,本程序采用自加1模式
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0xC0 ); //地址命令設(shè)置 顯示地址 00H
TM1637_Ack();
for( i = 0; i < 6; i++ ) //地址自加,不必每次都寫(xiě)地址
{
TM1637_WriteByte( disp_num[i] ); //發(fā)送數(shù)據(jù) disp_num[]中存儲(chǔ)6個(gè)數(shù)碼管要顯示的內(nèi)容
TM1637_Ack();
}
TM1637_Stop();
#if 0
TM1637_Start();
TM1637_WriteByte( 0x88 | 0x07 ); //開(kāi)顯示,最大亮度-----調(diào)節(jié)脈沖寬度控制0---7 脈沖寬度14/16
TM1637_Ack();
TM1637_Stop();
#endif
}
//寫(xiě)顯示寄存器 地址不自增
// add 數(shù)碼管的地址 0--5
// value 要顯示的內(nèi)容
void TM1637_Display_NoINC( unsigned char add, unsigned char value )
{
TM1637_Start();
TM1637_WriteByte( 0x44 ); //寫(xiě)數(shù)據(jù)到顯示寄存器 40H 地址自動(dòng)加1 模式,44H 固定地址模式,本程序采用自加1模式
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0xC0 | add ); //地址命令設(shè)置 顯示地址 C0H---C5H
TM1637_Ack();
TM1637_WriteByte( value ); //發(fā)送數(shù)據(jù) value存儲(chǔ)要顯示的內(nèi)容
TM1637_Ack();
TM1637_Stop();
#if 0
TM1637_Start();
TM1637_WriteByte( 0x88 | 0x07 ); //開(kāi)顯示,最大亮度-----調(diào)節(jié)脈沖寬度控制0---7 脈沖寬度14/16
TM1637_Ack();
TM1637_Stop();
#endif
}
// level : 設(shè)置亮度等級(jí) 0---7
void TM1637_SetBrightness( unsigned char level )
{
TM1637_Start();
TM1637_WriteByte( 0x88 | level ); //開(kāi)顯示,最大亮度-----調(diào)節(jié)脈沖寬度控制0---7 脈沖寬度14/16
TM1637_Ack();
TM1637_Stop();
}
//讀按鍵 讀按鍵時(shí),時(shí)鐘頻率應(yīng)小于 250K,先讀低位,后讀高位。
unsigned char TM1637_ScanKey( void )
{
unsigned char reKey, i;
TM1637_Start();
TM1637_WriteByte( 0x42 ); //讀鍵掃數(shù)據(jù)
TM1637_Ack();
TM1637_DIO = 1; //在讀按鍵之前拉高數(shù)據(jù)線
TM1637_DIO_IN();
for( i = 0; i < 8; i++ ) //從低位開(kāi)始讀
{
TM1637_CLK = 0;
reKey = reKey >> 1;
delay_us( 30 );
TM1637_CLK = 1;
if( TM1637_READ_DIO )
{
reKey = reKey | 0x80;
}
else
{
reKey = reKey | 0x00;
}
delay_us( 30 );
}
TM1637_Ack();
TM1637_Stop();
return( reKey );
}
//按鍵處理函數(shù),按鍵數(shù)據(jù)低位在前高位在后
unsigned char TM1637_KeyProcess( void )
{
unsigned char temp;
unsigned char keyNum = 0;
temp = TM1637_ScanKey(); //讀取按鍵返回值
if( temp != 0xff )
{
switch( temp )
{
case 0xf7 : //K1與SG1對(duì)應(yīng)按鍵按下
keyNum = 1;
break;
case 0xf6 : //K1與SG2對(duì)應(yīng)按鍵按下
keyNum = 2;
break;
case 0xf5 : //K1與SG3對(duì)應(yīng)按鍵按下
keyNum = 3;
break;
case 0xf4 : //K1與SG4對(duì)應(yīng)按鍵按下
keyNum = 4;
break;
case 0xf3 : //K1與SG5對(duì)應(yīng)按鍵按下
keyNum = 5;
break;
case 0xf2 : //K1與SG6對(duì)應(yīng)按鍵按下
keyNum = 6;
break;
case 0xf1 : //K1與SG7對(duì)應(yīng)按鍵按下
keyNum = 7;
break;
case 0xf0 : //K1與SG8對(duì)應(yīng)按鍵按下
keyNum = 8;
break;
case 0xef : //K2與SG1對(duì)應(yīng)按鍵按下
keyNum = 9;
break;
case 0xee : //K2與SG2對(duì)應(yīng)按鍵按下
keyNum = 10;
break;
case 0xed : //K2與SG3對(duì)應(yīng)按鍵按下
keyNum = 11;
break;
case 0xec : //K2與SG4對(duì)應(yīng)按鍵按下
keyNum = 12;
break;
case 0xeb : //K2與SG5對(duì)應(yīng)按鍵按下
keyNum = 13;
break;
case 0xea : //K2與SG6對(duì)應(yīng)按鍵按下
keyNum = 14;
break;
case 0xe9 : //K2與SG7對(duì)應(yīng)按鍵按下
keyNum = 15;
break;
case 0xe8 : //K2與SG8對(duì)應(yīng)按鍵按下
keyNum = 16;
break;
default :
keyNum = 0;
break;
}
}
return keyNum;
}
tm1637.h
主要放置定義的引腳部分和函數(shù)申明。
#ifndef __TM1637_H
#define __TM1637_H
#include "stm32f10x.h"
/* 定義IIC連接的GPIO端口, 用戶只需要修改下面的代碼即可改變控制的LED引腳 */
#define TM1637_CLK_GPIO_PORT GPIOB /* GPIO端口 */
#define TM1637_CLK_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口時(shí)鐘 */
#define TM1637_CLK_GPIO_PIN GPIO_Pin_6
#define TM1637_DIO_GPIO_PORT GPIOB /* GPIO端口 */
#define TM1637_DIO_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口時(shí)鐘 */
#define TM1637_DIO_GPIO_PIN GPIO_Pin_7
//使用 位帶 操作
#define TM1637_CLK PBout(6)
#define TM1637_DIO PBout(7)
#define TM1637_READ_DIO PBin(7)
//IO方向設(shè)置 0011輸出模式 1000上下拉輸入模式
#define TM1637_DIO_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define TM1637_DIO_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
//端口初始化
void TM1637_Init( void );
//起始位 CLK為高電平時(shí),DIO由高變低
void TM1637_Start( void );
//等待應(yīng)答 傳輸數(shù)據(jù)正確時(shí),在第八個(gè)時(shí)鐘下降沿,芯片內(nèi)部會(huì)產(chǎn)生一個(gè)ACK信號(hào),將DIO管腳拉低,在第九個(gè)時(shí)鐘結(jié)束之后釋放DIO總線。
void TM1637_Ack( void );
//停止位 CLK為高電平時(shí),DIO由低變高
void TM1637_Stop( void );
// 寫(xiě)一個(gè)字節(jié)
void TM1637_WriteByte( unsigned char oneByte );
//寫(xiě)顯示寄存器 地址自增
void TM1637_Display_INC( void );
//寫(xiě)顯示寄存器 地址不自增
void TM1637_Display_NoINC( unsigned char add, unsigned char value );
// level : 設(shè)置亮度等級(jí) 0---7
void TM1637_SetBrightness( unsigned char level );
//讀按鍵 讀按鍵時(shí),時(shí)鐘頻率應(yīng)小于 250K,先讀低位,后讀高位。
unsigned char TM1637_ScanKey( void );
#endif /* __TM1637_H */
四、參考
STM32F103單片機(jī)驅(qū)動(dòng)TM1637數(shù)碼管顯示模塊https://blog.csdn.net/qq_20222919/article/details/111571937
完整代碼請(qǐng)關(guān)注衛(wèi)星公眾號(hào)進(jìn)行獲取和咨詢
聯(lián)系方式 微信號(hào):13648103287