數據手冊?
TM1640數據手冊
數據手冊解讀
這里我們看管腳定義DIN和SCLK,一個數據線一個時鐘線
SEG1~SEG8為段碼,GRID1~GRID16為位碼(共陰極情況下)
這里VDD給5V
?數據指令
數據命令設置
地址命令設置
顯示控制命令
共陰極硬件連接圖
這里我們只介紹共陰極,共陽極需要在代碼里調整,有興趣可以私聊我
注意事項
TM1640驅動源碼(非阻塞)
tm1640.c
//******************************************************************************
/*** @Name : TM1640_Start* @Date : 2025年4月21日* @Description: TM1640起始* @Parameters : None* @Return : None*/
void TM1640_Start(void)
{TM_SDA_H();TM_SCL_H();__NOP();__NOP();TM_SDA_H();__NOP();__NOP();TM_SDA_L();__NOP();__NOP();__NOP();__NOP();TM_SCL_L();__NOP();__NOP();
}//******************************************************************************
/*** @Name : TM1640_Stop* @Date : 2025年4月21日* @Description: TM1640結束* @Parameters : None* @Return : None*/
void TM1640_Stop(void)
{TM_SCL_H();__NOP();__NOP();TM_SDA_L();__NOP();__NOP();TM_SDA_H();__NOP();__NOP();TM_SCL_L();TM_SDA_L();
}//******************************************************************************
/*** @Name : TM1640_WriteData* @Date : 2025年4月21日* @Description: 寫入一字節的數據* @Parameters : oneByte:需要發送的數據字節* @Return : None*/
void TM1640_WriteData(uint8_t oneByte)
{uint8_t index;for(index=0;index<8;index++){TM_SCL_L();if(oneByte&0x01) TM_SDA_H();elseTM_SDA_L();__NOP();__NOP();__NOP();TM_SCL_H();oneByte=oneByte>>1;}TM_SCL_L();__NOP();__NOP();__NOP();__NOP();TM_SDA_L();__NOP();__NOP();
}//******************************************************************************
/*** @Name : TM1640_Handle* @Date : 2025年4月21日* @Description: 啟動、寫數據和控制顯示* @Parameters : None* @Return : None*/
void TM1640_Handle(void)
{uint8_t index;TM1640_Start();TM1640_WriteData(CMD_DATA_1);//地址自動加1,普通模式TM1640_Stop();TM1640_Start();TM1640_WriteData(START_ADDRESS_1);for(index=0;index<smg_num;index++){TM1640_WriteData(smg[index]);}TM1640_Stop();TM1640_Start();TM1640_WriteData(BRIGHTNESS_LEVEL_4);TM1640_Stop();__NOP();}
這里smg[index]需要你自己去定義,然后將數組傳入tm1640中就可以?
tm1640.h
/*數碼管數量*/
#define smg_num 16(最大16位)
/*顯示控制命令,設置亮度打開顯示屏,共8級亮度,也就是設置不同的脈沖寬度*/
#define BRIGHTNESS_LEVEL_1 0x88
#define BRIGHTNESS_LEVEL_2 0x89
#define BRIGHTNESS_LEVEL_3 0x8a
#define BRIGHTNESS_LEVEL_4 0x8b
#define BRIGHTNESS_LEVEL_5 0x8c
#define BRIGHTNESS_LEVEL_6 0x8d
#define BRIGHTNESS_LEVEL_7 0x8e
#define BRIGHTNESS_LEVEL_8 0x8f
#define CLOSE_DISPLAY 0x80/*數據設置命令*/
#define CMD_DATA_1 0X40 //地址自動加1,普通模式 0100 0000
#define CMD_DATA_2 0X44 //地址固定,普通模式 0100 0100
#define CMD_DATA_3 0X48 //地址自動加1,內部測試模式 0100 1000
#define CMD_DATA_4 0X4C //地址固定,內部測試模式 0100 1100/*地址命令設置 顯存地址為0xC0-0xCF*/
#define START_ADDRESS_1 0XC0 //第一個數碼管
#define START_ADDRESS_2 0XC1
#define START_ADDRESS_3 0XC2
#define START_ADDRESS_4 0XC3
#define START_ADDRESS_5 0XC4
#define START_ADDRESS_6 0XC5
#define START_ADDRESS_7 0XC6
#define START_ADDRESS_8 0XC7
#define START_ADDRESS_9 0XC8
#define START_ADDRESS_10 0XC9
#define START_ADDRESS_11 0XCa
#define START_ADDRESS_12 0XCb
#define START_ADDRESS_13 0XCc
#define START_ADDRESS_14 0XCd
#define START_ADDRESS_15 0XCe
#define START_ADDRESS_16 0XCf#define TM_SCL_H() GPIOB->BSRR = GPIO_PIN_6
#define TM_SCL_L() GPIOB->BRR = GPIO_PIN_6#define TM_SDA_H() GPIOB->BSRR = GPIO_PIN_7
#define TM_SDA_L() GPIOB->BRR = GPIO_PIN_7
?
?