TM1638芯片 LED数码管驱动器 详细介绍
| 相比MAX7219,TM1638的操作更加復(fù)雜,但是功能也更加強(qiáng)大 |
目錄
- TM1638簡(jiǎn)介
- 器件特性
- TM1638引腳圖
- 引腳功能說(shuō)明
- TM1638地址組
- ?顯存地址
- ?鍵值地址
- TM1638指令表
- ?指令分類
- ?數(shù)據(jù)命令
- ?地址命令
- ?顯示控制命令
- TM1638的兩種數(shù)碼管使用方式
- 共陰方式
- 共陽(yáng)方式
- TM1638數(shù)據(jù)格式
- 按鍵掃描和鍵掃復(fù)用
- 按鍵掃描電路
- 按鍵復(fù)用
- 自己編寫的驅(qū)動(dòng)程序(C51)
TM1638簡(jiǎn)介
??TM1638是深圳市天微電子有限公司設(shè)計(jì)的一款帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用芯片,內(nèi)部集成有MCU數(shù)字接口、數(shù)據(jù)鎖存器、LED高壓驅(qū)動(dòng)、鍵盤掃描等電路。主要應(yīng)用于冰箱、空調(diào) 、家庭影院等產(chǎn)品的高段位顯示屏驅(qū)動(dòng)。
器件特性
- 采用功率CMOS 工藝
- 顯示模式 10 段×8 位
- 鍵掃描(8×3bit)
- 8級(jí)輝度可調(diào)
- 串行接口(CLK,STB,DIO)
- 振蕩方式:RC 振蕩(450KHz+5%)
- 內(nèi)置上電復(fù)位電路
- 采用SOP28封裝
TM1638引腳圖
引腳功能說(shuō)明
- STB:片選端;在上升或下降沿初始化串行接口,隨后等待接收指令。當(dāng)STB 為高時(shí),CLK被忽略
- DIO:數(shù)據(jù)端;在時(shí)鐘上升沿輸入/輸出串行數(shù)據(jù)
- CLK:時(shí)鐘端;輸入時(shí)鐘信號(hào)
- K1~K3:鍵掃輸入;輸入該腳的數(shù)據(jù)在顯示周期結(jié)束后被鎖存
- SEG1/KS1~SEG8/KS8:段輸出;P管開(kāi)漏輸出,也用作鍵掃描
- SEG9,SEG10:段輸出;P管開(kāi)漏輸出
- GRID1~GRID8:位輸出;N管開(kāi)漏輸出
- VDD:電源端;功能
- GND:邏輯地;功能
TM1638地址組
?顯存地址
??顯存地址中,如果GRIDn和SEGn對(duì)應(yīng)的地址里數(shù)據(jù)為1,則連接到GRIDn和SEGn上的LED段落將會(huì)被點(diǎn)亮。 例如00H的數(shù)據(jù)為0X0F,則連到GIRD1和SEG1、SEG2、SEG3、SEG4上的LED段落將會(huì)被點(diǎn)亮
?鍵值地址
??每個(gè)Byte里儲(chǔ)存6個(gè)鍵值數(shù)據(jù),相對(duì)應(yīng)的位置為1則代表對(duì)應(yīng)位置有鍵按下。
TM1638指令表
?指令分類
TM1638通過(guò)傳送的8位指令的B7,B6兩位來(lái)區(qū)分指令類型:
| 0 1 | 數(shù)據(jù)命令 |
| 1 1 | 地址命令 |
| 1 0 | 顯示控制命令 |
?數(shù)據(jù)命令
?地址命令
??地址命令用來(lái)設(shè)置要寫入的數(shù)據(jù)的地址。數(shù)據(jù)寫入有自增址和固定址兩種,固定址每次寫入數(shù)據(jù)需要指定要寫入數(shù)據(jù)的地址。
?顯示控制命令
??顯示控制命令主要是用來(lái)設(shè)置LED的亮度,以及顯示開(kāi)關(guān)。
TM1638的兩種數(shù)碼管使用方式
??TM1638的一個(gè)優(yōu)點(diǎn)是:不區(qū)分共陰/共陽(yáng),兩種數(shù)碼管都可以使用,但是使用方法有所不同。
??這里涉及到TM1638的顯示原理:TM1638的GRIDn端是始終保持低電平的,當(dāng)顯存地址里對(duì)應(yīng)的數(shù)據(jù)為1時(shí),TM1638令與其對(duì)應(yīng)的SEGn端為高電平來(lái)使LED導(dǎo)通發(fā)光。
共陰方式
??共陰數(shù)碼管使用同一個(gè)陰極和多個(gè)陽(yáng)極,因?yàn)镚RID始終為低電平,所以只能由1個(gè)GRIDn端作為共陰極,而8個(gè)SEG端作為陽(yáng)極。
??這時(shí)每個(gè)數(shù)碼管的顯示數(shù)據(jù)由8個(gè)SEGn對(duì)應(yīng)1個(gè)GRIDn端組成,由顯存地址關(guān)系圖可知每個(gè)非奇數(shù)地址便儲(chǔ)存著1個(gè)數(shù)碼管的顯示數(shù)據(jù)。
??共陰數(shù)碼管的顯存數(shù)據(jù)寫入比共陽(yáng)方便很多,只用向一個(gè)地址寫入8位數(shù)據(jù)即可。例如GRID1和SEG1~SEG8對(duì)應(yīng)共陰LED1,要讓其顯示 0 則只用向 00H 地址寫入 0X3F;
??如下圖所示:
??共陰方式的不足則是無(wú)法使用SEG9和SEG10來(lái)組成共陰數(shù)碼管,所以共陰方式最多可以使用8個(gè)數(shù)碼管。多余的SEG9和SEG10仍可以使用,但必須采用共陽(yáng)方式。
共陽(yáng)方式
??共陰數(shù)碼管使用同一個(gè)陽(yáng)極和多個(gè)陰極,因?yàn)镚RID始終為低電平,所以只能由8個(gè)GRIDn端作為陰極,1個(gè)SEG端作為共陽(yáng)極。
??這時(shí)每個(gè)數(shù)碼管的顯示數(shù)據(jù)由8個(gè)GRIDn對(duì)應(yīng)1個(gè)SEGn端組成,由顯存地址關(guān)系圖可知:由8個(gè)偶數(shù)/奇數(shù)地址的共同一位組成一個(gè)數(shù)碼管的8位顯示數(shù)據(jù)。
??共陽(yáng)數(shù)碼管的數(shù)據(jù)寫入比較麻煩,每為一個(gè)數(shù)碼管寫入一次數(shù)據(jù)都要向8個(gè)地址分別寫入1位數(shù)據(jù)。例如GRID1~GRID8和SEG1對(duì)應(yīng)共陰LED1,要讓其顯示0則要00H,02H,04H,06H,08H,0AH都寫入1,向0CH和0EH中寫入0
??如下圖所示:
??共陽(yáng)方式的優(yōu)點(diǎn)是可以使用多至10個(gè)數(shù)碼管;缺點(diǎn)嘖是數(shù)據(jù)的寫入方式比較繁瑣,并且需要額外增加數(shù)據(jù)轉(zhuǎn)換。
TM1638數(shù)據(jù)格式
- TM1638的數(shù)據(jù)讀取和發(fā)送都在CLK的上升沿進(jìn)行,因?yàn)镈IO在時(shí)鐘的下降沿控制N管動(dòng)作,此時(shí)讀數(shù)不穩(wěn)定。
- TM1638采取低位在前的數(shù)據(jù)格式,每次發(fā)送和讀取都是1byte長(zhǎng)度,即8位二進(jìn)制數(shù)據(jù)
- 每次STB拉低之后的第一個(gè)字節(jié)作為指令,處理指令時(shí)當(dāng)前其它處理被終止。
- 自增址模式下,只用寫入一次地址即首地址,之后依次寫入數(shù)據(jù),每次寫入數(shù)據(jù),地址自動(dòng)增加0X01。數(shù)據(jù)全部寫入之后,上拉STB來(lái)作為結(jié)束的信號(hào)。
- 固定址模式下,每次寫入數(shù)據(jù)需要先寫入一次地址,為要寫入的數(shù)據(jù)指定寫入的地址,之后寫入數(shù)據(jù),然后上拉STB結(jié)束一次寫入。
- 讀數(shù)據(jù)以拉低STB寫入讀鍵值指令(0X42)作為開(kāi)始,之后TM1638會(huì)依次按從低到高的順序傳送4byte的鍵值數(shù)據(jù)。讀取4byte數(shù)據(jù)之后上拉STB結(jié)束讀取。
按鍵掃描和鍵掃復(fù)用
按鍵掃描電路
??電路的連接方式如下圖,Kn端作為列線,KSn端作為行線,當(dāng)有鍵按下被掃描到,數(shù)據(jù)被存入鍵值寄存器。
??按鍵掃描時(shí)在端口上的波形:
按鍵復(fù)用
??SEG1/KS1~SEG8/KS8是復(fù)用的端口,作為顯示輸出同時(shí)作為鍵掃輸出端口。當(dāng)存在按鈕同時(shí)按下時(shí),如S1,S2,SEG1和SEG2相當(dāng)于被短路,此時(shí)D1,2D兩個(gè)LED都會(huì)被點(diǎn)亮,從而造成顯示錯(cuò)誤。
??解決方法之一是在每個(gè)按鍵上串聯(lián)一個(gè)二極管,如下圖所示,也可以換成510Ω大小的電阻。
自己編寫的驅(qū)動(dòng)程序(C51)
/*********************************************************************************** 程序名: TM1638驅(qū)動(dòng)程序* 作者: DaveoCKII* 日期: 2020.2.29* 版本: STC12C5A60S2**********************************************************************************/#ifndef _TM1638_H_ #define _TM1638_H_#include <STC12C5A60S3.H> // 自己修改過(guò)的STC12C5A60S2的頭文件,為了區(qū)分原頭文件改名S3 //------------------------------------定義列表------------------------------------// sbit STB = P1^1; // 片選線 sbit CLK = P1^2; // 時(shí)鐘線 sbit DIO = P1^3; // 數(shù)據(jù)線 unsigned char led_buffer[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // 顯示數(shù)據(jù)緩沖區(qū) unsigned char LED_CC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 共陰LED顯示數(shù)據(jù) '0~F' unsigned char LED_CA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 共陽(yáng)LED顯示數(shù)據(jù) '0~F' unsigned char x[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; // 數(shù)據(jù)轉(zhuǎn)換中用來(lái)提取各位的數(shù)據(jù) //------------------------------------函數(shù)列表------------------------------------//void TM1638_LEDCC(unsigned char LEDnums); // TM1638 LED顯示(共陰)void TM1638_LEDCA(unsigned char LEDnums); // TM1638 LED顯示(共陽(yáng))void TM1638_Write(unsigned char DATA); // TM1638 寫數(shù)據(jù)函數(shù)void TM1638_WriteCOM(unsigned char cmd); // TM1638 寫命令函數(shù)unsigned char TM1638_Read(void); // TM1638 讀數(shù)據(jù)函數(shù)unsigned char TM1638_ReadKey(void); // TM1638 讀鍵函數(shù)//------------------------------------函數(shù)內(nèi)容------------------------------------//void TM1638_Write(unsigned char DATA) {unsigned char i;for(i=0;i<8;i++) // 1Byte 8位數(shù)據(jù){CLK=0; // 拉低時(shí)鐘線DIO=DATA&0X01; // 發(fā)送數(shù)據(jù)DATA>>=1; // 數(shù)據(jù)格式:低位在前CLK=1; // 拉高時(shí)鐘線,寫入數(shù)據(jù)} }void TM1638_WriteCOM(unsigned char cmd) {STB=0; // 拉低片選線TM1638_Write(cmd); // 寫命令STB=1; // 拉高片選線 }unsigned char TM1638_Read(void) {unsigned char i,Data=0;DIO=1; // 初始化數(shù)據(jù)線for(i=0;i<8;i++) {Data>>=1; // 數(shù)據(jù)格式:低位在前CLK=0;if(DIO)Data|=0x80;CLK=1;}return Data; }unsigned char TM1638_ReadKey(void) {unsigned char c[4]; // 4Byte數(shù)據(jù)儲(chǔ)存unsigned char i=999; // 先用作延時(shí)unsigned char key_value=0; STB=0; // 拉低片選線,開(kāi)始讀鍵值TM1638_Write(0x42); // 寫'讀數(shù)據(jù)'命令while(i--) // 等待準(zhǔn)備完畢for(i=0;i<4;i++) // 讀取4個(gè)Bytec[i]=TM1638_Read(); STB=1; // 拉高片選線,讀鍵值結(jié)束// 8鍵 col:K3 row:KS1~KS8if(c[0]==0x01) key_value=1;if(c[0]==0x10) key_value=5;if(c[1]==0x01) key_value=2;if(c[1]==0x10) key_value=6;if(c[2]==0x01) key_value=3;if(c[2]==0x10) key_value=7;if(c[3]==0x01) key_value=4;if(c[3]==0x10) key_value=8;return (key_value); // 返回鍵值 }void TM1638_LEDCC(unsigned char LEDnums) {unsigned char i; TM1638_WriteCOM(0x40); // 設(shè)置地址自增STB=0; // 拉低片選線,開(kāi)始寫數(shù)據(jù)TM1638_Write(0xc0); // 寫首地址for(i=0; i<LEDnums; i++) { // 寫顯示數(shù)據(jù)TM1638_Write(ledb[i]); TM1638_Write(ledb[i+8]);}for(i=LEDnums; i<8; i++) { TM1638_Write(0); TM1638_Write(0); } STB=1; // 拉高片選線,結(jié)束寫數(shù)據(jù) }void TM1638_LEDCA(unsigned char LEDnums) {unsigned char i;unsigned char datas[16];// 數(shù)據(jù)轉(zhuǎn)換for(i=0; i<8; i++){datas[i]=(ledb[0]&x[i])+(ledb[1]&x[i])+(ledb[2]&x[i])+(ledb[3]&x[i])+(ledb[4]&x[i])+(ledb[5]&x[i])+(ledb[6]&x[i])+(ledb[7]&x[i]);}if(LEDnums>8){for(i=0; i<8; i++)datas[i+8]=(ledb[8]&x[i])+(ledb[9]&x[i]);}else {for(i=0; i<8; i++)datas[i]=0x00;}TM1638_WriteCOM(0x40); // 設(shè)置地址自增STB=0; // 拉低片選線,開(kāi)始寫數(shù)據(jù)TM1638_Write(0xc0); // 寫首地址for(i=0; i<LEDnums; i++) { // 寫顯示數(shù)據(jù)TM1638_Write(datas[i]); TM1638_Write(datas[i+8]);}for(i=LEDnums; i<8; i++) {TM1638_Write(0); TM1638_Write(0); }STB=1; // 拉低片選線,結(jié)束寫數(shù)據(jù) }//--------------------------------------------------------------------------------//#endif??DaveoCKII |
總結(jié)
以上是生活随笔為你收集整理的TM1638芯片 LED数码管驱动器 详细介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为HCNP老学员分享学习的几个境界
- 下一篇: 最短剩余时间调度算法_LRTF:最长剩余