使用TM1629A晶片驅動米字數碼管
阿新 • • 發佈:2021-01-11
米字數碼管可以顯示數字和26個英文字母,應用範圍比8字數碼管更廣泛一些。
市面上常見的米字數碼管有三種,一種是15段的,另一種是16段,還有一種是17段的。TM1629A可以驅動15和16段的數碼管。
一、TM1629A主要引數
- 共陰數碼管:16 段 × 8 位
- 共陽數碼管:8 段 × 16 位
- 8級輝度調節
- 序列介面(CLK,STB,DIO)
- 邏輯電源電壓範圍:-0.5~7.0V
- 正常工作電壓電壓:5.0V
二、電路設計
手冊給出了兩個驅動8位數碼管的電路,並未給出驅動米字數碼管的電路。參照這兩個電路設計了驅動15位紅色米字管的電路。
經過試驗,電源電壓完全可以使用3.3V,亮度非常高,甚至曾燒壞過一個筆畫,也不知是不是數碼管的質量問題。
三、驅動程式
該晶片有3個控制線,分別是:
- DIO:資料輸入線
- CLK:時鐘輸入線
- STB:片選線
3.1 基本的寫入函式
需要注意的是,TM1629A的CLK的時鐘週期較慢(大於500ns),要根據MCU的頻率測試一下,如果不能滿足要求,要加入適當的延時。
#include <stc8g.h> sbit STB = P3^2; sbit CLK = P3^3; sbit DIO = P5^5; /**************************************************** *說明:TM1629A寫操作驅動函式 ****************************************************/ void wrt(unsigned char dt) { unsigned char i = 8; STB = 0; do{ CLK = 0; dt >>= 1; DIO = CY; CLK = 1; }while(--i); }
3.2 顯示函式
我用的是6位米字管
1 unsigned char code number[] = 2 { 3 0x3f, 0x00, 0x06, 0x00, 0xdb, 0x00, 0xcf, 0x00, 0xe6, 0x00, 4 0xed, 0x00, 0xfd, 0x00, 0x07, 0x00, 0xff, 0x00, 0xef, 0x00 5 }; //0~9,每個佔連續兩個,共陽取反 6 unsigned char code charactor[] = 7 { 8 0xf7, 0x00, 0xfc, 0x00, 0x39, 0x00, 0x0f, 0x12, 0xf9, 0x00, 0xf1, 0x00, 0xbd, 0x00, 9 0xf6, 0x00, 0x09, 0x12, 0x1e, 0x00, 0x70, 0x0c, 0x38, 0x00, 0x36, 0x15, 0x36, 0x09, 10 0xdc, 0x00, 0xf3, 0x00, 0x3f, 0x08, 0xf3, 0x08, 0x8d, 0x02, 0x01, 0x12, 0x3e, 0x00, 11 0x30, 0x24, 0x36, 0x2a, 0x00, 0x2d, 0x00, 0x15, 0x09, 0x24 12 }; //a~z,每個佔連續兩個,共陽取反 13 14 /*TM1629A指令巨集定義---------------開始*/ 15 #define COMMAND_WRITE_DDRM_AND_ADDRESS_INCREASE 0x40 16 #define COMMAND_WRITE_DDRM_AND_ADDRESS_KEEPED 0x44 17 #define COMMAND_BRIGHTNESS_BASE 0x80 18 #define COMMAND_DISPLAY_ON 0x88 19 #define COMMAND_DISPLAY_OFF 0x80 20 #define COMMAND_ADDRESS 0xC0 //地址從00H~0FH共16個 21 /*TM1629A指令巨集定義---------------結束*/ 22 23 /**************************************************** 24 *說明:顯示每個數碼管的內容 25 *引數:ch為指向顯示資訊的第一個地址指標 26 * bright為亮度,取值範圍0~7,越大越亮 27 *備註: 28 *1. 提供的字串長度要與實際數碼管位數一致 29 *2. 低位優先,即ch指標指向連續幾個地址內容為123456,在數碼管上顯示為654321 30 ****************************************************/ 31 void TM1629A_Display(unsigned char *ch, unsigned char brightness) 32 { 33 unsigned char tem; 34 DIO = 1; 35 CLK = 1; 36 STB = 1; 37 wrt(COMMAND_WRITE_DDRM_AND_ADDRESS_INCREASE); // 寫視訊記憶體命令,地址自動加1 38 STB = 1; 39 wrt(COMMAND_ADDRESS); // 設定顯示地址命令 40 do{ 41 tem = *ch; 42 if(tem >= '0' && tem <= '9') //為數字 43 { 44 tem -= '0'; 45 tem += tem; //15段碼一個字元佔用兩個位元組 46 wrt(number[tem]); //將數字轉化成陣列位置 47 wrt(number[tem + 1]); //這是第二個位元組 48 continue; 49 }else if(tem >= 'A' && tem <= 'Z') //為大寫字母 50 { 51 tem -= 'A'; 52 tem += tem; 53 wrt(charactor[tem]); //將大寫字母轉化成陣列位置 54 wrt(charactor[tem + 1]); 55 continue; 56 }else if(tem >= 'a' && tem <= 'z') //為小寫字母 57 { 58 tem -= 'a'; 59 tem += tem; 60 wrt(charactor[tem]); //將小寫字母轉化成陣列位置 61 wrt(charactor[tem + 1]); 62 continue; 63 } 64 else//不顯示 65 { 66 wrt(CLEAR); 67 wrt(CLEAR); 68 } 69 }while(*(++ch) != 0); 70 STB = 1; 71 wrt(COMMAND_BRIGHTNESS_BASE | brightness); 72 STB = 1; 73 }
TM1629A的操作非常簡單,驅動高位數碼管時非常實用。