找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 18499|回復(fù): 24
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)+TM1638驅(qū)動(dòng)數(shù)碼管測(cè)試程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
某寶上買(mǎi)的TM1638模塊測(cè)試程序 根據(jù)數(shù)據(jù)手冊(cè)搞出來(lái)的
騎遠(yuǎn)飛TM1638 按鍵數(shù)碼管模塊
電路原理圖如下:




單片機(jī)源程序如下:
  1. #ifndef        _TM1638_H
  2. #define        _TM1638_H

  3. #include        <REGX51.H>

  4. #define        DATA_COMMAND        0X40
  5. #define        DISP_COMMAND        0x80
  6. #define        ADDR_COMMAND        0XC0

  7. //TM1638模塊引腳定義
  8. sbit        DIO=P1^0;
  9. sbit        CLK=P1^1;
  10. sbit        STB=P1^2;

  11. //共陰數(shù)碼管顯示代碼
  12. unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  13.                            0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};


  14. void TM1638_Write(unsigned char        DATA)                        //寫(xiě)數(shù)據(jù)函數(shù)
  15. {
  16.         unsigned char i;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 CLK=0;
  20.                 if(DATA&0X01)
  21.                         DIO=1;
  22.                 else
  23.                         DIO=0;
  24.                 DATA>>=1;
  25.                 CLK=1;
  26.         }
  27. }
  28. unsigned char TM1638_Read(void)                                        //讀數(shù)據(jù)函數(shù)
  29. {
  30.         unsigned char i;
  31.         unsigned char temp=0;
  32.         DIO=1;        //設(shè)置為輸入
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 temp>>=1;
  36.                 CLK=0;
  37.                 if(DIO)
  38.                         temp|=0x80;
  39.                 CLK=1;
  40.         }
  41.         return temp;
  42. }
  43. void Write_COM(unsigned char cmd)                //發(fā)送命令字
  44. {
  45.         STB=0;
  46.         TM1638_Write(cmd);
  47.         STB=1;
  48. }
  49. unsigned char Read_key(void)
  50. {
  51.         unsigned char c[4],i,key_value=0;
  52.         STB=0;
  53.         TM1638_Write(0x42);                           //讀鍵掃數(shù)據(jù) 命令
  54.         for(i=0;i<4;i++)               
  55.                 c[i]=TM1638_Read();
  56.         STB=1;                                                   //4個(gè)字節(jié)數(shù)據(jù)合成一個(gè)字節(jié)
  57.         for(i=0;i<4;i++)
  58.                 key_value|=c[i]<<i;
  59.         for(i=0;i<8;i++)
  60.                 if((0x01<<i)==key_value)
  61.                         break;
  62.         return i;
  63. }
  64. void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址寫(xiě)入數(shù)據(jù)
  65. {
  66.         Write_COM(0x44);
  67.         STB=0;
  68.         TM1638_Write(0xc0|add);
  69.         TM1638_Write(DATA);
  70.         STB=1;
  71. }
  72. /*
  73. void Write_oneLED(unsigned char num,unsigned char flag)        //單獨(dú)控制一個(gè)LED函數(shù),num為需要控制的led序號(hào),flag為0時(shí)熄滅,不為0時(shí)點(diǎn)亮
  74. {
  75.         if(flag)
  76.                 Write_DATA(2*num+1,1);
  77.         else
  78.                 Write_DATA(2*num+1,0);
  79. }          */
  80. void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函數(shù),LED_flag表示各個(gè)LED狀態(tài)
  81. {
  82.         unsigned char i;
  83.         for(i=0;i<8;i++)
  84.                 {
  85.                         if(LED_flag&(1<<i))
  86.                                 //Write_DATA(2*i+1,3);
  87.                                 Write_DATA(2*i+1,1);
  88.                         else
  89.                                 Write_DATA(2*i+1,0);
  90.                 }
  91. }

  92. //TM1638初始化函數(shù)
  93. void init_TM1638(void)
  94. {
  95.         unsigned char i;
  96.         Write_COM(0x8b);       //亮度 (0x88-0x8f)8級(jí)亮度可調(diào)
  97.         Write_COM(0x40);       //采用地址自動(dòng)加1
  98.         STB=0;                           //
  99.         TM1638_Write(0xc0);    //設(shè)置起始地址

  100.         for(i=0;i<16;i++)           //傳送16個(gè)字節(jié)的數(shù)據(jù)
  101.                 TM1638_Write(0x00);
  102.         STB=1;
  103. }
  104. #endif
復(fù)制代碼


  1. #include        <REGX51.H>
  2. #include        <tm1638.h>

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

  4. int main(void)
  5. {
  6.         unsigned char i;
  7.         init_TM1638();                                   //初始化TM1638
  8.         for(i=0;i<8;i++)
  9.         Write_DATA(i<<1,tab[0]);                       //初始化寄存器
  10.         
  11.         while(1)
  12.         {
  13.                 i=Read_key();                          //讀按鍵值
  14.                 if(i<8)
  15.                 {
  16.                         num[i]++;
  17.                         while(Read_key()==i);                       //等待按鍵釋放
  18.                         if(num[i]>15)
  19.                         num[i]=0;
  20.                         Write_DATA(i*2,tab[num[i]]);
  21.                         Write_allLED(1<<i);
  22.                 }
  23.         }
  24. }

復(fù)制代碼

所有資料51hei提供下載:

TM1638 按鍵數(shù)碼管模塊.zip (802.45 KB, 下載次數(shù): 398)


評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
火火火火~ + 5 謝謝
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏17 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:95542 發(fā)表于 2018-8-3 17:50 | 只看該作者
下載來(lái)學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:583100 發(fā)表于 2019-7-17 20:19 | 只看該作者
很好,可以直接用。
回復(fù)

使用道具 舉報(bào)

地板
ID:361722 發(fā)表于 2019-8-12 13:35 | 只看該作者
新手進(jìn)來(lái)學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

5#
ID:361722 發(fā)表于 2019-8-12 13:35 | 只看該作者
新手進(jìn)來(lái)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

6#
ID:383374 發(fā)表于 2019-8-14 08:27 來(lái)自手機(jī) | 只看該作者
寫(xiě)的還不錯(cuò)
回復(fù)

使用道具 舉報(bào)

7#
ID:98880 發(fā)表于 2019-8-14 10:55 | 只看該作者
TM1638的代碼,我下載看下,
回復(fù)

使用道具 舉報(bào)

8#
ID:410680 發(fā)表于 2020-1-31 23:34 | 只看該作者
好文章,正好需要
回復(fù)

使用道具 舉報(bào)

9#
ID:148715 發(fā)表于 2020-2-1 11:21 | 只看該作者
新手過(guò)來(lái)學(xué)習(xí)一i下。感覺(jué)非常不錯(cuò)
回復(fù)

使用道具 舉報(bào)

10#
ID:410680 發(fā)表于 2020-2-1 12:38 | 只看該作者
下載測(cè)試很好用,謝謝分享
回復(fù)

使用道具 舉報(bào)

11#
ID:398504 發(fā)表于 2020-2-28 00:15 | 只看該作者
非常感謝,下載來(lái)試試看
回復(fù)

使用道具 舉報(bào)

12#
ID:462827 發(fā)表于 2020-2-28 10:01 | 只看該作者
這個(gè)不就是TM1638自帶的例程?!
回復(fù)

使用道具 舉報(bào)

13#
ID:372579 發(fā)表于 2020-3-12 10:13 | 只看該作者
非常感謝,剛好再找呢,謝謝
回復(fù)

使用道具 舉報(bào)

14#
ID:198286 發(fā)表于 2020-3-14 15:00 | 只看該作者
模塊早買(mǎi)了,商家程序也給了,就是不會(huì)點(diǎn)
回復(fù)

使用道具 舉報(bào)

15#
ID:518869 發(fā)表于 2020-6-28 14:15 | 只看該作者
這個(gè)讀函數(shù) DIO=1設(shè)置為輸入,是啥意思呢?
unsigned char TM1638_Read(void)                                        //讀數(shù)據(jù)函數(shù)
{
        unsigned char i;
        unsigned char temp=0;
        DIO=1;        //設(shè)置為輸入
        for(i=0;i<8;i++)
        {
                temp>>=1;
                CLK=0;
                if(DIO)
                        temp|=0x80;
                CLK=1;
        }
        return temp;
}
回復(fù)

使用道具 舉報(bào)

16#
ID:593106 發(fā)表于 2021-3-13 00:03 | 只看該作者
12MHZ晶振,跑在1T的單片機(jī)會(huì)有錯(cuò)誤,跑在12T單片機(jī)正常
回復(fù)

使用道具 舉報(bào)

17#
ID:593106 發(fā)表于 2021-3-13 00:06 | 只看該作者
lastreg 發(fā)表于 2020-6-28 14:15
這個(gè)讀函數(shù) DIO=1設(shè)置為輸入,是啥意思呢?
unsigned char TM1638_Read(void)                             ...

單片機(jī)把DIO拉高,就是說(shuō)對(duì)應(yīng)管腳是單片機(jī)內(nèi)部電阻在拉高,如果TM1638的DIO管腳輸出電平為低,單片機(jī)對(duì)應(yīng)bit為0,反之是1
回復(fù)

使用道具 舉報(bào)

18#
ID:5501 發(fā)表于 2021-4-14 23:39 | 只看該作者
51單片機(jī)IO 讀 一般設(shè)置1 為輸入
回復(fù)

使用道具 舉報(bào)

19#
ID:187802 發(fā)表于 2021-9-17 10:04 | 只看該作者
不錯(cuò),剛好手上有個(gè)這片子的表頭。
回復(fù)

使用道具 舉報(bào)

20#
ID:42615 發(fā)表于 2022-5-6 10:07 | 只看該作者
Write_oneLED(unsigned char num,unsigned char flag);
Write_allLED(unsigned char LED_flag) ;

這兩個(gè)函數(shù)沒(méi)有用吧?
回復(fù)

使用道具 舉報(bào)

21#
ID:1011444 發(fā)表于 2022-5-8 21:25 | 只看該作者
資料很有用,已下載看過(guò)了,謝謝分享!
回復(fù)

使用道具 舉報(bào)

22#
ID:884711 發(fā)表于 2022-8-6 13:51 | 只看該作者
zxy2266 發(fā)表于 2020-3-14 15:00
模塊早買(mǎi)了,商家程序也給了,就是不會(huì)點(diǎn)

俺也是,反復(fù)的都是一樣的全程,總是學(xué)到實(shí)際應(yīng)用的技術(shù),只想把每一個(gè)按鍵應(yīng)用到各自的功能,LED發(fā)光管也能對(duì)應(yīng)的顯示不同的IO口狀態(tài)。
回復(fù)

使用道具 舉報(bào)

23#
ID:884711 發(fā)表于 2022-8-21 07:44 | 只看該作者
void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函數(shù),LED_flag表示各個(gè)LED狀態(tài)
{
        unsigned char i;
        for(i=0;i<8;i++)
                {
                        if(LED_flag&(1<<i))
                                //Write_DATA(2*i+1,3);
                                Write_DATA(2*i+1,1);
                        else
                                Write_DATA(2*i+1,0);
                }
}
看了N多全程,這個(gè)LED顯示都這么寫(xiě)的,總不會(huì)靈活應(yīng)用
回復(fù)

使用道具 舉報(bào)

24#
ID:1081040 發(fā)表于 2023-8-1 20:37 | 只看該作者
void Write_allLED(u8 LED_flag)                                        //控制全部LED函數(shù),LED_flag表示各個(gè)LED狀態(tài)
{
        u8 i;
        for(i=0;i<8;i++)
                {
                        if(LED_flag&(1<<i))
                                {
                                //Write_DATA(2*i+1,3);
                                Write_DATA(2*i+1,1);
                                }
                        else
                                Write_DATA(2*i+1,0);
                }
}

這里報(bào)下面的警告要怎么 解決吶

main.c(32): warning C188: 'parameter 1': value truncated
回復(fù)

使用道具 舉報(bào)

25#
ID:433219 發(fā)表于 2023-8-3 19:37 | 只看該作者
1638 驅(qū)動(dòng)10個(gè)數(shù)碼管+3x8個(gè)按鍵,最優(yōu)綜合ic
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表