一、今天介紹如何使用STM32F103CBT6驅動TM1640點亮數碼管,硬件用的洋桃開發(fā)板,點亮后效果如下,六個數碼管依次顯示0.1.2.3.4.5.6.7
硬件原理圖如下,只用到了單片機的兩個IO口即可實現上圖的效果,該開發(fā)板上用的是PA11和PA12兩個IO口,用來模擬IIC通信,其中PA11接SCLK,PA12接DIN。另外可以看到TM1640的VDD接的是5V,規(guī)格書里面也是說需要接5V電壓,但實際我試過了,接3.3V也是可以驅動的。
二、TM1640介紹
TM1640通信方式其實就是常用的的IIC通信,這點可以在規(guī)格書里面看到相關介紹
三、寫程序
1、先將重要的一些參數進行宏定義
a.固定地址模式上面分析過了,是0x44,后面進行配置會用到
b.設置亮度,上面也分析過了
c.通過上面的數據通信的過程我們知道需要用到SCLK和DIN兩個信號,我們在硬件上接的是PA11和PA12兩個腳,所以用TM1640_DIN_H
、TM1640_DIN_H
、TM1640_SCLK_L
、TM1640_SCLK_H
來表示DIN和SCLK為高低電平。
#include "TM1640.h"
#include "delay.h"
#define DEL 1 //宏定義 通信速率(默認為1,如不能通信可加大數值)
//地址模式的設置
//#define TM1640MEDO_ADD 0x40 //宏定義 自動加一模式
#define TM1640MEDO_ADD 0x44 //宏定義 固定地址模式(推薦)
//顯示亮度的設置
//#define TM1640MEDO_DISPLAY 0x88 //宏定義 亮度 最小
//#define TM1640MEDO_DISPLAY 0x89 //宏定義 亮度
//#define TM1640MEDO_DISPLAY 0x8a //宏定義 亮度
//#define TM1640MEDO_DISPLAY 0x8b //宏定義 亮度
#define TM1640MEDO_DISPLAY 0x8c //宏定義 亮度(推薦)
//#define TM1640MEDO_DISPLAY 0x8d //宏定義 亮度
//#define TM1640MEDO_DISPLAY 0x8f //宏定義 亮度 最大
#define TM1640MEDO_DISPLAY_OFF 0x80 //宏定義 亮度 關
#define TM1640_DIN_H GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1))
#define TM1640_DIN_L GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0))
#define TM1640_SCLK_H GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1))
#define TM1640_SCLK_L GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0))
2、通信的開啟和結束代碼
void TM1640_start()
{
//通信時序 啟始
TM1640_DIN_H; //DIN輸出高電平1
TM1640_SCLK_H; //SCLK輸出高電平1
delay_us(DEL);//延時一段時間
TM1640_DIN_L; //DIN輸出低電平0
delay_us(DEL);//延時一段時間
TM1640_SCLK_L; //SCLK輸出低電平0
delay_us(DEL);//延時一端時間
}
void TM1640_stop()
{ //通信時序 結束
TM1640_DIN_L; //DIN輸出低電平0
TM1640_SCLK_L; //SCLK輸出低電平0
delay_us(DEL);//延時一段時間
TM1640_SCLK_H; //SCLK輸出高電平1
delay_us(DEL);
TM1640_DIN_H; //DIN輸出高電平1
delay_us(DEL);
}
3、底層函數,信號傳輸,寫8位數據
void TM1640_write(u8 date)
{ //寫數據(低層)
u8 i;
u8 aa;
aa=date;
TM1640_DIN_L; //DIN輸出0
TM1640_SCLK_L; //SCLK輸出0
for(i=0;i<8;i++)
{
TM1640_SCLK_L; //SCLK輸出0
delay_us(DEL);
if(aa&0x01)
{
TM1640_DIN_H; //DIN輸出1
delay_us(DEL);
}
else
{
TM1640_DIN_L; //DIN輸出0
delay_us(DEL);
}
TM1640_SCLK_H; //SCLK輸出1
delay_us(DEL);
aa=aa>>1;//右移一位
}
TM1640_DIN_L; //DIN輸出0
TM1640_SCLK_L; //SCLK輸出0
}
安裝上面的代碼傳輸二進制10110001
的時序圖如下,左邊為高位,右邊為低位。所以實際是從低位開始傳輸數據。
4、TM1640驅動函數
a、GPIO初始化、配置固定地址,設置亮度
void TM1640_Init(void)
{ //TM1640接口初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = TM1640_DIN | TM1640_SCLK; //選擇端口號(0~15或all)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //選擇IO接口工作方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置IO接口速度(2/10/50MHz)
GPIO_Init(TM1640_GPIOPORT, &GPIO_InitStructure);
GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口輸出高電平1
GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口輸出高電平1
TM1640_start();
TM1640_write(TM1640MEDO_ADD); //設置數據,0x40,0x44分別對應地址自動加一和固定地址模式
TM1640_stop();
TM1640_start();
TM1640_write(TM1640MEDO_DISPLAY); //設置亮度
//控制顯示,開顯示,0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f分別對應脈沖寬度為:
//------------------1/16, 2/16, 4/16, 10/16, 11/16, 12/16, 13/16, 14/16 //0x80關顯示
TM1640_stop();
}
b、TM1638顯示函數文章來源:http://www.zghlxwxcb.cn/news/detail-589314.html
void TM1640_display(u8 address,u8 date)
{ //固定地址模式的顯示輸出
const u8 buff[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};//數字0~9及0~9加點顯示段碼表
//--------------- 0 1 2 3 4 5 6 7 8 9 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 無
TM1640_start();
TM1640_write(0xC0+address);//傳顯示數據對應的地址
TM1640_write(buff[date]);//傳1BYTE顯示數據
TM1640_stop();
}
5、主函數
有了上面的鋪墊,主函數就很簡單了,只需要初始化TM1640,然后調用顯示函數即可文章來源地址http://www.zghlxwxcb.cn/news/detail-589314.html
int main ()
{
TM1640_Init(); //TM1640初始化
while(1)
{
TM1640_display(0,0);
TM1640_display(1,1);
TM1640_display(2,2);
TM1640_display(3,3);
TM1640_display(4,4);
TM1640_display(5,5);
TM1640_display(6,6);
TM1640_display(7,7);
}
}
到了這里,關于【洋桃一號板】STM32F103CBT6標準庫函數驅動TM1640點亮數碼管的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!