【雕爺學(xué)編程】Arduino動手做(102)---TM1638按鍵數(shù)碼管

37款傳感器與執(zhí)行器的提法,在網(wǎng)絡(luò)上廣泛流傳,其實(shí)Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒于本人手頭積累了一些傳感器和執(zhí)行器模塊,依照實(shí)踐出真知(一定要動手做)的理念,以學(xué)習(xí)和交流為目的,這里準(zhǔn)備逐一動手嘗試系列實(shí)驗,不管成功(程序走通)與否,都會記錄下來---小小的進(jìn)步或是搞不掂的問題,希望能夠拋磚引玉。

【Arduino】168種傳感器模塊系列實(shí)驗(資料代碼+仿真編程+圖形編程)
實(shí)驗一百零二:TM1638按鍵數(shù)碼管LED顯示模組8位數(shù)碼管\LED\按鍵智控模塊

0.jpg

TM1638
是一種帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動控制專用IC,內(nèi)部集成有MCU數(shù)字接口、數(shù)據(jù)鎖存器、LED驅(qū)動、鍵盤掃描等電路。本模塊質(zhì)量可靠、穩(wěn)定性好、抗干擾能力強(qiáng)。主要應(yīng)用于冰箱、空調(diào) 、家庭影院等產(chǎn)品的高段位顯示屏驅(qū)動。

01-1.jpg

TM1638
1、采用CMOS 工藝
2、顯示模式 10段×8 位
3、鍵掃描(8×3bit)
4、輝度調(diào)節(jié)電路(占空比8 級可調(diào))
5、串行接口(CLK,STB,DIO)
6、振蕩方式:RC 振蕩
7、內(nèi)置上電復(fù)位電路
8、封裝形式:SOP28

02 (1).jpg
02.jpg
02-1.jpg
02-2.jpg
02-3.jpg
02-4.jpg
02-5.jpg

模塊功能介紹,包括以下資源:

1、8個按鍵,

2、8個LED

3、8位數(shù)碼管,共陰極LED數(shù)碼管;

4、可以和STC等單片機(jī)直接連接;

5、開始實(shí)驗ardiuno驅(qū)動程序

06 (1).jpg

模塊電原理圖

05.jpg
05-.jpg
05--.jpg

該模塊所用芯片為TM1638,集合了單片機(jī)常見外圍電路,最大特點(diǎn)是只需占用單片機(jī)三個IO口即可驅(qū)動,掃描顯示和按鍵掃描不需要單片機(jī)干預(yù),只需要讀寫相關(guān)寄存器送顯示數(shù)據(jù)或檢測按鍵,節(jié)省MCU資源。試想下,我們平時使用單片機(jī)外接8個LED,8位數(shù)碼管,8個按鍵這需占用多少個IO口,遠(yuǎn)不止3個IO口吧,但用這個模塊就可以實(shí)現(xiàn)。經(jīng)實(shí)際應(yīng)用,按鍵靈敏顯示效果良好。

接線方法:
VCC GND接5V電源, STB CLK DIO接單片機(jī)IO口。


09 (1).jpg
10.jpg

實(shí)驗程序一:TM1638模塊的演示文件庫(LED和鍵)

(1)Arduino參考開源代碼

/*

【Arduino】168種傳感器模塊系列實(shí)驗(資料代碼+仿真編程+圖形編程)

實(shí)驗一百零二: TM1638按鍵數(shù)碼管LED顯示模組8位數(shù)碼管\LED\按鍵智控模塊

1、安裝庫:IDE-工具-管理庫-搜索TM1638plus-安裝

2、項目:TM1638模塊的演示文件庫(LED和鍵)

3、接腳:

VCC  → 5V

GND → GND

STROBE_TM  D4

CLOCK_TM  D6

DIO_TM    D7

*/



#include <TM1638plus.h>

// GPIO I/O pins on the Arduino connected to strobe, clock, data,

//pick on any I/O you want.

#define  STROBE_TM 4

#define  CLOCK_TM 6

#define  DIO_TM 7

//Constructor object

TM1638plus tm(STROBE_TM, CLOCK_TM , DIO_TM);

void setup() {

  // Test 0 reset test

  tm.setLED(0, 1);

  delay(1000);

  tm.reset();

  

  // Test 1  Brightness and reset

  for (uint8_t brightness = 0; brightness < 8; brightness++)

  {

      tm.brightness(brightness);

      tm.displayText("00000000");

      delay(1500);

  }

  tm.reset();

  

  // restore default brightness

  tm.brightness(0x02);

  

  //Test 2 ASCII display 2.348

  

  tm.displayASCIIwDot(0, '2');

  tm.displayASCII(1, '3');

  tm.displayASCII(2, '4');

  tm.displayASCII(3, '8');

  delay(2000);

  

  //TEST 3 single segment

  //In this case  segment g (middle dash) of digit position 7

  tm.display7Seg(7,0b01000000);

  delay(2000);

  

  // Test 4 Hex digits.

  tm.displayHex(0, 1);

  tm.displayHex(1, 2);

  tm.displayHex(2, 3);

  tm.displayHex(3, 4);

  tm.displayHex(4, 5);

  tm.displayHex(5, 6);

  tm.displayHex(6, 7);

  tm.displayHex(7, 8);

  delay(2000);

  tm.displayHex(0, 8);

  tm.displayHex(1, 9);

  tm.displayHex(2, 10);

  tm.displayHex(3, 11);

  tm.displayHex(4, 12);

  tm.displayHex(5, 13);

  tm.displayHex(6, 14);

  tm.displayHex(7, 15);

  delay(2000);

  // Test 5 TEXT  with dec point

  // abcdefgh with decimal point for c and d

  tm.displayText("abc.d.efgh");

  delay(3000);

  

  // Test6  TEXT + ASCII combo

  // ADC=2.548

  char text1[]= "ADC=.";

  tm.displayText(text1);

  tm.displayASCIIwDot(4, '2');

  tm.displayASCII(5, '5');

  tm.displayASCII(6, '4');

  tm.displayASCII(7, '8');

  delay(2000);

  

  //Test 7 buttons and LED test

  tm.displayText("EAGLER8 ");

}

void loop() {

  uint8_t buttons = tm.readButtons();

  doLEDs(buttons);

}

// scans the individual bits of value

void doLEDs(uint8_t value) {

  for (uint8_t position = 0; position < 8; position++) {

  tm.setLED(position, value & 1);

  value = value >> 1;

  }

}

(2)實(shí)驗場景圖


11.jpg

實(shí)驗程序二:自鎖LED,按鍵計數(shù)器

(1)Arduino參考開源代碼

/*

【Arduino】168種傳感器模塊系列實(shí)驗(資料代碼+仿真編程+圖形編程)

實(shí)驗一百零二: TM1638按鍵數(shù)碼管LED顯示模組8位數(shù)碼管\LED\按鍵智控模塊

1、安裝庫:IDE-工具-管理庫-搜索TM1638-安裝

2、項目:自鎖LED,按鍵計數(shù)器

3、接腳:

VCC  → 5V

GND → GND

STROBE_TM  D4

CLOCK_TM  D6

DIO_TM    D7



*/

#define    DATA_COMMAND    0X40

#define    DISP_COMMAND    0x80

#define    ADDR_COMMAND    0XC0

//TM1638模塊引腳定義

int DIO = 7;

int CLK = 6;

int STB = 4; //這里定義了那三個腳

//共陰數(shù)碼管顯示代碼

unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

                  0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned char num[8];        //各個數(shù)碼管顯示的值              

void setup ()

{

  pinMode(STB,OUTPUT);

  pinMode(CLK,OUTPUT);

  pinMode(DIO,OUTPUT); //讓三個腳都是輸出狀態(tài)

}

void loop()

  {

    unsigned char i;

    init_TM1638();                      //初始化TM1638

    for(i=0;i<8;i++)

    Write_DATA(i<<1,tab[0]);              //初始化寄存器    

    while(1)

    {

        i=Read_key();                  //讀按鍵值

        if(i<8)

        {

          num++;

          while(i==Read_key());              //等待按鍵釋放

          if(num>15)

          num=0;

          Write_DATA(i*2,tab[num]);

          Write_allLED(1<<i);

        }

    }

}

void TM1638_Write(unsigned char    DATA)            //寫數(shù)據(jù)函數(shù)

{

    unsigned char i;

      pinMode(DIO,OUTPUT);

    for(i=0;i<8;i++)

    {

        digitalWrite(CLK,LOW);

        if(DATA&0X01)

          digitalWrite(DIO,HIGH);

        else

          digitalWrite(DIO,LOW);

        DATA>>=1;

        digitalWrite(CLK,HIGH);

    }

}

unsigned char TM1638_Read(void)                    //讀數(shù)據(jù)函數(shù)

{

    unsigned char i;

    unsigned char temp=0;;    

      pinMode(DIO,INPUT);//設(shè)置為輸入

    for(i=0;i<8;i++)

    {

          temp>>=1;

        digitalWrite(CLK,LOW);

          if(digitalRead(DIO)==HIGH)

          temp|=0x80;

        digitalWrite(CLK,HIGH);

          

    }

    return temp;

}

void Write_COM(unsigned char cmd)        //發(fā)送命令字

{

      digitalWrite(STB,LOW);

    TM1638_Write(cmd);

      digitalWrite(STB,HIGH);

}

unsigned char Read_key(void)

{

    unsigned char c[4],i,key_value=0;

      digitalWrite(STB,LOW);

    TM1638_Write(0x42);                //讀鍵掃數(shù)據(jù) 命令

    for(i=0;i<4;i++)        

      {

        c=TM1638_Read();

      }

      digitalWrite(STB,HIGH);                            //4個字節(jié)數(shù)據(jù)合成一個字節(jié)

    for(i=0;i<4;i++)

    {

        key_value|=c<<i;

      }    

      for(i=0;i<8;i++)

      {

        if((0x01<<i)==key_value)

        break;

      }

    return i;

}

void Write_DATA(unsigned char add,unsigned char DATA)        //指定地址寫入數(shù)據(jù)

{

    Write_COM(0x44);

      digitalWrite(STB,LOW);

    TM1638_Write(0xc0|add);

    TM1638_Write(DATA);

      digitalWrite(STB,HIGH);

}

void Write_allLED(unsigned char LED_flag)                    //控制全部LED函數(shù),LED_flag表示各個LED狀態(tài)

{

    unsigned char i;

    for(i=0;i<8;i++)

    {

        if(LED_flag&(1<<i))

        Write_DATA(2*i+1,1);

        else

        Write_DATA(2*i+1,0);

      }

}

//TM1638初始化函數(shù)

void init_TM1638(void)

{

    unsigned char i;

    Write_COM(0x8b);    //亮度 (0x88-0x8f)8級亮度可調(diào)

    Write_COM(0x40);    //采用地址自動加1

      digitalWrite(STB,LOW);                //

    TM1638_Write(0xc0);  //設(shè)置起始地址

    for(i=0;i<16;i++)      //傳送16個字節(jié)的數(shù)據(jù)

      TM1638_Write(0x00);

      digitalWrite(STB,HIGH);

}

(2)實(shí)驗場景圖


12.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容