单片机/MCUwilliam hill官网
直播中

yangjun4414

12年用户 78经验值
私信 关注
[问答]

关于TM1638驱动程序问题。

我用的STC的单片机,共阳极的数码管,用的驱动芯片TM1638,你们看看我的程序,哪里出了问题,数码管不亮啊。帮忙指点下谢谢了。在线等~~~威廉希尔官方网站 图在下面。
程序:
#include
#define        DATA_COMMAND        0X40
#define        DISP_COMMAND        0x80
#define        ADDR_COMMAND        0XC0
#define uchar unsigned char
#define uint unsigned int
//TM1638模块引脚定义
***it        DIO=P2^1;
***it        CLK=P2^0;
***it        STB=P4^0;
void display1638();

//uchar data DisBuffer[8]={0,0,0,0,0,0,0,0,0,0};    /*显示缓存区*/        //各个数码管显示的值
//uchar code tab[]={0xc0,0xf9,0xa4,0xb0,
//0x99,0x92,0x82,0xf8,
//0x80,0x90,0x88,0x83,
//0xc6,0xa1,0x86,0x8e};
void TM1638_Write(unsigned char        DATA)                        //写数据函数
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                CLK=0;
                if(DATA&0X01)
                        DIO=1;
                else
                        DIO=0;
                DATA>>=1;
                CLK=1;
        }
}
/*unsigned char TM1638_Read(void)                                        //读数据函数
{
        unsigned char i;
        unsigned char temp=0;
        DIO=1;        //设置为输入
        for(i=0;i<8;i++)
        {
                temp>>=1;
                CLK=0;
                if(DIO)
                        temp|=0x80;
                CLK=1;
        }
        return temp;
}
*/
void Write_COM(unsigned char cmd)                //发送命令
{
        STB=0;
        TM1638_Write(cmd);
        STB=1;
}

void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址写入数据
{
        Write_COM(0x44);                     //设置固定地址
        STB=0;
        TM1638_Write(0xc0|add);
        TM1638_Write(DATA);
        STB=1;
}

void init_TM1638(void)
{
        unsigned char i;
        Write_COM(0x8a);//亮度
        Write_COM(0x40); //写 数据命令
        //Write_COM(0x88);//开显示
        STB=0;
        TM1638_Write(0xc0);                //设置起始地址
        for(i=0;i<16;i++)
        TM1638_Write(0x00);
        STB=1;
}

void main()
{
        init_TM1638();       
        while(1)
        {
                display1638();
        }
}

void display1638()
{
//        CLK=0;
        Write_DATA(0xc0,0x01);
        Write_DATA(0xc2,0x01);
        Write_DATA(0xc4,0x01);
        Write_DATA(0xc6,0x01);
        Write_DATA(0xc8,0x01);
        Write_DATA(0xca,0x01);
        Write_DATA(0xcc,0x00);
        Write_DATA(0xce,0x00);
//        CLK=1;
}
  • 威廉希尔官方网站
图

回帖(42)

yangjun4414

2012-8-3 17:12:31
顶下,高手帮忙下,谢谢了
举报

yangjun4414

2012-8-3 17:16:38
还得自己顶,
举报

yangjun4414

2012-8-3 17:23:44
斑竹救命啊,帮忙看下程序啊
1 举报

yangjun4414

2012-8-3 17:35:31
帮忙一下。
举报

yangjun4414

2012-8-3 17:53:00
额,斑竹都去哪了哦
举报

lstcspring

2012-8-3 19:17:20
没用过这个片子,口子够的话你直接用IO口控制
举报

橄榄叶

2012-9-15 22:02:05
我最近也遇到了同样的问题!你现在解决了吗?发个好使的历程让我看看,谢谢啦!
举报

大斌哥

2012-10-9 16:24:46
是不是时序的问题,看一下datasheet,检查一下时序,有些地方是需要延时的。
举报

LOVE电子

2012-10-9 17:31:20
TM的 驱动的都是共阴极数码管、楼主显然没看datasheet
举报

yangjun4414

2012-10-20 14:12:49
没有,我们用的是共阳极的数码管,所以驱动程序不太好些啊
1 举报
  • 海哥: 你没有真正了解TM1638的芯片

黄昏再羙丶終要

2012-10-21 16:21:40
#include
#include"tm1628_1.h"
uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
//引脚定义
***it        DIO=P0^4;
***it        CLK=P0^5;
***it        STB_1=P0^6;
***it        STB=P0^7;
               
void TM1638_Write(unsigned char        DATA)                        //写数据函数
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                CLK=0;
                if(DATA&0X01)
                        DIO=1;
                else
                        DIO=0;
                DATA>>=1;
                CLK=1;
        }
}
void Write_COM(bit mode,unsigned char cmd)                //发送命令字
{
        if(mode==1)
                STB_1=0;
        else
                STB=0;
        TM1638_Write(cmd);
        if(mode==1)
                STB_1=1;
        else
                STB=1;
}
unsigned char TM1638_Read(void)                                        //读数据函数
{
        unsigned char i;
        unsigned char temp=0;
        DIO=1;        //设置为输入
        for(i=0;i<8;i++)
        {
                temp>>=1;
                CLK=0;
                if(DIO)
                        temp|=0x80;
                CLK=1;
        }
        return temp;
}
void Write_1_DATA(unsigned char add,unsigned char DATA)                //指定地址写入数据
{
        Write_COM(1,0x44);
        STB_1=0;
        TM1638_Write(0xc0|add);
        TM1638_Write(DATA);
        STB_1=1;
}

unsigned int Read_key(void)
{
        unsigned int c[4],c1[4],date[16],i,key_value=0,key_value1=0;
        STB=0;
        TM1638_Write(0x42);
        for(i=0;i<4;i++)
                c[i]=TM1638_Read();
        STB=1;                                        //4个字节数据合成一个字节
        for(i=0;i<4;i++)
                key_value|=c[i]<         for(i=0;i<8;i++)
        {       
                if(key_value&(1<                         date[i]=1;
                else
                        date[i]=0;
        }               
        key_value=date[0]+(date[2]<<4)+(date[4]<<1)+(date[6]<<5)+(date[1]<<2)+(date[3]<<6)+(date[5]<<3)+(date[7]<<7);
        STB_1=0;
        TM1638_Write(0x42);
        for(i=0;i<4;i++)
                c1[i]=TM1638_Read();
        STB_1=1;                                        //4个字节数据合成一个字节
        for(i=0;i<4;i++)
                key_value1|=c1[i]<         for(i=0;i<8;i++)
        {       
                if(key_value1&(1<                         date[i]=1;
                else
                        date[i]=0;
        }               
        key_value1=date[0]+(date[2]<<4)+(date[4]<<1)+(date[6]<<5)+(date[1]<<2)+(date[3]<<6)+(date[5]<<3)+(date[7]<<7);
        key_value=(key_value1<<8)+key_value;
        return key_value;
}
               
void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址写入数据
{
        Write_COM(0,0x44);
        STB=0;
        TM1638_Write(0xc0|add);
        TM1638_Write(DATA);
        STB=1;
}

void init_TM1638(void)
{
        unsigned char i;
        Write_COM(0,0x8f);//亮度
        Write_COM(0,0x40); //写 数据命令
        STB=0;
        TM1638_Write(0xc0);                //写地址命令
        for(i=0;i<16;i++)
        TM1638_Write(0x00);
        STB=1;

        Write_COM(1,0x8f);//亮度
        Write_COM(1,0x40); //写 数据命令
        STB_1=0;
        TM1638_Write(0xc0);                //写地址命令
        for(i=0;i<16;i++)
        TM1638_Write(0x00);
        STB_1=1;
}
举报

肖寒

2012-11-1 11:05:32
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

肖寒

2012-11-1 14:06:55
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

肖寒

2012-11-1 14:12:31
TM1638_Ver1.2.pdf (467.91 KB)
(下载次数: 859, 2012-11-1 14:11 上传)


举报

肖寒

2012-11-1 14:13:54
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

278071

2012-11-13 13:23:27
ding定顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
举报

278071

2012-11-13 13:24:41
太好了太有用了谢谢了太好了太有用了谢谢了太好了太有用了谢谢了太好了太有用了谢谢了太好了太有用了谢谢了
举报

bianwei

2013-1-6 04:44:30
clk信号后是不是还得需要延时一段时间?
举报

cdljb789

2013-3-22 14:47:22
看看先
举报

更多回帖

发帖
×
20
完善资料,
赚取积分