久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7628|回復: 6
打印 上一主題 下一主題
收起左側

單片機驅動LED數碼管,按鍵TM1638芯片學習心得

[復制鏈接]
跳轉到指定樓層
樓主
TM1638是帶鍵盤掃描接口的LED(發光二極管顯示器)驅動控制專用電路,內部集成有MCU 數字接口、數據鎖存器、LED 高壓驅動、鍵盤掃描等電路。主要應用于冰箱、空調 、家庭影院等產品的高段位顯示屏驅動。
因為步進電機實驗需要用到按鍵,但家有嬰兒,沒用松香鉻鐵之類的(技術早就還給老師了,也沒有條件),只好在網上找,找到一個由TM1638做成的成品,感覺做工還不錯,就買了一個,但其帶的程序一時沒看懂,花了些時間進行學習,覺得好精妙,就想分享一下。
絕不是給別人打廣告,這程序確實我理解了很久。
附件是它完整的程序。

調用實現程序主要是顯示與按鍵值獲取。
1.顯示:
為什么是0xc0|add呢?
因為芯片說明有:高位都是11, 就是C了。

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


單片機程序
  1. unsigned char Read_key(void)
  2. {
  3.         unsigned char c[4],i,key_value=0;
  4.         STB=0;
  5.         TM1638_Write(0x42);                           //讀鍵掃數據 命令
  6.         for(i=0;i<4;i++)               
  7.                 c[i][i]=TM1638_Read();
  8.         STB=1;                                                   //4個字節數據合成一個字節
  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. }
復制代碼

TM1638測試程序C51.rar

27.17 KB, 下載次數: 113, 下載積分: 黑幣 -5

tm1638芯片數據手冊.pdf

873.68 KB, 下載次數: 42, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:626079 發表于 2020-2-18 21:24 | 只看該作者
今晚上做了實驗,再對比程序。。

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

1.jpg

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

press1.jpg

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

press2.jpg

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

press3.jpg

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

press4.jpg

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

實物.jpg
回復

使用道具 舉報

板凳
ID:626079 發表于 2020-2-18 21:31 | 只看該作者
但是這樣的顯示執行結果不是我想要的。明天再研究改一下程序。我只需要按一個鍵做開關,顯示1或0就可以了,別的鍵都不需要改變。或者有哪個大神幫我改一下。
回復

使用道具 舉報

地板
ID:626079 發表于 2020-2-18 22:54 | 只看該作者
最簡單的改動,現在實現了只顯示1或0狀態。只是這樣的話理論上所有的按鍵都可以控制電機開啟了。。。。
                        while(Read_key()==i);                       //等待按鍵釋放
//                        if(num[i]>15)                                           //原程序是按一下鍵,自動計數加1.可以加到15
                       
                        if(num[i]>1)                                           //改為實現了只顯示1與0(加到1,就值改為0),1電機啟動,0電機斷開
                        num[i]=0;
                        Write_DATA(i*2,tab[num[i]]);
                        Write_allLED(1<<i);
                }
               
               
                if(num[i]==1)
                        {
                          //電機開啟程序
                        }
回復

使用道具 舉報

5#
ID:626079 發表于 2020-2-19 22:43 | 只看該作者
    今晚把TM1368.H加入步進電機程序中,測試通過了對步進電機開啟與停止的控制,這兒取的num[0]=1來控制,測試發現是左邊第一個鍵,
對這個模塊的整個測試過程就我這兒就結束了。

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

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

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

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


  25.                 if(i<8)
  26.                 {
  27.                         num[i]++;
  28.                         while(Read_key()==i);                       //等待按鍵釋放
  29. //                        if(num[i]>15)                                           //原程序是按一下鍵,自動計數加1.
  30.                         
  31.                         if(num[i]>1)                                           //改為只顯示1與0,1電機啟動,0電機斷開
  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.                           //電機開啟程序
  41.                         Run_Status=~Run_Status;
  42.                         if(Run_Status)
  43.                         {
  44.                                 count=counttemp;
  45.                                 TR0=1;                       //開啟中斷產生脈沖信號
  46.                                  EA=1;
  47.                                 
  48.                         }
  49.                         else
  50.                         {
  51.                                 counttemp=count;
  52.                                     TR0=0;                       //關閉中斷停止脈沖信號
  53.                                    EA=0;
  54.                         }
  55.                         }

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


控制步進電機開關.jpg (165.27 KB, 下載次數: 76)

控制步進電機開關.jpg
回復

使用道具 舉報

6#
ID:292876 發表于 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;
}


回復

使用道具 舉報

7#
ID:292876 發表于 2020-3-19 16:54 | 只看該作者
這個模塊自帶程序實際使用不方便,可以按照上面的改,主程序按鍵如何操作很簡單了!判斷鍵值就行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日夜夜精品免费视频 | 国产精品久久久久免费 | 久久精品16| a免费在线 | 欧美日韩在线国产 | 精品一区二区三区电影 | 99精品欧美一区二区蜜桃免费 | 国产日韩欧美激情 | 国产欧美日韩二区 | 美日韩中文字幕 | av香蕉 | 女人av| 欧美精品一区在线 | 一区二区日本 | 精品一区二区久久久久久久网站 | 国产激情在线观看 | 中国一级特黄毛片大片 | 日本字幕在线观看 | 久久高清国产视频 | 综合久久一区 | 欧美激情在线一区二区三区 | 欧美激情精品久久久久久变态 | 欧美一区2区三区3区公司 | 亚洲一区二区免费视频 | 国产精品成人一区 | 秋霞电影一区二区三区 | 欧美成人精品一区二区男人看 | 欧美一区2区三区3区公司 | 免费国产一区二区视频 | 国产精品久久久久久久久久免费看 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产女人叫床高潮大片免费 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 国产精品久久久久影院色老大 | 最新国产在线 | 国产精品久久久久久久久免费 | 一区二区三区四区视频 | 日韩av在线中文字幕 | 亚洲天堂免费在线 | 中文字幕综合 | 国产欧美日韩一区二区三区在线 |