加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

嵌入式外設(shè)集-數(shù)碼管(TM1637)驅(qū)動(dòng)

03/20 15:31
5251
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
    • 一、模塊介紹
    • 二、資料獲取
    • 三、代碼編寫
    • 四、參考
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

一、模塊介紹

TM1637四位數(shù)碼管模塊是一種用于數(shù)字顯示的模塊。它可以通過接口與微控制器進(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)整:可以通過接口控制模塊的亮度,調(diào)整數(shù)碼管的顯示亮度。

4. 多位數(shù)顯示:模塊支持同時(shí)顯示多位數(shù),最多可以同時(shí)顯示四位數(shù)。

5. 節(jié)約IO資源:使用TM1637芯片,模塊只需要兩個(gè)IO口即可完成與微控制器的通信,相比其他數(shù)碼管模塊節(jié)省了IO資源。

6. 低功耗:模塊具有低功耗特性,可以有效節(jié)省電力。 通過對TM1637四位數(shù)碼管模塊的使用,可以方便地實(shí)現(xiàn)數(shù)字顯示功能,適用于各種需要數(shù)字顯示的應(yīng)用場景,如計(jì)數(shù)器、計(jì)時(shí)器、電子鐘等。

二、資料獲取

關(guān)注微信公眾號(hào)--星之援工作室 發(fā)送關(guān)鍵字(TM1637

????

?效果展示

三、代碼編寫

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í)精確測試代碼
 
        LED1_ON;
        delay_us( 1 );
        LED1_OFF;
        delay_us( 1 );
 
#endif
    }
}

tm1637.c

使用模擬 IIC 通訊進(jìn)行數(shù)據(jù)寫入。

#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,開始判斷 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
// 寫一個(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 );
    }
}
 
//寫顯示寄存器  地址自增
void TM1637_Display_INC( void )
{
    unsigned char i;
    TM1637_Start();
    TM1637_WriteByte( 0x40 );									//寫數(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++ )									//地址自加,不必每次都寫地址
    {
        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 );					//開顯示,最大亮度-----調(diào)節(jié)脈沖寬度控制0---7  脈沖寬度14/16
    TM1637_Ack();
    TM1637_Stop();
#endif
}
 
//寫顯示寄存器  地址不自增
// add 數(shù)碼管的地址 0--5
// value 要顯示的內(nèi)容
void TM1637_Display_NoINC( unsigned char add, unsigned char value )
{

    TM1637_Start();
    TM1637_WriteByte( 0x44 );								//寫數(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 );							//開顯示,最大亮度-----調(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 );							//開顯示,最大亮度-----調(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++ )						//從低位開始讀
    {
        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對應(yīng)按鍵按下
            keyNum = 1;
            break;
        case 0xf6 :						 	//K1與SG2對應(yīng)按鍵按下
            keyNum = 2;
            break;
        case 0xf5 :							//K1與SG3對應(yīng)按鍵按下
            keyNum = 3;
            break;
        case 0xf4 :							//K1與SG4對應(yīng)按鍵按下
            keyNum = 4;
            break;
        case 0xf3 :							//K1與SG5對應(yīng)按鍵按下
            keyNum = 5;
            break;
        case 0xf2 :						 	//K1與SG6對應(yīng)按鍵按下
            keyNum = 6;
            break;
        case 0xf1 :							//K1與SG7對應(yīng)按鍵按下
            keyNum = 7;
            break;
        case 0xf0 :							//K1與SG8對應(yīng)按鍵按下
            keyNum = 8;
            break;
 
        case 0xef :						 	//K2與SG1對應(yīng)按鍵按下
            keyNum = 9;
            break;
        case 0xee :							//K2與SG2對應(yīng)按鍵按下
            keyNum = 10;
            break;
        case 0xed :							//K2與SG3對應(yīng)按鍵按下
            keyNum = 11;
            break;
        case 0xec :						 	//K2與SG4對應(yīng)按鍵按下
            keyNum = 12;
            break;
        case 0xeb :							//K2與SG5對應(yīng)按鍵按下
            keyNum = 13;
            break;
        case 0xea :							//K2與SG6對應(yīng)按鍵按下
            keyNum = 14;
            break;
        case 0xe9 :							//K2與SG7對應(yīng)按鍵按下
            keyNum = 15;
            break;
        case 0xe8 :							//K2與SG8對應(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 );
// 寫一個(gè)字節(jié)
void TM1637_WriteByte( unsigned char oneByte );
//寫顯示寄存器  地址自增
void TM1637_Display_INC( void );
//寫顯示寄存器  地址不自增
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ù)碼管顯示模塊icon-default.png?t=N7T8https://blog.csdn.net/qq_20222919/article/details/111571937


完整代碼請關(guān)注衛(wèi)星公眾號(hào)進(jìn)行獲取和咨詢


聯(lián)系方式 微信號(hào):13648103287

  • 聯(lián)系方式.docx

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MGM13S12F512GA-V3 1 Silicon Laboratories Inc Consumer Circuit,
$19.81 查看
TFA9879HN/N1,118 1 NXP Semiconductors TFA9879 - Mono BTL Class D audio amplifier for portable applications with digital input QFN 24-Pin

ECAD模型

下載ECAD模型
$2.98 查看
SI4707-B20-GM 1 Silicon Laboratories Inc Audio Single Chip Receiver,

ECAD模型

下載ECAD模型
$9.02 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

方案定制,程序設(shè)計(jì)方案、單片機(jī)程序設(shè)計(jì)與講解、APP定制開發(fā)。本公眾號(hào)致力于向讀者傳遞關(guān)于程序設(shè)計(jì)和開發(fā)的相關(guān)知識(shí),并分享一些關(guān)于軟件開發(fā)的最佳實(shí)踐。如果您有什么問題或建議,請隨時(shí)聯(lián)系我們。我們將竭誠為您服務(wù)