一、簡介
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);