本文地址:https://www.cnblogs.com/jqdy/p/14262485.html
米字數碼管可以顯示數字和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:片選線
需要注意的是,TM1629A的CLK的時鍾周期較慢(大於500ns),要根據MCU的頻率測試一下,如果不能滿足要求,要加入適當的延時。
特別需要注意的是時序圖中的tCLK-STB和PWSTB,都要求最小1us。
最好的辦法是在DIO、CLK、STB變化的前后都插入足夠長時間的延時,整個調通后再優化時間。
3.1 初始化工作
首先進行初始化工作,主要是定義功能腳的工作模式。
1 /**************************************************** 2 *說明:初始化TM1629A 3 *備注:io.h中定義了 STB P3^2,CLK P3^3,DIO P5^5 4 ****************************************************/ 5 void TM1629A_Init(void) 6 { 7 /*GPIO初始化,均為開漏輸出*/ 8 SET_BIT(P3M1, 2); //宏功能:令P3M1的BIT2=1 9 SET_BIT(P3M0, 2); 10 SET_BIT(P3M1, 3); 11 SET_BIT(P3M0, 3); 12 SET_BIT(P5M1, 5); 13 SET_BIT(P5M0, 5); 14 /*STB、CLK賦初值*/ 15 STB = 1; 16 CLK = 1; 17 }
3.2 基本的寫入函數
實際工作頻率設定的是5.5296MHz。
#include <stc8g.h> #include <intrins.h>
sbit STB = P3^2; sbit CLK = P3^3; sbit DIO = P5^5; /**************************************************** *說明:TM1629A寫操作驅動函數 ****************************************************/ void wrt(unsigned char dt) { unsigned char i = 8; do{ CLK = 0; dt >>= 1; DIO = CY; CLK = 1;
_nop_();
_nop_(); }while(--i); }
3.3 顯示函數
1 /**************************************************** 2 *說明:顯示每個數碼管的內容 3 *參數:ch為指向顯示信息的第一個地址指針 4 * bright為亮度,取值范圍0~7,越大越亮 5 *備注:參考手冊中”地址增加模式“的信息,以及時序圖 6 *1. 提供的字符串長度要與實際數碼管位數一致 7 *2. ch指針指向連續幾個地址內容為123456,在數碼管上顯示為654321
8 ****************************************************/ 9 void TM1629A_Display(unsigned char *ch, unsigned char brightness) 10 { 11 unsigned char tem; 12 STB = 0; 13 wrt(COMMAND_WRITE_DDRM_AND_ADDRESS_INCREASE); // 寫顯存命令,地址自動加1 14 STB = 1; 15 delay1us();//STB選通脈沖寬度大於1us 16 STB = 0; 17 wrt(COMMAND_ADDRESS); // 設置顯示地址命令 18 do{ 19 tem = *ch; 20 if(tem >= '0' && tem <= '9') //為數字 21 { 22 tem -= '0'; 23 tem += tem; //15段碼一個字符占用兩個字節 24 wrt(number[tem]); //將數字轉化成數組位置 25 wrt(number[tem + 1]); //這是第二個字節 26 continue; 27 } 28 else if(tem >= 'A' && tem <= 'Z') //為大寫字母 29 { 30 tem -= 'A'; 31 tem += tem; 32 wrt(charactor[tem]); //將大寫字母轉化成數組位置 33 wrt(charactor[tem + 1]); 34 continue; 35 } 36 else if(tem >= 'a' && tem <= 'z') //為小寫字母 37 { 38 tem -= 'a'; 39 tem += tem; 40 wrt(charactor[tem]); //將小寫字母轉化成數組位置 41 wrt(charactor[tem + 1]); 42 continue; 43 } 44 }while(*(++ch) != 0); 45 STB = 1; 46 delay1us(); 47 STB = 0; 48 wrt(COMMAND_DISPLAY_ON | brightness); 49 STB = 1; 50 }
STC8G工作在5.5296MHz時,延時函數delay1us()僅為一個空函數。
/**************************************************** *說明:5.5296MHz時延時1us ****************************************************/ static void delay1us(void) { }
3.4 用到的宏及字模
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 #define COMMAND_WRITE_DDRM_AND_ADDRESS_INCREASE 0x40 15 #define COMMAND_WRITE_DDRM_AND_ADDRESS_KEEPED 0x44 16 #define COMMAND_DISPLAY_ON 0x88 17 #define COMMAND_DISPLAY_OFF 0x80 18 #define COMMAND_ADDRESS 0xC0 //地址從00H~0FH共16個
3.5 實際效果
TM1629A電源電壓=3.3V,亮度級別等於0。