找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5328|回复: 23
打印 上一主题 下一主题
收起左侧

用tm1637驱动芯片去点亮数码管,为什么数码管不亮 附单片机程序

[复制链接]
跳转到指定楼层
楼主
求大佬帮忙看看,用的单片机芯片是stc8G1k08,数码管驱动芯片是tm1637,参考了网上的一些驱动代码,程序烧进去数码管不亮代码是这些,目前是先解决数码管显示数的问题,
#include<STC8G.h>
#include<intrins.h>
//sbit SCL=P3^2;   
//sbit SDA=P3^3; 单片机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)//写一个字节
{
        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();
   //写命令,设置起始地址
        start_IIC();
         WriteByte(0xc0);
        ack_IIC();

   //写数据
   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端口设置为准双向口模式
        I2C();
  while(1)
        {
               
  }

}



pcb的原理图.png (138.2 KB, 下载次数: 57)

这个是芯片的链接图

这个是芯片的链接图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:923440 发表于 2021-6-21 10:55 | 只看该作者
在线等,不知道现在玩单片机的还多不多,这个问题找了好几天都没有解决,这个芯片的引脚用万用表量后都有电;不知道
回复

使用道具 举报

板凳
ID:320306 发表于 2021-6-21 11:38 | 只看该作者
这个芯片对时序要求比较高,建议把延时加大试试。
回复

使用道具 举报

地板
ID:938643 发表于 2021-6-21 12:24 | 只看该作者
数码管频率修改一下试试
回复

使用道具 举报

5#
ID:123289 发表于 2021-6-21 13:54 | 只看该作者
能先说说tm1637的工作原理吗?
回复

使用道具 举报

6#
ID:123289 发表于 2021-6-21 13:56 | 只看该作者
DIG1、DIG2、DG1、DG2、DG3又是什么呢?
回复

使用道具 举报

7#
ID:748788 发表于 2021-6-21 15:28 | 只看该作者
先用卖家提供的例程测试能否正常显示,然后再上自己的程序
回复

使用道具 举报

8#
ID:923440 发表于 2021-6-21 16:07 | 只看该作者
wwh2382 发表于 2021-6-21 15:28
先用卖家提供的例程测试能否正常显示,然后再上自己的程序

卖家只负责卖,他不给提供程序
,我从网上找的代码,烧进去数码管没有反应
回复

使用道具 举报

9#
ID:923440 发表于 2021-6-21 16:13 | 只看该作者
yzwzfyz 发表于 2021-6-21 13:54
能先说说tm1637的工作原理吗?

这个tm1637驱动芯片我从网上找的芯片手册看的,具体的原理我不太清楚
回复

使用道具 举报

10#
ID:923440 发表于 2021-6-21 16:29 | 只看该作者
zsyzdx 发表于 2021-6-21 11:38
这个芯片对时序要求比较高,建议把延时加大试试。

把延时改成了100ms,还是没有反应
回复

使用道具 举报

11#
ID:844772 发表于 2021-6-21 16:54 | 只看该作者
看到两个问题:一是,你的void WriteByte(unsigned char  WriteData)已经包含了ack_IIC(),后边I2C()又读一次,当然就读不到了。二是,你对应答理解不对啊,所以void ack_IIC()可能写错了。我简单写了一个,你看看行不?
        P32=0;
        IIC_delay(5);
        P33=1;
        IIC_delay(5);
       P32=1;
       IIC_delay(5);
       while(P33==1);   //获得应答位       
回复

使用道具 举报

12#
ID:923440 发表于 2021-6-21 17:13 | 只看该作者
glinfei 发表于 2021-6-21 16:54
看到两个问题:一是,你的void WriteByte(unsigned char  WriteData)已经包含了ack_IIC(),后边I2C()又读 ...

你好,我按你说的改了,但是数码管还是不亮
回复

使用道具 举报

13#
ID:401564 发表于 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);
}
数据线在读取前要先置位为才能正确的读取P33引脚的电平状态
回复

使用道具 举报

14#
ID:923440 发表于 2021-6-21 21:29 | 只看该作者
Y_G_G 发表于 2021-6-21 21:20
void ack_IIC()
{
        P32=0;

我改成你说的,试了也不行,应该不是这个问题
回复

使用道具 举报

15#
ID:401564 发表于 2021-6-21 23:56 | 只看该作者
51c_yang 发表于 2021-6-21 21:29
我改成你说的,试了也不行,应该不是这个问题

这驱动IC并不是用IIC通讯的
你要先看数据手册,然后自己先写一个写入的函数,就是简单的启动然后写入,其它的什么都不要
就看应答有没有应答,有应答就搞一个指示,一个IO接一个LED看一下
首先要做的是写入,然后要正确的应答,
这个过程就是用来验证你写入字节函数是否正确而已,只有写入函数正确了,才能进行下一步
直接就能找到代码然后亮灯的,这种好事并不多
这个IC的数据手册中是有例程的,你可以去参考一下
回复

使用道具 举报

16#
ID:923440 发表于 2021-6-22 08:49 | 只看该作者
Y_G_G 发表于 2021-6-21 23:56
这驱动IC并不是用IIC通讯的
你要先看数据手册,然后自己先写一个写入的函数,就是简单的启动然后写入,其它 ...

这个写入函数是tm1637芯片手册给的,
回复

使用道具 举报

17#
ID:844772 发表于 2021-6-22 08:53 | 只看该作者
看了你电路,想问你P3口为啥还要拉高呢,它内部集成了,而且你用的是1K的,也太小了,直接接试试。
另外,我查了一下,看来它的应答要求不高,两种写法应该都行。
回复

使用道具 举报

18#
ID:401564 发表于 2021-6-22 10:08 | 只看该作者
51c_yang 发表于 2021-6-22 08:49
这个写入函数是tm1637芯片手册给的,

怎么就想着复制别人的代码直接就能亮灯了呢?如果这样的话,单片机工程师都找不到工作了
这个驱动IC的数据手册我看过了,就几个页面的PDF而已,有编程基础10个小时之内就能亮灯了
学习总是要的嘛,不是说坐在那等着,网友说一个你改一下
回复

使用道具 举报

19#
ID:923440 发表于 2021-6-22 10:50 | 只看该作者
Y_G_G 发表于 2021-6-22 10:08
怎么就想着复制别人的代码直接就能亮灯了呢?如果这样的话,单片机工程师都找不到工作了
这个驱动IC的数据 ...

额,第一次接触这个,谢谢你提醒
回复

使用道具 举报

20#
ID:748788 发表于 2021-6-22 10:59 | 只看该作者
既然是抄来的也就不用太较真,不行就再抄别的。论坛里玩过1637的还是有的,你没好好找。自己还好意思说找了好几天!707794433的“基于单片机+TM1637的数码管显示程序”看着不错,起码程序的书写格式比你那个强。具体网址我就不发了,麻烦你动手找一下
回复

使用道具 举报

21#
ID:923440 发表于 2021-6-22 20:12 | 只看该作者
wwh2382 发表于 2021-6-22 10:59
既然是抄来的也就不用太较真,不行就再抄别的。论坛里玩过1637的还是有的,你没好好找。自己还好意思说找了 ...

那个我也试了,
回复

使用道具 举报

22#
ID:844772 发表于 2021-6-22 20:30 | 只看该作者
我觉得是P3上拉的电阻太小,试试直接连了吗?
回复

使用道具 举报

23#
ID:213124 发表于 2021-6-22 20:33 | 只看该作者
#include<STC_NEW_8051.H>
#include"TM1628.H"

                 /*写入单字节函数*/
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++)//循环写入每一位
{
if(temp1&0x01)
//写入第一位
{TM_DIO_high;}
else
{TM_DIO_low;}
TM_CLK_low;
for(x=8;x>0;x--);
TM_CLK_high;
temp1>>=1;//右循环一位
}
}

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

/*固定地址写入数据函数*/
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); //数据写入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


实物调通的,stc10F08
回复

使用道具 举报

24#
ID:923440 发表于 2021-6-23 09:14 | 只看该作者
glinfei 发表于 2021-6-22 20:30
我觉得是P3上拉的电阻太小,试试直接连了吗?

你好,谢谢回答,可是这个板子也是按着这个电路打的,硬件这方面我没办法去改
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表