STM32驅動TM1652代碼分享

一、簡介
TM1652 是一款LED(發光二極管、數碼管、點陣屏)驅動控制專用芯片,內部集成了數字通訊電路、
解碼電路、數據鎖存器、震盪器、LED驅動電路。通訊方式採用異步串口通信(UART)協議,因芯片只
接收單片機發來的數據,僅需要單片機的一個TX端口發送數據給芯片即可,實現單線通訊;在顯示驅動
方面,芯片採用動態掃描方式,兩種顯示模式可選,8級段驅動電流可調,16級位佔空比可調;TM1652
內置消隱處理優化電路
二、驅動方式
本芯片採用異步串口通信(UART)協議,工作原理是將傳輸數據的每個字符以串行方式一位接一位
的傳輸。下圖給出了其工作模式:
TM1652 每一位的時間爲:52us。
其中每一位(bit)的意義如下:
▲起始位:爲由高變低,低電平時間爲一位的時間,表示傳輸字符的開始。
▲數據位:緊跟起始位之後,D0-D7,低位先發。
▲校驗位:爲一位的時間,如果 8 位數據位中 1 的個數爲奇數,該位設爲 0(置低電平),否則爲 1(置
高電平)。
▲停止位:置高。時間爲一位的時間,它是發送完一個字符數據的結束標誌。
▲空閒位:置高。如果空閒位置高的時間大於 3ms,TM1652 就認爲本次數據幀結束,本次數據從暫存器
打入相應寄存器開始控制芯片輸出。如果一幀數據傳輸沒有結束,那麼建議設置空閒位時間範圍在
0-0.5ms 以內。
TM1652 的一幀數據包括以下兩種形式:
⑴ 顯示地址命令+顯示數據;
⑵ 顯示控制命令+顯示控制調節命令。
波特率:是衡量數據傳輸速率的指針。表示爲每秒鐘傳送的二進制位數(bit 數)。例如資料傳送速率
爲 120 字符/秒,而每一個字符爲 11 位,則其傳送的波特率爲 11×120=1320 bit/秒=1320
波特。TM1652 支持波特率範圍爲:17500bps~21200bps,這裏我們建議用 19200bps 即每位的時間爲:1s(秒)/19200≈52us(微秒)。所以 TM1652 支持的每位的時間範圍爲:47us~57us。
在用 IO 模擬 UART 通訊時候,SDA 數據的位寬應該滿足提供的位寬範圍。
三、驅動源碼

#include "tm1652.h"
	

void tm1652_init()
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOB, &GPIO_InitStructure);					
	GPIO_SetBits(GPIOB,GPIO_Pin_10);	

}

void tm1652_send_data(u8 sdat)
{
	unsigned char i=0, sfalg=0;
	
	//起始位
	TX=1;   TX=0;   delay_us(52);    //保持52us
	
   //發送8位數據
	for(i=0; i<8; i++)
	{
		if(sdat & 0x01)
		{
			TX=1;
			sfalg++;
		}else
		{
			TX=0;
		}
		delay_us(52); 
		sdat >>=1;
	}

	//校驗位,按照發送數據中1的個數來判斷
	if(sfalg%2==0)			         
	{
		TX=1;
	}
	else			        
	{
		TX=0;
	}
	delay_us(52); 
	
	//停止位
	TX=1;  delay_us(52);   
}

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "tm1652.h" 


		tm1652_send_data(0x08);
		tm1652_send_data(0xff);
		tm1652_send_data(0xff);
		tm1652_send_data(0xff);
		tm1652_send_data(0x00);
		tm1652_send_data(0x00);
		tm1652_send_data(0x00);
		tm1652_send_data(0x18);
		tm1652_send_data(0x4f);
		turn_green_led();
		delay_ms(1000);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章