标题:
为什么我的TM1640点不亮 附单片机程序
[打印本页]
作者:
wooo123
时间:
2025-8-27 10:29
标题:
为什么我的TM1640点不亮 附单片机程序
#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
作者:
joyb
时间:
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
作者:
花少广
时间:
2025-8-27 11:48
1、看下数码管共阴共阳有没有买错
2、看下数码管引脚有没有接对,不同尺寸的数码管公共端不一样
3、检查供电是否正常
4、如果上述都没问题可以在网上找个开源的程序,估计程序有问题
作者:
wooo123
时间:
2025-8-27 14:19
花少广 发表于 2025-8-27 11:48
1、看下数码管共阴共阳有没有买错
2、看下数码管引脚有没有接对,不同尺寸的数码管公共端不一样
3、检查 ...
好的谢谢大佬,意思是这个驱动程序没问题嘛。可能是我扫描或者硬件连接的问题吗,
作者:
WL0123
时间:
2025-8-27 16:47
这个TM1640驱动程序经验证能够正常使用。适用51内核MCU。
#include <STC8G.H>
#include <intrins.H>
sbit CLK = P3^5; //TM1640时钟端口
sbit DIN = P3^6; //TM1640数据端口
unsigned char code table[]={//共阴数码管段码"0~f-."
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
unsigned char data dis_buf[16];//显示缓存
/************TM1640开始函数*************/
void TM1640_Start()
{
CLK=1;
DIN=1;
DIN=0;
CLK=0;
}
/************TM1640停止函数*************/
void TM1640_Stop()
{
DIN=0;
CLK=1;
DIN=1;
}
/************TM1640写字节*************/
void TM1640_Write_Byte(unsigned char date)
{
unsigned char i;
CLK=0;
DIN=0;
for(i=0;i<8;i++)
{
CLK=0;
if(date&0x01)DIN=1;
else DIN=0;
CLK=1;
date>>=1;
}
CLK=0;
DIN=0;
}
/****************TM1640发送命令字*******************/
void TM1640_Write_Com(unsigned char date)
{
TM1640_Start();
TM1640_Write_Byte(date);
TM1640_Stop();
}
/************TM1640指定起始地址连续写入若干数据*************/
void TM1640_Write_DATA()
{
unsigned char i;
TM1640_Write_Com(0x40); //44固定地址 40连续地址
TM1640_Start();
TM1640_Write_Byte(0xc0); //从第一个地址开始
for(i=0;i<16;i++) //连续写多个数据
TM1640_Write_Byte(dis_buf[i]);//最多写16字节数据
TM1640_Stop();
}
/************TM1640指定地址写入1个数据*************/
/*
void TM1640_Write_DATA(unsigned date)
{
TM1640_Write_Com(0x44); //44固定地址 40连续地址
TM1640_Write_Byte(0xc0); //第一个地址
TM1640_Write_Byte(date); //写一个数据
TM1640_Stop();
}*/
/************TM1640清屏函数*************/
void TM1640_Cls()
{
unsigned char i;
TM1640_Write_Com(0x40); //地址自动加1模式
TM1640_Start();
TM1640_Write_Byte(0xc0);
for(i=0;i<16;i++)
TM1640_Write_Byte(0x00);
TM1640_Stop();
}
/************TM1640初始化函数*************/
void TM1640_Init()
{
TM1640_Cls(); //TM1640清屏
TM1640_Write_Com(0x8c); //亮度0x88~0x8F
}
/**********主函数**********/
void main()
{
unsigned char j;
TM1640_Init(); //初始化TM1640
for(j=0;j<16;j++)
{
dis_buf[j]=table[j];//显示数据加入缓存
}
TM1640_Write_DATA();//连续写入若干数据
while(1);
}
复制代码
作者:
man1234567
时间:
2025-8-27 18:13
无非硬件软件。
建议先查接线。再查编程,再查器件....
最好是线下找老师或同学面对面解决。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1