轉自 https://blog.csdn.net/cxw312864660/article/details/89374994
#ifndef __TM1640_H__ #define __TM1640_H__ #include "stm32f10x.h" #define ADDR_START1640 0XC0 #define DSP1640_DIS 0 #define DSP1640_ENB 1 /* 控制顯示 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f 分別對應 1/16, 2/16, 4/16, 10/16, 11/16, 12/16, 13/16, 14/16 設置數據,0x40,0x44分別對應地址自動加一和固定地址模式 */ #define SET_DATA_ORDER 0X40 //數據命令設置 地址自動加1 #define SET_DISPLAY 0X8F //顯示命令控制 脈沖寬度14/16 #define SET_DSP1640_DIS 0x80 //顯示關控制 #define VT_DLY1640 150//80//10//2000 #define VT_DLYNOP 10//80//10 #define SCLK_GPIO_PORT GPIOB #define SCLK_GPIO_CLK RCC_APB2Periph_GPIOB #define SCLK_GPIO_PIN GPIO_Pin_7 #define DIN_GPIO_PORT GPIOB #define DIN_GPIO_CLK RCC_APB2Periph_GPIOB #define DIN_GPIO_PIN GPIO_Pin_6 #define TM1640SLK_LOW GPIO_ResetBits( SCLK_GPIO_PORT, SCLK_GPIO_PIN ) #define TM1640SLK_HING GPIO_SetBits( SCLK_GPIO_PORT, SCLK_GPIO_PIN ) #define TM1640DAT_LOW GPIO_ResetBits( DIN_GPIO_PORT, DIN_GPIO_PIN ) #define TM1640DAT_HING GPIO_SetBits( DIN_GPIO_PORT, DIN_GPIO_PIN ) void TM1640_GPIO_Config(void); void Nop1640(u16 T_Dly); void TM1640Start(void); void TM1640Stop(void); void TM1640WriteByte(u8 date); void TM1640_Init(u8 InValue); void TM1640_SendData(u8 Addr1640,u8 *a,u8 DataLong); #endif ———————————————— 版權聲明:本文為CSDN博主「cxw312864660」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/cxw312864660/article/details/89374994
#include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "TM1640.h" /******** TM1640 GPIO 配置 *************************/ void TM1640_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( SCLK_GPIO_CLK | DIN_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = SCLK_GPIO_PIN; GPIO_Init(SCLK_GPIO_PORT, &GPIO_InitStructure); // 初始化 SCLK 引腳 GPIO_InitStructure.GPIO_Pin = DIN_GPIO_PIN; GPIO_Init(DIN_GPIO_PORT, &GPIO_InitStructure); // 初始化 DIN 引腳 // 引腳初始狀態為高,便於產生下降沿 GPIO_SetBits(SCLK_GPIO_PORT, SCLK_GPIO_PIN); GPIO_SetBits(DIN_GPIO_PORT, DIN_GPIO_PIN); } //************************************* // 函數名稱:_Nopt // 函數功能:延時函數 // 入口參數:延時時間 // 出口參數:無 //***************************************/ void Nop1640(u16 T_Dly) { while(T_Dly--); return ; } //**************************************** // 函數名稱:TM1640Start // 函數功能:TM1640起始信號 // 入口參數:無 // 出口參數:無 //***************************************/ void TM1640Start(void) { TM1640DAT_HING; Nop1640(VT_DLYNOP) ; TM1640SLK_HING; Nop1640(VT_DLY1640) ; TM1640DAT_LOW; Nop1640(VT_DLY1640) ; TM1640SLK_LOW; Nop1640(VT_DLY1640) ; } //************************************* // 函數名稱:TM1640Stop // 函數功能:TM1640結束信號 // 入口參數:無 // 出口參數:無 //***************************************/ void TM1640Stop(void) { TM1640DAT_LOW; Nop1640(VT_DLYNOP) ; TM1640SLK_HING; Nop1640(VT_DLY1640) ; TM1640DAT_HING; Nop1640(VT_DLY1640) ; TM1640SLK_LOW; Nop1640(VT_DLY1640) ; } //************************************* // 函數名稱:TM1640WriteByte // 函數功能:TM1640寫一字節數據 // 入口參數:要寫的數據 // 出口參數:無 //***************************************/ void TM1640WriteByte(u8 date) { u8 i; u8 Tmp; Tmp=date; TM1640DAT_LOW; Nop1640(VT_DLYNOP) ; TM1640SLK_LOW; for(i=0;i<8;i++) { TM1640SLK_LOW; Nop1640(VT_DLYNOP) ; if(Tmp & 0x01) { TM1640DAT_HING; Nop1640(VT_DLY1640) ; } else { TM1640DAT_LOW; Nop1640(VT_DLY1640) ; } TM1640SLK_HING; Tmp = Tmp>>1; } TM1640SLK_LOW; Nop1640(VT_DLYNOP) ; TM1640DAT_LOW; } //************************************* // 函數名稱:TM1640_Init // 函數功能:TM1640設備初始化 // 入口參數:0 1 代表 顯示關 顯示開 // 出口參數:無 //***************************************/ void TM1640_Init(u8 InValue) { TM1640DAT_HING; Nop1640(VT_DLYNOP) ; TM1640SLK_HING; if(InValue == DSP1640_DIS) //顯示關 { TM1640Start();//數據寫模式設置 TM1640WriteByte(SET_DSP1640_DIS);//顯示關控制 TM1640Stop(); } else { TM1640Start();//數據寫模式設置 TM1640WriteByte(SET_DATA_ORDER);//數據命令設置 地址自動加1 TM1640Stop(); TM1640Start(); //顯示亮度設置 TM1640WriteByte(SET_DISPLAY); //顯示命令控制 脈沖寬度14/16 TM1640Stop(); } } //************************************* // 函數名稱:TM1640_SendData // 函數功能:發送顯示緩存 // 入口參數:1640要寫數據的起始地址 // 顯示數據緩存的起始地址 數據長度 // 出口參數:無 //***************************************/ void TM1640_SendData(u8 Addr1640,u8 *a,u8 DataLong) { u8 i; TM1640Start(); TM1640WriteByte(Addr1640); //設置起始地址 for(i=0;i<DataLong;i++) { TM1640WriteByte(a[i]); } TM1640Stop(); } ———————————————— 版權聲明:本文為CSDN博主「cxw312864660」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/cxw312864660/article/details/89374994