1. 程式人生 > 實用技巧 >使用TM1629A晶片驅動米字數碼管

使用TM1629A晶片驅動米字數碼管

米字數碼管可以顯示數字和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的操作非常簡單,驅動高位數碼管時非常實用。