OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5637|回复: 10

关于使用TM1637驱动四位数码管的疑问

[复制链接]

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2021-6-27
在线时间
35 小时
发表于 2021-11-25 23:04:31 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 ShineY 于 2021-11-25 23:07 编辑

原理图如图所示;数码管不会亮,用debug调试一直停在void TM1637_Ack(void)函数中的这一步while(TM1637_READ_DIO);求解
代码如下

#include "TM1637.h"
#include "delay.h"

/** Write multiple bits in an 8-bit device register.
* @param slaveAddr I2C slave device address
* @param regAddr Register regAddr to write to
* @param bitStart First bit position to write (0-7)
* @param length Number of bits to write (not more than 8)
* @param data Right-aligned value to write
*/
unsigned char temp=0xCF;//显示跳动的冒号
unsigned char NumDis[24]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0X6F,\
                          0x77,0x7C,0x39,0x5E,0x79,0x71,\
                          0x08,0x48,0x49,\
                          0x76,0x38,0x0E,0x50,0x37};//0123456789ABCDEF一二三HLJRS
void TM1637_Delay_us(unsigned  int Nus)
{
for(;Nus>0;Nus--)
        {
          __nop();
        }
}

void TM1637_Start(void)
{
        TM1637_DIO_OUT();
  TM1637_CLK = 1;
        TM1637_DIO = 1;
        TM1637_Delay_us(2);
        TM1637_DIO = 0;
}
void TM1637_Ack(void)
{
        TM1637_DIO_IN();
        TM1637_CLK = 0;
        TM1637_Delay_us(5);
        while(TM1637_READ_DIO);
        
        TM1637_CLK = 1;
        TM1637_Delay_us(2);
        TM1637_CLK = 0;
}
void TM1637_Stop(void)
{
        TM1637_DIO_OUT();
        TM1637_CLK = 0;
        TM1637_Delay_us(2);
        TM1637_DIO = 0;
        TM1637_Delay_us(2);
        TM1637_CLK = 1;
        TM1637_Delay_us(2);
        TM1637_DIO = 1;
}
void TM1637_WriteByte(unsigned char oneByte)
{
unsigned char i;
        TM1637_DIO_OUT();
//        TM1637_Start();
        for(i=0;i<8;i++)
        {
         TM1637_CLK = 0;
//                TM1637_Delay_us(6);
//                TM1637_DIO = oneByte&0x01;
                if(oneByte&0x01)
                {
                        TM1637_DIO = 1;
                }
                else
                {
                        TM1637_DIO = 0;
                }
                TM1637_Delay_us(3);
                oneByte=oneByte>>1;
                TM1637_CLK = 1;
                TM1637_Delay_us(3);
        }
}

unsigned char TM1637_ScanKey(void)
{
        unsigned char reKey,i;
        TM1637_Start();
        TM1637_WriteByte(0x42);
        TM1637_Ack();
        TM1637_DIO = 1;
        TM1637_DIO_IN();
        for(i=0;i<8;i++)
        {
          TM1637_CLK = 0;
                reKey=reKey>>1;
                TM1637_Delay_us(30);
                TM1637_CLK = 1;
                if(TM1637_READ_DIO)
                {
                  reKey=reKey|0x80;
                }
                else
                {
                  reKey=reKey|0x00;
                }
                TM1637_Delay_us(30);
        }
  TM1637_Ack();
        TM1637_Stop();
        return(reKey);
}
void TM1637_NixieTubeDisplayChar(unsigned char ch,unsigned char p)
{
        if(ch>23)ch=0;//防止数组越界
        TM1637_Start();
        TM1637_WriteByte(0x44);//0x44固定模式有利于控制显示位,0x40则采用显示地址自加模式这里不使用
        TM1637_Ack();
        TM1637_Stop();
        TM1637_Start();
        
        TM1637_WriteByte(0xC0+p);//0X00地址开始显示
        TM1637_Ack();
               
        TM1637_WriteByte(NumDis[ch]);//显示
        TM1637_Ack();
               
}
void TM1637_NixieTubeDisplay(void)
{
        
        TM1637_Start();
        TM1637_WriteByte(0x40);//0x40则采用显示地址自加1模式
        TM1637_Ack();
        TM1637_Stop();
        
        TM1637_Start();
        TM1637_WriteByte(0xC0);//0X00地址开始显示
        TM1637_Ack();
               
        TM1637_WriteByte(0x06);//显示1
        TM1637_Ack();
         
  temp^=0x80;
        TM1637_WriteByte(temp);//显示2和跳动的冒号
        TM1637_Ack();
        
        TM1637_WriteByte(0x06);//显示1
        TM1637_Ack();
               
        TM1637_WriteByte(0x66);//显示4
        TM1637_Ack();
               
        TM1637_WriteByte(0xFF);
        TM1637_Ack();
               
        TM1637_WriteByte(0xFF);
        TM1637_Ack();
        
        TM1637_Stop();
        TM1637_Start();
        TM1637_WriteByte(0x8f);
        TM1637_Ack();
        TM1637_Stop();
}


void Display(unsigned char dat)        //显示函数
{
        unsigned char n;
        TM1637_Start();
        TM1637_WriteByte(0x40);//数据命令-40H 地址自动加1 模式,44H 固定地址模式,本程序采用自加1 模式
        TM1637_Ack();
        TM1637_Stop();
        
        TM1637_Start();
        TM1637_WriteByte(0xC0);//地址命令-设置首地址
        TM1637_Ack();
        for(n=0;n<6;n++)//共六个字节单元-这里选取了6个
        {
                TM1637_WriteByte(dat);
                TM1637_Ack();        
        }
        TM1637_Stop();
        
        TM1637_Start();
        TM1637_WriteByte(0x8f);//开显示命令-消光数量设置:开显示,并配置最大亮度
        TM1637_Ack();
        TM1637_Stop();        
}



void TM1637_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;
         
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;        //DIO         CLK                          
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         
GPIO_Init(GPIOB, &GPIO_InitStructure);        
                                                  

}



#ifndef TM1637_H
#define TM1637_H

#include "sys.h"

#define TM1637_CLK           PBout(3)  
#define TM1637_DIO           PBout(4)  
#define TM1637_READ_DIO      PBin(4)

//IO方向设置
#define TM1637_DIO_IN()     {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=8<<16;}
#define TM1637_DIO_OUT()    {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=3<<16;}


extern unsigned char NumDis[24];
void TM1637_Delay_us(unsigned  int Nus);
void TM1637_Start(void);
void TM1637_Ack(void);
void TM1637_Stop(void);
void TM1637_WriteByte(unsigned char oneByte);
unsigned char TM1637_ScanKey(void);
void TM1637_NixieTubeDisplay(void);
void TM1637_NixieTubeDisplayChar(unsigned char ch,unsigned char p);
void TM1637_Init(void);
void Display(unsigned char dat);        //显示函数
#endif




#include "sys.h"
#include "TM1637.h"

/************************************************
ALIENTEK战舰STM32开发板实验1
跑马灯实验
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/


int main(void)
{        
         TM1637_Init();
         TM1637_NixieTubeDisplay();
        while(1)
        {
                 Display(NumDis[0]);        //显示函数
        }
}


Snipaste_2021-11-25_22-55-39.png

最佳答案

查看完整内容[请看2#楼]

自己已解决,但还是要感谢论坛,嘻嘻。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2021-6-27
在线时间
35 小时
 楼主| 发表于 2021-11-25 23:04:32 | 显示全部楼层
自己已解决,但还是要感谢论坛,嘻嘻。
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-11-26 11:47:00 | 显示全部楼层
帮顶     
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2022-2-14 17:33:50 | 显示全部楼层
你怎么解决的?我现在也遇到这个问题
回复

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2021-6-27
在线时间
35 小时
 楼主| 发表于 2022-3-5 15:09:00 | 显示全部楼层
godark 发表于 2022-2-14 17:33
你怎么解决的?我现在也遇到这个问题

停在了等待应答那里么?
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2022-3-25 16:47:45 | 显示全部楼层
ShineY 发表于 2022-3-5 15:09
停在了等待应答那里么?

谢谢,我自己已经解决了
回复

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2022-4-21 11:55:26 | 显示全部楼层
你们解决的不能说一下解决方法吗?我用的51还没法调试?
搞了一个仿真出来 问题出在哪也不知道
波形看着都正常的
回复

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2021-6-27
在线时间
35 小时
 楼主| 发表于 2022-5-23 19:12:32 | 显示全部楼层
电子控2021 发表于 2022-4-21 11:55
你们解决的不能说一下解决方法吗?我用的51还没法调试?
搞了一个仿真出来 问题出在哪也不知道
波形看着 ...

什么问题?按键是不能用,存在异常
回复

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2022-5-24 18:03:29 | 显示全部楼层
ShineY 发表于 2022-5-23 19:12
什么问题?按键是不能用,存在异常

没事了,我的不知道什么问题,用实物就可以
回复

使用道具 举报

0

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2019-12-17
在线时间
123 小时
发表于 2024-4-1 18:52:04 | 显示全部楼层
ShineY 发表于 2021-11-25 23:04
自己已解决,但还是要感谢论坛,嘻嘻。

请问楼主如何解决的?
回复

使用道具 举报

0

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2019-12-17
在线时间
123 小时
发表于 2024-4-3 14:15:44 | 显示全部楼层
csq463276932 发表于 2024-4-1 18:52
请问楼主如何解决的?

后来发现是STM32的电平驱动不够。TM1637最低的高电平需要0.7VDD 即3.5V.需要加电平转换电路。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 05:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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