找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5357|回復(fù): 23
收起左側(cè)

用tm1637驅(qū)動芯片去點亮數(shù)碼管,為什么數(shù)碼管不亮 附單片機(jī)程序

[復(fù)制鏈接]
ID:923440 發(fā)表于 2021-6-21 10:52 | 顯示全部樓層 |閱讀模式
求大佬幫忙看看,用的單片機(jī)芯片是stc8G1k08,數(shù)碼管驅(qū)動芯片是tm1637,參考了網(wǎng)上的一些驅(qū)動代碼,程序燒進(jìn)去數(shù)碼管不亮代碼是這些,目前是先解決數(shù)碼管顯示數(shù)的問題,
#include<STC8G.h>
#include<intrins.h>
//sbit SCL=P3^2;   
//sbit SDA=P3^3; 單片機(jī)stc8g.h的頭文件用的是P33代替P3^3引腳,P32代替是  P3^2引腳;所以沒用sCL與SDA
void IIC_delay(unsigned char i)
{
      unsigned int j = i;;
            while(j--);
}

void start_IIC(void)
{
        P32=1;
        P33=1;
        IIC_delay(2);
        P33=0;
        IIC_delay(2);
        P32=0;
        IIC_delay(2);
}

void stop_IIC(void)
{
        P32=0;
        IIC_delay(3);
        P33=0;
        IIC_delay(2);
        P32=1;
        IIC_delay(2);
        P33=1;
}

void ack_IIC()
{
        P32=0;
            IIC_delay(5);
        while(P33);
        P32=1;
               IIC_delay(2);
        P32=0;
               IIC_delay(2);
}

void WriteByte(unsigned char  WriteData)//寫一個字節(jié)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                P32=0;
                if(WriteData&0x01)
                     P33 = 1;
                else
                      P33 = 0;
                IIC_delay(3);
                WriteData=WriteData>>1;
               IIC_delay(3);
                P32=1;
                IIC_delay(3);
        }

        ack_IIC();
}
void I2C()
{
        P32=1;
        P33=1;
        
  start_IIC();
  WriteByte(0x40);
  ack_IIC();
        stop_IIC();
   //寫命令,設(shè)置起始地址
        start_IIC();
         WriteByte(0xc0);
        ack_IIC();

   //寫數(shù)據(jù)
   WriteByte(0xbf);
        ack_IIC();
   WriteByte(0x3f);
   ack_IIC();
   WriteByte(0x3f);
   ack_IIC();
  WriteByte(0x3f);
  ack_IIC();
  WriteByte(0x3f);
  ack_IIC();
   //寫命令開顯示
        stop_IIC();
        start_IIC();
        WriteByte(0x8f);
        ack_IIC();
        stop_IIC();
}
void main()
{
        P3M0 = 0X00;
        P3M1 = 0X00;//這兩個是將P3端口設(shè)置為準(zhǔn)雙向口模式
        I2C();
  while(1)
        {
               
  }

}



這個是芯片的鏈接圖

這個是芯片的鏈接圖
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-21 10:55 | 顯示全部樓層
在線等,不知道現(xiàn)在玩單片機(jī)的還多不多,這個問題找了好幾天都沒有解決,這個芯片的引腳用萬用表量后都有電;不知道
回復(fù)

使用道具 舉報

ID:320306 發(fā)表于 2021-6-21 11:38 | 顯示全部樓層
這個芯片對時序要求比較高,建議把延時加大試試。
回復(fù)

使用道具 舉報

ID:938643 發(fā)表于 2021-6-21 12:24 | 顯示全部樓層
數(shù)碼管頻率修改一下試試
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2021-6-21 13:54 | 顯示全部樓層
能先說說tm1637的工作原理嗎?
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2021-6-21 13:56 | 顯示全部樓層
DIG1、DIG2、DG1、DG2、DG3又是什么呢?
回復(fù)

使用道具 舉報

ID:748788 發(fā)表于 2021-6-21 15:28 | 顯示全部樓層
先用賣家提供的例程測試能否正常顯示,然后再上自己的程序
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-21 16:07 | 顯示全部樓層
wwh2382 發(fā)表于 2021-6-21 15:28
先用賣家提供的例程測試能否正常顯示,然后再上自己的程序

賣家只負(fù)責(zé)賣,他不給提供程序
,我從網(wǎng)上找的代碼,燒進(jìn)去數(shù)碼管沒有反應(yīng)
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-21 16:13 | 顯示全部樓層
yzwzfyz 發(fā)表于 2021-6-21 13:54
能先說說tm1637的工作原理嗎?

這個tm1637驅(qū)動芯片我從網(wǎng)上找的芯片手冊看的,具體的原理我不太清楚
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-21 16:29 | 顯示全部樓層
zsyzdx 發(fā)表于 2021-6-21 11:38
這個芯片對時序要求比較高,建議把延時加大試試。

把延時改成了100ms,還是沒有反應(yīng)
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2021-6-21 16:54 | 顯示全部樓層
看到兩個問題:一是,你的void WriteByte(unsigned char  WriteData)已經(jīng)包含了ack_IIC(),后邊I2C()又讀一次,當(dāng)然就讀不到了。二是,你對應(yīng)答理解不對啊,所以void ack_IIC()可能寫錯了。我簡單寫了一個,你看看行不?
        P32=0;
        IIC_delay(5);
        P33=1;
        IIC_delay(5);
       P32=1;
       IIC_delay(5);
       while(P33==1);   //獲得應(yīng)答位       
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-21 17:13 | 顯示全部樓層
glinfei 發(fā)表于 2021-6-21 16:54
看到兩個問題:一是,你的void WriteByte(unsigned char  WriteData)已經(jīng)包含了ack_IIC(),后邊I2C()又讀 ...

你好,我按你說的改了,但是數(shù)碼管還是不亮
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-6-21 21:20 | 顯示全部樓層
void ack_IIC()
{
        P32=0;
        P33=1;
            IIC_delay(5);
        while(P33);
        P32=1;
               IIC_delay(2);
        P32=0;
               IIC_delay(2);
}
數(shù)據(jù)線在讀取前要先置位為才能正確的讀取P33引腳的電平狀態(tài)
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-21 21:29 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-6-21 21:20
void ack_IIC()
{
        P32=0;

我改成你說的,試了也不行,應(yīng)該不是這個問題
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-6-21 23:56 | 顯示全部樓層
51c_yang 發(fā)表于 2021-6-21 21:29
我改成你說的,試了也不行,應(yīng)該不是這個問題

這驅(qū)動IC并不是用IIC通訊的
你要先看數(shù)據(jù)手冊,然后自己先寫一個寫入的函數(shù),就是簡單的啟動然后寫入,其它的什么都不要
就看應(yīng)答有沒有應(yīng)答,有應(yīng)答就搞一個指示,一個IO接一個LED看一下
首先要做的是寫入,然后要正確的應(yīng)答,
這個過程就是用來驗證你寫入字節(jié)函數(shù)是否正確而已,只有寫入函數(shù)正確了,才能進(jìn)行下一步
直接就能找到代碼然后亮燈的,這種好事并不多
這個IC的數(shù)據(jù)手冊中是有例程的,你可以去參考一下
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-22 08:49 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-6-21 23:56
這驅(qū)動IC并不是用IIC通訊的
你要先看數(shù)據(jù)手冊,然后自己先寫一個寫入的函數(shù),就是簡單的啟動然后寫入,其它 ...

這個寫入函數(shù)是tm1637芯片手冊給的,
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2021-6-22 08:53 | 顯示全部樓層
看了你電路,想問你P3口為啥還要拉高呢,它內(nèi)部集成了,而且你用的是1K的,也太小了,直接接試試。
另外,我查了一下,看來它的應(yīng)答要求不高,兩種寫法應(yīng)該都行。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-6-22 10:08 | 顯示全部樓層
51c_yang 發(fā)表于 2021-6-22 08:49
這個寫入函數(shù)是tm1637芯片手冊給的,

怎么就想著復(fù)制別人的代碼直接就能亮燈了呢?如果這樣的話,單片機(jī)工程師都找不到工作了
這個驅(qū)動IC的數(shù)據(jù)手冊我看過了,就幾個頁面的PDF而已,有編程基礎(chǔ)10個小時之內(nèi)就能亮燈了
學(xué)習(xí)總是要的嘛,不是說坐在那等著,網(wǎng)友說一個你改一下
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-22 10:50 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-6-22 10:08
怎么就想著復(fù)制別人的代碼直接就能亮燈了呢?如果這樣的話,單片機(jī)工程師都找不到工作了
這個驅(qū)動IC的數(shù)據(jù) ...

額,第一次接觸這個,謝謝你提醒
回復(fù)

使用道具 舉報

ID:748788 發(fā)表于 2021-6-22 10:59 | 顯示全部樓層
既然是抄來的也就不用太較真,不行就再抄別的。論壇里玩過1637的還是有的,你沒好好找。自己還好意思說找了好幾天!707794433的“基于單片機(jī)+TM1637的數(shù)碼管顯示程序”看著不錯,起碼程序的書寫格式比你那個強(qiáng)。具體網(wǎng)址我就不發(fā)了,麻煩你動手找一下
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-22 20:12 | 顯示全部樓層
wwh2382 發(fā)表于 2021-6-22 10:59
既然是抄來的也就不用太較真,不行就再抄別的。論壇里玩過1637的還是有的,你沒好好找。自己還好意思說找了 ...

那個我也試了,
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2021-6-22 20:30 | 顯示全部樓層
我覺得是P3上拉的電阻太小,試試直接連了嗎?
回復(fù)

使用道具 舉報

ID:213124 發(fā)表于 2021-6-22 20:33 | 顯示全部樓層
#include<STC_NEW_8051.H>
#include"TM1628.H"

                 /*寫入單字節(jié)函數(shù)*/
void TM_w_BYTE(unsigned char TM_w_data){

unsigned char i,temp1;

unsigned char x;
temp1=TM_w_data;//賦值
for(i=0;i<8;i++)//循環(huán)寫入每一位
{
if(temp1&0x01)
//寫入第一位
{TM_DIO_high;}
else
{TM_DIO_low;}
TM_CLK_low;
for(x=8;x>0;x--);
TM_CLK_high;
temp1>>=1;//右循環(huán)一位
}
}

/*寫入命令*/
void TM_w_command(unsigned char TM_w_data)
{
TM_STB_low; //片選拉低
TM_w_BYTE(TM_w_data); //寫命令
TM_STB_high; //拉高寫入
}

/*固定地址寫入數(shù)據(jù)函數(shù)*/
void TM_w_data(unsigned char TM_w_addr,unsigned char TM_w_data)
{
TM_STB_low;
TM_w_BYTE(TM_ADD_command + TM_w_addr); //地址寫入BYTE
TM_w_BYTE(TM_w_data); //數(shù)據(jù)寫入BYTE
TM_STB_high; //忽略CLK
}

void TM_init(void)
{
TM_STB_high;
TM_CLK_high;
}




TM1638H
#ifndef __TM1628_H__
#define __TM1628_H__

sbit DIO =P1^7;
sbit CLK =P1^6;
sbit STB =P1^5;

#define TM_CLK_high CLK=1
#define TM_CLK_low CLK=0
#define TM_DIO_high DIO=1
#define TM_DIO_low DIO=0
#define TM_STB_high STB=1
#define TM_STB_low STB=0

#define TM_DAT_command 0x40
#define TM_DIS_control 0x70
#define TM_ADD_command 0xc0
#define TM_SGM_LUM 0x8e
void TM_w_BYTE(unsigned char TM_w_data);
void TM_w_command(unsigned char TM_w_data);
void TM_w_data(unsigned char TM_w_addr,unsigned char TM_w_data);
unsigned int TM_r_BYTE(void);
unsigned int TM_r_key(void);
void TM_init(void);

#endif


實物調(diào)通的,stc10F08
回復(fù)

使用道具 舉報

ID:923440 發(fā)表于 2021-6-23 09:14 | 顯示全部樓層
glinfei 發(fā)表于 2021-6-22 20:30
我覺得是P3上拉的電阻太小,試試直接連了嗎?

你好,謝謝回答,可是這個板子也是按著這個電路打的,硬件這方面我沒辦法去改
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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