找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我的TM1640点不亮 附单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:1090863 发表于 2025-8-27 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "Configure.h"
      

/**********************************************************
;功能介绍:控制HBS650显示                                                                                                                                                                       
;*********在输入数据时当CLK是高电平时,DIO的信号必须保持不
变,只有CLK上的时钟信号为低电平时,DIO上的信号才能改变。数据
输入的开始条件是CLK为高电平时,DIO由高变低;结束条件是CLK为高
时,DIO由低电平变为高电平
                  数据传输带有应答信号ACK,当传输数据正确时,会在第8
个时钟的下降沿IC内部会产生一个应答信号ACK将DIO管脚拉低,在
第九个时钟的上升沿释放DIO口线
;**********************************************************/

uchar        xdata        gb_disIcData[c_HBS650_dataNum];

/***********************************************************
;函数名称:void        HBS650_init(void)
;函数功能:IO初始化
;输入参数:无
;输出参数:无
;使用注意:
;--------
;---------
;---------
;**********************************************************/
void HBS650_init(void){
      
        /*p_HBS650_dio_out;
        p_HBS650_dio_l;
        p_HBS650_dio_pull;
      
        p_HBS650_clk_out;
        p_HBS650_clk_l;*/               
}

/**********************************************************
;函数名称:void        HBS650_start(void)
;函数功能:启动信号
;输入参数:
;输出参数:
;使用注意:在CLK为高期间DIO由高变低做为启动信号
;---------
;---------
;---------
;**********************************************************/
void HBS650_start(void){
        p_HBS650_dio_h;
        delay_2us();
        p_HBS650_clk_h;
        delay_2us();
        //
        p_HBS650_dio_l;
        delay_2us();
        p_HBS650_clk_l;
        delay_2us();
}


/**********************************************************
;函数名称:void        HBS650_stop(void)
;函数功能:停止信号
;输入参数:
;输出参数:
;使用注意:在CLK为高期间DIO由低变高做为停止信号
;---------
;---------
;---------
;**********************************************************/
void HBS650_stop(void){
        p_HBS650_dio_l;
        delay_2us();
        p_HBS650_clk_h;
        delay_2us();
        p_HBS650_dio_h;
        delay_2us();
        p_HBS650_clk_l;
        delay_2us();
}


/**********************************************************
;函数名称:void        HBS650_write(uchar j)
;函数功能:停止信号
;输入参数:j:发送到HBS650的数据
;输出参数:
;使用注意:在CLK为高期间传输数据
;---------
;---------
;---------
;**********************************************************/
void HBS650_write(uchar j){
        uchar        i;
        for(i=0x80;i;i>>=1){
        //for(i=0x01;i;i<<=1){
                p_HBS650_clk_l;
                delay_2us();
                if(j&i){
                        p_HBS650_dio_h;
                }else{
                        p_HBS650_dio_l;
                }
                //delay_2us();
                p_HBS650_clk_h;
                //delay_2us();                       
        }
        p_HBS650_clk_l;
        delay_2us();
        p_HBS650_dio_in;
        p_HBS650_dio_h;
        i=10;
        while(p_HBS650_dio_get){
                i--;
                if(i==0)        break;
        }
        //p_HBS650_dio_out;
        p_HBS650_dio_l;
        delay_2us();
        p_HBS650_clk_h;
        delay_2us();
        p_HBS650_clk_l;
        delay_2us();
}


#if        (c_HBS650_lightChangeEn)
/**********************************************************
;函数名称:void        HBS650_updateData(uchar        grade)
;函数功能:送显示数据到HBS650并且开显示
;输入参数:grade:亮度等级
;输出参数:无
;使用注意:
;---------
;---------
;---------
;**********************************************************/
void HBS650_updateData(uchar        grade){
        uchar        i;
        HBS650_start();
        HBS650_write(c_HBS650_dataWrite);
#if        (c_HBS650_segMode)      
        if(grade){
                HBS650_write(0x09+((grade<<4)&0x70));               
        }else{
                HBS650_write(0x00);               
        }
      
#else
        if(grade){
                HBS650_write(0x01+((grade<<4)&0x70));               
        }else{
                HBS650_write(0x00);               
        }      
#endif      
        HBS650_stop();
        for(i=0;i<c_HBS650_dataNum;i++){
                HBS650_start();
                HBS650_write(c_HBS650_initAddr+i*2);      
                HBS650_write(gb_disIcData[i]);
                HBS650_stop();               
        }                                       
}
#else
/**********************************************************
;函数名称:void        HBS650_updateData(void)
;函数功能:送显示数据到HBS650并且开显示
;输入参数:无
;输出参数:无
;使用注意:
;---------
;---------
;---------
;**********************************************************/
void HBS650_updateData(void){
        uchar        i;
        HBS650_start();
        HBS650_write(c_HBS650_dataWrite);
#if        (c_HBS650_segMode)      
        #if        (c_HBS650_lightGrade1)               
                HBS650_write(0x09+((c_HBS650_lightGrade1<<4)&0x70));                              
        #else
                HBS650_write(0x00);               
        #endif
      
#else
        #if        (c_HBS650_lightGrade1)               
                HBS650_write(0x01+((c_HBS650_lightGrade1<<4)&0x70));                              
        #else
                HBS650_write(0x00);               
        #endif      
#endif      
        HBS650_stop();
        for(i=0;i<c_HBS650_dataNum;i++){
                HBS650_start();
                HBS650_write((uchar)(c_HBS650_initAddr+i));      
                //HBS650_write((uchar)(c_HBS650_initAddr+i*2));
                HBS650_write(gb_disIcData[i]);
                HBS650_stop();               
        }      
}
#endif





#ifndef        __HBS650_H__
#define        __HBS650_H__

/*************************************************************
***********************IO口定义*******************************
*************************************************************/
//dio和clk初始化为输出低电平,dio如果外部接上拉则无需上拉,如果没有就开上拉
#define p_HBS650_dio_get                              GET_PORT_PIN(B,2)
#define p_HBS650_dio_in                              SET_PORT_IN(B,2,GPIO_In_AN)
#define p_HBS650_dio_h                          SET_PORT_OUT(B,2,GPIO_Out_PP,1)
#define p_HBS650_dio_l                          SET_PORT_OUT(B,2,GPIO_Out_PP,0)

#define p_HBS650_clk_get                              GET_PORT_PIN(B,1)
#define p_HBS650_clk_in                              SET_PORT_IN(B,1,GPIO_In_AN)
#define p_HBS650_clk_h                          SET_PORT_OUT(B,1,GPIO_Out_PP,1)
#define p_HBS650_clk_l                          SET_PORT_OUT(B,1,GPIO_Out_PP,0)

/*************************************************************
***********************常量定义*******************************
*************************************************************/
#define        c_HBS650_dataNum                                    (16)                       
//显示变量个数,固定值

#define        c_HBS650_segMode                                    (0)                       
//7/8段显示选择 1:7段显示 0:8段显示


#define        c_HBS650_lightChangeEn                            (0)                       
//亮度是否可变 0:不可变 1:可变

#define        c_HBS650_lightGrade1                            (4)                       
//亮度第一等级范围0~8,0为关显示,亮度不可变时选择第一等级做为亮度等级

#define        c_HBS650_lightGrade2                            (4)                       
//亮度第二等级范围0~8,0为关显示

#define        c_HBS650_dataWrite                                    (0x40)               
//写数据到HBS650

#define        c_HBS650_dataRead                                    (0x42)               
//读数据从HBS650

#define        c_HBS650_initAddr                                    (0xc0)               
//显示初始地址


/*************************************************************
***********************外部函数申明***************************
*************************************************************/      
extern void        HBS650_init(void);
#if        (c_HBS650_lightChangeEn)      
extern void        HBS650_updateData(uchar        grade);
#else      
extern void        HBS650_updateData(void);
#endif      
      
/*************************************************************
***********************外部变量申明***************************
*************************************************************/
extern        uchar        xdata        gb_disIcData[c_HBS650_dataNum];      
#endif
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1064915 发表于 2025-8-27 11:42 | 只看该作者
惠博升显示驱动芯片介绍:

  1、LED显示驱动芯片主要型号:

  HBS635 7段4位,28点阵, 7个按键,共阳-SOP16

  HBS650 8段4位,32点阵, 28个按键,共阴-SOP16

  HBS652 8段×5位,7段×6位, 不带按键,单线通讯,共阴-SOP16

  HBS658 7段5位,35点阵, 不带按键,共阳-SOP16

  TA1820 8段6位,48点阵,16个按键, DIP20/SOP20

  HBS288 8段8位,64点阵,不带个按键,SOP20

  HBS688 8段6位,48点阵,16个按键, SOP20

  HBS117 11段7位,77点阵,10个按键,QSOP24 三线

  HBS1668 10段7位,70点阵,20按键,SOP24

  HBS1628 10段7位,70点阵,20个按键,SOP28

  HBS388 8段12位, 96点阵,16个按键,SOP28

  HBS188 8段10位, 80点阵,32个按键,SOP28

  HBS640 8段16位,128点阵,不带按键,SOP28/QSOP28

  HBS1629A 16段8位,128点阵,不带按键,SOP32

  HBS1632D 24段16位,384点阵 不带按键,SSOP48 (HT1632)

  HBS1632 32段8位,256点阵, 不带按键, SSOP48(HT1632)

  2、LCD液晶屏显示驱动芯片主要型号:

  HBS1621 SSOP48 /LQFP44 /LQFP48 32Seg*4com, 128点阵,

  HBS1622 SSOP48 / QFP44 /QFP52/QFP64 32Seg*8com,256点阵,四线串行

  HBS1622F SOP28 14seg*8com 112点阵,2个VDD.

  HBS1721 SSOP48 32seg*4com ,128点阵 ,4*6按键,4路背光,2路SW

  HBS1722 SOP24/SSOP24 15seg*4com, 60点阵 , 3路背光,1路SW

  HBS1723 SOP32 20seg*4com, 80点阵, 4*3按键,4路背光,

  HBS1621A SSOP48 32seg*4com ,128点阵,4*6按键,4路LED驱动,1个VDD, 三线通讯

  HBS1621C SOP28 18seg*4com,72点阵,线通讯, 2个VDD,通过加电阻调整偏压

  HBS1621D SOP24/QSOP24 14seg*4com,56点阵,三线通讯,2个VDD,通过加电阻调整偏压

  HBS1621E SOP16 6sep*4com,24点阵,三线通讯,

  HBS1621F SOP28 19seg*4com,76点阵,4路背光,2通用输入口,1个VDD, 三线通讯

  HBS1621K SOP28 16seg*4com, 64点阵 ,4*3按键,4路背光,1个VDD, 三线通讯

  HBS1621L SOP28 20seg*4com, 80点阵, I方C协议, 1个VDD,通过软件调整偏压

  

  3、音频处理芯片:

  TM2313 三对输入四声道输出数字控制音频处理 SOP28

  TM2314 四对输入两声道输出数字控制音频处理 SOP28
回复

使用道具 举报

板凳
ID:314651 发表于 2025-8-27 11:48 | 只看该作者
1、看下数码管共阴共阳有没有买错
2、看下数码管引脚有没有接对,不同尺寸的数码管公共端不一样
3、检查供电是否正常
4、如果上述都没问题可以在网上找个开源的程序,估计程序有问题
回复

使用道具 举报

地板
ID:1090863 发表于 2025-8-27 14:19 | 只看该作者
花少广 发表于 2025-8-27 11:48
1、看下数码管共阴共阳有没有买错
2、看下数码管引脚有没有接对,不同尺寸的数码管公共端不一样
3、检查 ...

好的谢谢大佬,意思是这个驱动程序没问题嘛。可能是我扫描或者硬件连接的问题吗,
回复

使用道具 举报

5#
ID:1133081 发表于 2025-8-27 16:47 | 只看该作者
这个TM1640驱动程序经验证能够正常使用。适用51内核MCU。
  1. #include <STC8G.H>       
  2. #include <intrins.H>

  3. sbit CLK = P3^5;                        //TM1640时钟端口
  4. sbit DIN = P3^6;                        //TM1640数据端口

  5. unsigned char code table[]={//共阴数码管段码"0~f-."
  6.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  7.         0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
  8. unsigned char data dis_buf[16];//显示缓存

  9. /************TM1640开始函数*************/
  10. void TM1640_Start()
  11. {
  12.         CLK=1;
  13.         DIN=1;
  14.         DIN=0;
  15.         CLK=0;
  16. }
  17. /************TM1640停止函数*************/
  18. void TM1640_Stop()
  19. {
  20.         DIN=0;
  21.         CLK=1;
  22.         DIN=1;
  23. }
  24. /************TM1640写字节*************/
  25. void TM1640_Write_Byte(unsigned char date)
  26. {
  27.         unsigned char i;
  28.         CLK=0;
  29.         DIN=0;
  30.         for(i=0;i<8;i++)
  31.         {
  32.                 CLK=0;
  33.                 if(date&0x01)DIN=1;
  34.                 else DIN=0;
  35.                 CLK=1;
  36.                 date>>=1;
  37.         }
  38.         CLK=0;
  39.         DIN=0;
  40. }
  41. /****************TM1640发送命令字*******************/
  42. void TM1640_Write_Com(unsigned char date)
  43. {
  44.         TM1640_Start();
  45.         TM1640_Write_Byte(date);
  46.         TM1640_Stop();
  47. }
  48. /************TM1640指定起始地址连续写入若干数据*************/
  49. void TM1640_Write_DATA()
  50. {
  51.         unsigned char i;               
  52.         TM1640_Write_Com(0x40);         //44固定地址 40连续地址
  53.         TM1640_Start();
  54.         TM1640_Write_Byte(0xc0);        //从第一个地址开始
  55.         for(i=0;i<16;i++)                                //连续写多个数据
  56.                 TM1640_Write_Byte(dis_buf[i]);//最多写16字节数据
  57.         TM1640_Stop();
  58. }
  59. /************TM1640指定地址写入1个数据*************/
  60. /*
  61. void TM1640_Write_DATA(unsigned date)
  62. {
  63.         TM1640_Write_Com(0x44);         //44固定地址 40连续地址
  64.         TM1640_Write_Byte(0xc0);        //第一个地址
  65.         TM1640_Write_Byte(date);        //写一个数据
  66.         TM1640_Stop();
  67. }*/
  68. /************TM1640清屏函数*************/
  69. void TM1640_Cls()
  70. {
  71.         unsigned char i;       
  72.         TM1640_Write_Com(0x40);                //地址自动加1模式
  73.         TM1640_Start();
  74.         TM1640_Write_Byte(0xc0);
  75.         for(i=0;i<16;i++)
  76.                 TM1640_Write_Byte(0x00);
  77.         TM1640_Stop();
  78. }
  79. /************TM1640初始化函数*************/
  80. void TM1640_Init()
  81. {
  82.         TM1640_Cls();                                //TM1640清屏
  83.         TM1640_Write_Com(0x8c);                //亮度0x88~0x8F
  84. }
  85. /**********主函数**********/
  86. void main()
  87. {
  88.         unsigned char j;
  89.         TM1640_Init();       //初始化TM1640
  90.         for(j=0;j<16;j++)
  91.         {
  92.                 dis_buf[j]=table[j];//显示数据加入缓存
  93.         }
  94.         TM1640_Write_DATA();//连续写入若干数据
  95.         while(1);
  96. }
复制代码



回复

使用道具 举报

6#
ID:584814 发表于 2025-8-27 18:13 | 只看该作者
无非硬件软件。
建议先查接线。再查编程,再查器件....
最好是线下找老师或同学面对面解决。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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