標(biāo)題: 單片機(jī)驅(qū)動(dòng)LED數(shù)碼管,按鍵TM1638芯片學(xué)習(xí)心得 [打印本頁]

作者: xmfjfhcel    時(shí)間: 2020-2-18 17:11
標(biāo)題: 單片機(jī)驅(qū)動(dòng)LED數(shù)碼管,按鍵TM1638芯片學(xué)習(xí)心得
TM1638是帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用電路,內(nèi)部集成有MCU 數(shù)字接口、數(shù)據(jù)鎖存器、LED 高壓驅(qū)動(dòng)、鍵盤掃描等電路。主要應(yīng)用于冰箱、空調(diào) 、家庭影院等產(chǎn)品的高段位顯示屏驅(qū)動(dòng)。
因?yàn)椴竭M(jìn)電機(jī)實(shí)驗(yàn)需要用到按鍵,但家有嬰兒,沒用松香鉻鐵之類的(技術(shù)早就還給老師了,也沒有條件),只好在網(wǎng)上找,找到一個(gè)由TM1638做成的成品,感覺做工還不錯(cuò),就買了一個(gè),但其帶的程序一時(shí)沒看懂,花了些時(shí)間進(jìn)行學(xué)習(xí),覺得好精妙,就想分享一下。
絕不是給別人打廣告,這程序確實(shí)我理解了很久。
附件是它完整的程序。

調(diào)用實(shí)現(xiàn)程序主要是顯示與按鍵值獲取。
1.顯示:
為什么是0xc0|add呢?
因?yàn)樾酒f明有:高位都是11, 就是C了。

void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址寫入數(shù)據(jù)
{
        Write_COM(0x44);
        STB=0;
        TM1638_Write(0xc0|add);
        TM1638_Write(DATA);
        STB=1;
}
2.按鍵獲取:
注意這兒是從低位開始讀的, 理解 的時(shí)候把B0~B7反過來理解就更好理解下面這個(gè)按鍵程序。在這兒花了很多時(shí)間來想這個(gè)。得到的 i 值就是按的第幾個(gè)鍵。這兒真的這個(gè)程序?qū)懙锰盍,這個(gè)大神絕對(duì)的高手。


單片機(jī)程序
  1. unsigned char Read_key(void)
  2. {
  3.         unsigned char c[4],i,key_value=0;
  4.         STB=0;
  5.         TM1638_Write(0x42);                           //讀鍵掃數(shù)據(jù) 命令
  6.         for(i=0;i<4;i++)               
  7.                 c[i][i]=TM1638_Read();
  8.         STB=1;                                                   //4個(gè)字節(jié)數(shù)據(jù)合成一個(gè)字節(jié)
  9.         for(i=0;i<4;i++)
  10.                 key_value|=c[i][i]<<i;
  11.         for(i=0;i<8;i++)
  12.                 if((0x01<<i)==key_value)
  13.                         break;
  14.         return i;
  15. }
復(fù)制代碼

TM1638測(cè)試程序C51.rar

27.17 KB, 下載次數(shù): 113, 下載積分: 黑幣 -5

tm1638芯片數(shù)據(jù)手冊(cè).pdf

873.68 KB, 下載次數(shù): 42, 下載積分: 黑幣 -5


作者: xmfjfhcel    時(shí)間: 2020-2-18 21:24
今晚上做了實(shí)驗(yàn),再對(duì)比程序。。

1.jpg (187.44 KB, 下載次數(shù): 66)

1.jpg

press1.jpg (177.72 KB, 下載次數(shù): 55)

press1.jpg

press2.jpg (180.37 KB, 下載次數(shù): 61)

press2.jpg

press3.jpg (179.35 KB, 下載次數(shù): 66)

press3.jpg

press4.jpg (183.43 KB, 下載次數(shù): 66)

press4.jpg

實(shí)物.jpg (130.01 KB, 下載次數(shù): 60)

實(shí)物.jpg

作者: xmfjfhcel    時(shí)間: 2020-2-18 21:31
但是這樣的顯示執(zhí)行結(jié)果不是我想要的。明天再研究改一下程序。我只需要按一個(gè)鍵做開關(guān),顯示1或0就可以了,別的鍵都不需要改變。或者有哪個(gè)大神幫我改一下。
作者: xmfjfhcel    時(shí)間: 2020-2-18 22:54
最簡(jiǎn)單的改動(dòng),現(xiàn)在實(shí)現(xiàn)了只顯示1或0狀態(tài)。只是這樣的話理論上所有的按鍵都可以控制電機(jī)開啟了。。。。
                        while(Read_key()==i);                       //等待按鍵釋放
//                        if(num[i]>15)                                           //原程序是按一下鍵,自動(dòng)計(jì)數(shù)加1.可以加到15
                       
                        if(num[i]>1)                                           //改為實(shí)現(xiàn)了只顯示1與0(加到1,就值改為0),1電機(jī)啟動(dòng),0電機(jī)斷開
                        num[i]=0;
                        Write_DATA(i*2,tab[num[i]]);
                        Write_allLED(1<<i);
                }
               
               
                if(num[i]==1)
                        {
                          //電機(jī)開啟程序
                        }
作者: xmfjfhcel    時(shí)間: 2020-2-19 22:43
    今晚把TM1368.H加入步進(jìn)電機(jī)程序中,測(cè)試通過了對(duì)步進(jìn)電機(jī)開啟與停止的控制,這兒取的num[0]=1來控制,測(cè)試發(fā)現(xiàn)是左邊第一個(gè)鍵,
對(duì)這個(gè)模塊的整個(gè)測(cè)試過程就我這兒就結(jié)束了。

但是后來又看了這個(gè)Read_key()程序, 我把key_value|=c[ i]<<i; 這句改為key_value|=c[ i](我的理解是應(yīng)該這樣才科學(xué))[,發(fā)現(xiàn)結(jié)果顯示就不一樣了:按下左邊4個(gè)鍵中任何一個(gè),都是只有左邊那個(gè)LED的最高位進(jìn)行0或1的變化,后面的LED都是顯示0無變化;按下右邊4個(gè)鍵中任何一個(gè),都是中間那個(gè)LED(就是右邊4位數(shù)碼管的高位)進(jìn)行0或1的變化,其它的LED都是顯示0無變化。 求哪位大俠解惑啊。

  1. void main()
  2. {
  3.         unsigned char i;
  4.         DIANJICLK=0;
  5.         ENA=1;                                 //ENA-接的控制口,但一樣的,如果ENA=0,步進(jìn)電機(jī)卡起
  6.         DIR=1;                                 //DIR-接的控制口。初始化電機(jī)        低電平有效,測(cè)試,DIR=1,是正轉(zhuǎn), DIR=0反轉(zhuǎn)。

  7.         
  8.         /******調(diào)用TM1638按鍵顯示模塊********/
  9.         init_TM1638();                                   //初始化TM1638
  10.         for(i=0;i<8;i++)
  11.         Write_DATA(i<<1,tab[0]);                       //初始化寄存器
  12.         /******調(diào)用TM1638按鍵顯示模塊********/
  13.         

  14.         P2=0X00;
  15.         delay(2000);                            //延時(shí)等待系統(tǒng)穩(wěn)定。
  16.         P2=0XFF;
  17.         
  18.         Init_time();                 //初始化定時(shí)器        
  19.         
  20.         while(1)
  21.         {
  22.         /******調(diào)用TM1638按鍵顯示模塊得到返回值********/
  23.            
  24.                    i=Read_key();                          //讀按鍵值


  25.                 if(i<8)
  26.                 {
  27.                         num[i]++;
  28.                         while(Read_key()==i);                       //等待按鍵釋放
  29. //                        if(num[i]>15)                                           //原程序是按一下鍵,自動(dòng)計(jì)數(shù)加1.
  30.                         
  31.                         if(num[i]>1)                                           //改為只顯示1與0,1電機(jī)啟動(dòng),0電機(jī)斷開
  32.                         num[i]=0;
  33.                         Write_DATA(i*2,tab[num[i]]);
  34.                         Write_allLED(1<<i);
  35.                 }
  36.                
  37.                
  38.                 if(num[0]==1)
  39.                         {
  40.                           //電機(jī)開啟程序
  41.                         Run_Status=~Run_Status;
  42.                         if(Run_Status)
  43.                         {
  44.                                 count=counttemp;
  45.                                 TR0=1;                       //開啟中斷產(chǎn)生脈沖信號(hào)
  46.                                  EA=1;
  47.                                 
  48.                         }
  49.                         else
  50.                         {
  51.                                 counttemp=count;
  52.                                     TR0=0;                       //關(guān)閉中斷停止脈沖信號(hào)
  53.                                    EA=0;
  54.                         }
  55.                         }

  56. //                Key_scan();
  57.          
  58.          }        
  59. }
復(fù)制代碼


控制步進(jìn)電機(jī)開關(guān).jpg (165.27 KB, 下載次數(shù): 76)

控制步進(jìn)電機(jī)開關(guān).jpg

作者: ziyueboy    時(shí)間: 2020-3-19 16:53

   //------------下面是讀按鍵和鍵值分離程序------------

unsigned char Read_key(void)
{
        unsigned char c[4],i,key_value=0;
        STB=0;
        TM1638_Write(0x42);
        Delay10us();
        for(i=0;i<4;i++)
                c[i]=TM1638_Read();
        STB=1;                                       

            //K1組合8鍵
        if(c[0]==0x04) key_value=1;           //KS1K1
        if(c[0]==0x40) key_value=2;           //KS2K1
        if(c[1]==0x04) key_value=3;           //KS3K1
        if(c[1]==0x40) key_value=4;           //KS4K1
        if(c[2]==0x04) key_value=5;           //KS5K1
        if(c[2]==0x40) key_value=6;           //KS6K1
        if(c[3]==0x04) key_value=7;           //KS7K1
        if(c[3]==0x40) key_value=8;           //KS8K1
          //K2組合8鍵
        if(c[0]==0x02) key_value=9;           //KS1K2
        if(c[0]==0x20) key_value=10;   //KS2K2
        if(c[1]==0x02) key_value=11;   //KS3K2
        if(c[1]==0x20) key_value=12;   //KS4K2
        if(c[2]==0x02) key_value=13;   //KS5K2
        if(c[2]==0x20) key_value=14;   //KS6K2
        if(c[3]==0x02) key_value=15;   //KS7K2
        if(c[3]==0x20) key_value=16;   //KS8K2
          //K3組合8鍵
        if(c[0]==0x01) key_value=17;   //KS1K3
        if(c[0]==0x10) key_value=18;   //KS2K3
        if(c[1]==0x01) key_value=19;   //KS3K3
        if(c[1]==0x10) key_value=20;   //KS4K3
        if(c[2]==0x01) key_value=21;   //KS5K3
        if(c[2]==0x10) key_value=22;   //KS6K3
        if(c[3]==0x01) key_value=23;   //KS7K3
        if(c[3]==0x10) key_value=24;   //KS8K3

        return key_value;
}



作者: ziyueboy    時(shí)間: 2020-3-19 16:54
這個(gè)模塊自帶程序?qū)嶋H使用不方便,可以按照上面的改,主程序按鍵如何操作很簡(jiǎn)單了!判斷鍵值就行




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1