搜索
bottom↓
回复: 13

关于tm1629共阳极接法点亮小数点的问题

[复制链接]

出0入0汤圆

发表于 2013-5-14 21:37:30 | 显示全部楼层 |阅读模式
我现在用的是共阳极接法,除了小数点别的都能正常显示,这种接法小数点到底能点亮吗,我直接输出0XFF,小数点也不能点亮,不知怎么回事,各位帮帮忙啊,搞了很长时间了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-5-14 21:44:03 | 显示全部楼层
你先量看看确定数码管的小数点是否会亮? 现在的数码管除非特别交代, 否则小数点是不会亮的.

出0入0汤圆

发表于 2013-5-14 21:52:20 | 显示全部楼层
肯定可以,我也碰到过有人这么高,不过你要先确定 小数点是有的才行

出0入0汤圆

 楼主| 发表于 2013-5-14 22:04:29 | 显示全部楼层
小数点用万用表通断档量过,可以用万用表点亮
#ifndef __TM1629_H
#define __TM1629_H

#include<reg52.h>
#include<intrins.h>
#define nop() _nop_()

#define        RAMSIZE                                                        16
#define        CMD_TM1629_WRITE                                0x40
#define        CMD_TM1629_READ                                        0x42
#define        CMD_TM1629_ADDRMODE                                0x44
#define        CMD_TM1629_STARTADDR(addr)                addr|0xC0

sbit        TM1629_DIO = P2^0;                                        //TM1629数据输入/输出
sbit        TM1629_CLK = P2^1;                                        //TM1629时钟输入
sbit        TM1629_STB = P2^2;                                        //TM1629片选

#define        TM1629_STB_HIGH()                TM1629_STB = 1                        
#define        TM1629_STB_LOW()                TM1629_STB = 0                                

#define        TM1629_CLK_HIGH()                TM1629_CLK = 1                       
#define        TM1629_CLK_LOW()                TM1629_CLK = 0                                

#define        TM1629_DIO_HIGH()                TM1629_DIO = 1                                
#define        TM1629_DIO_LOW()                TM1629_DIO = 0

#endif                                                                        


/*
*版权信息:   深圳市天微电子有限公司
*文件名:     TM16XX
*当前版本:   1.0
*单片机型号: AT89S52
*晶震频率           12M
*开发环境:   Keil uVision3   
*作者:
*完成日期:
*功能:       TM16XX与MCU接口函数
*/
#include<tm1629.h>

/* MCU一次输出8个bit */
void        TM1629_OutByte(unsigned char dat)
{
        unsigned char i;

        for(i=0;i<8;i++)
        {
                TM1629_CLK_LOW();                 
                if((dat & 0x01) == 0x01)
                    TM1629_DIO_HIGH();
                else
                    TM1629_DIO_LOW();
                        //nop();                                                                                        //单片机频率高时应适延时 (脉宽大于400ns)
                TM1629_CLK_HIGH();                                                                                        //上升沿输数据,低位开始
                dat >>= 1;
    }
}

/* MCU一次接收8个bit */
unsigned char        TM1629_InByte(void)
{
        unsigned char i;
        unsigned char dat = 0;
       
        TM1629_DIO_HIGH();                                                                                                //如需要,必须在此设置I/O方向为输入
        for(i = 0; i < 8; i++)
        {               
                TM1629_CLK_LOW();
                dat >>= 1;                                                                                                //从低位开始读取
                if(TM1629_DIO) dat += 0x80;
                TM1629_CLK_HIGH();
        }
        return(dat);
}
/* 向TM1629发送命令 */
void        TM1629_SendCmd(unsigned char cmd)
{
        TM1629_STB_HIGH();                                                                                        //初始化TM1629(高电平)
        TM1629_CLK_HIGH();

        TM1629_STB_LOW();                                                                                        //片选(低电平)
        //nop();                                                                                                        //等待TM1629串口初始化完成
        TM1629_OutByte(cmd);
        TM1629_STB_HIGH();       
}
/* 向TM1629发送地址 */
void        TM1629_SendAddr(unsigned char addr)
{
        TM1629_STB_HIGH();                                                                                        //初始化TM1629
        TM1629_CLK_HIGH();

        TM1629_STB_LOW();                                                                                        //片选,低电平有效
        //nop();                                                                                                        //等待TM1629串口初始化完成
        TM1629_OutByte(addr);
}

/* 向指定显示寄存器写入1byte数据 */
void        TM1629_WriteByte( unsigned char addr, unsigned char dat )  
{
        TM1629_SendAddr( addr );
        TM1629_OutByte( dat );
        TM1629_STB_HIGH();
}
/* 向指定起始显示寄存器写入数据块 */
void        TM1629_WriteBlock( unsigned char addr, unsigned char len, unsigned char* buf )
{
        TM1629_SendAddr( addr );
        while ( len -- ) TM1629_OutByte( *buf++ );
        TM1629_STB_HIGH();
}
/* 连续读len个字节的按键数据,存放在buf指定的连续内存中 */
void        TM1629_ReadKey( unsigned char len, unsigned char* buf )
{
        TM1629_SendAddr(CMD_TM1629_READ);//这条命令不能用TM1629_SendCmd送
        while ( len -- ) *buf++ = TM1629_InByte();
        TM1629_STB_HIGH();
}
/* 配置TM1629 */
void        TM1629_Config(void)
{
        TM1629_CLK_HIGH();
        TM1629_DIO_HIGH();
        TM1629_STB_HIGH();       
        TM1629_SendCmd(0x03);                                                                                /*写TM1629显示模式*/
        TM1629_SendCmd(0x40);                                                                                /*写数据到显示寄存器的方式采用地址自动加一*/
        //clear ram
        TM1629_SendCmd(0x8d);//开显示,亮度可以通过改变低三位调节
}


/**********************************************************
共阴代码转换成共阳代码
pSrcBuf:存放共阴代码
pDstBuf:存放共阳代码
n:转换长度
**********************************************************/
void convert1(unsigned char*pSrcBuf,unsigned char*pDstBuf,unsigned char n)
{  
        unsigned char i,j,s,tmp,count,index;
       
        count = 0x01;
        s=0x01;
        for(i=0;i<n;i++)
        {
                tmp = *(pSrcBuf+i);    //转换第i个byte
                for(j = 0;j<8;j++)
                {
                        if(i<8) index = 2*j; //每一字节的8位都转换在不同的显示地址中
                        else index=2*j+1;
                        if((tmp&count)==count)         *(pDstBuf+index) = *(pDstBuf+index) | (s);   //置1      
                        else pDstBuf[index] = *(pDstBuf+index) & (~s);                      //置0                         
                        if(count==0x80) count=0x01;   
                        else count <<= 1;                                    
                }
                if(s==0x80) s=0x01;     
                else s <<= 1;                  
    }                                
}

出0入0汤圆

 楼主| 发表于 2013-5-14 22:07:23 | 显示全部楼层
我不用共阴到共阳码的转换程序直接送显示段码0xff,7段全亮了,但小数点就是不亮,我上面有10个数码管都是小数点不亮,奇怪

出0入0汤圆

发表于 2013-5-14 22:19:24 | 显示全部楼层
应该看下seg  和grid 最大的定义,已经两种接法时的ram刷新方式。

虽然没用过led driver IC

出0入0汤圆

 楼主| 发表于 2013-5-15 07:26:42 | 显示全部楼层
顶一下,请做过的大侠看一下

出0入0汤圆

发表于 2013-5-16 21:18:19 | 显示全部楼层
坐等高手解答。。。。

出0入0汤圆

发表于 2013-5-20 08:57:44 | 显示全部楼层
lqzhw 发表于 2013-5-14 22:07
我不用共阴到共阳码的转换程序直接送显示段码0xff,7段全亮了,但小数点就是不亮,我上面有10个数码管都是 ...

你确定在TM1629 的GRID8 的地址0x0e 0x0f 都写了0XFF ?  你程序的主函数main在那儿?
我前用ATMEGA8驱动过共阳的管子 4位的4个 共16个字 显示小数点完全没问题啊  要显示小数点时在写数据时|0x80就好了


把你的主程一字不落的贴出来  帮你看看

这是我以前驱动1639时的程序  同样我1629也是样用这个驱动的

TM1639 驱动8 位共阳数码管测试成功(可用于TM1629A)
http://www.amobbs.com/thread-5474051-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-5-20 22:58:57 | 显示全部楼层
#include<reg52.h>
#include<tm1629.h>

#include<intrins.h>       
#define nop() _nop_()

#define DEMO1

extern void TM1629_SendCmd(unsigned char dat );
extern void TM1629_SendAddr(unsigned char addr );
extern void        TM1629_WriteByte(unsigned char addr,unsigned char dat );
extern void        TM1629_WriteBlock(unsigned char addr, unsigned char len, unsigned char* buf );
extern void TM1629_ReadKey(unsigned char len, unsigned char* buf );  /* 连续读出nBytes数据存放于buf */
extern void TM1629_Config(void);
extern void convert1(unsigned char*pSrcBuf,unsigned char*pDstBuf,unsigned char n);

unsigned char LED[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};        //LED[0]-LED[15]对应16个数码管,TM1638最多只能接10个(),后6个无效,初始化显示成0
unsigned char Buf1[14] = {0x0ff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};        //显示缓存1,存放共阴显示数据
unsigned char Buf2[14] = {0x0ff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};                //显示缓存2,存放共阳显示数据
unsigned char KeyBuf[4] = {123,0,0,0};

unsigned char CODE[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0};//数码管显示0-9的代码(共阴接法) ,0x00是数码管关闭的代码                                                               
unsigned char CODE1[11] = {0xBf,0x86,0xDb,0xCf,0xE6,0xEd,0xFd,0x87,0xFf,0xEf,0x0};//数码管显示带小数点的字

unsigned char DspBuf[14] = {0x00,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};//16字节显示RAM



/* TM1629 DEMO1 地址自动加一*/
void TM1629_DEMO1(void)
{       
        convert1(Buf1,Buf2,14);
        TM1629_WriteBlock(0xc0,14,Buf2);  
        //TM1629_SendCmd(0x8d);//开显示,亮度可以通过改变低三位调节         config中
        TM1629_ReadKey(4,KeyBuf); //读按键  
}

/* TM1629 DEMO2 固定地址模式*/
void TM1629_DEMO2(void)
{       
unsigned char i;

convert1(Buf1,Buf2,14);

        for(i=0;i<14;i++)
        {
                TM1629_WriteByte(0xc0+i,Buf2[i]);
        }  
       
        //TM1629_SendCmd(0x8d);//开显示,亮度可以通过改变低三位调节
        TM1629_ReadKey(4,KeyBuf); //读按键  
}

void main(void)
{       
        unsigned int k,key;


        TM1629_Config();//
        while(1)
        {
                for(k=0;k<32500;k++)
                {
                        nop();nop();nop();nop();nop();nop();



                }
               



   if (KeyBuf[0]==8)
   key=1;

    if (KeyBuf[0]==128)
   key=2;

     if (KeyBuf[1]==8)
   key=3;

    if (KeyBuf[1]==128)
   key=4;

if (KeyBuf[2]==8)
   key=5;

    if (KeyBuf[2]==128)
   key=6;

     if (KeyBuf[3]==8)
   key=7;

    if (KeyBuf[3]==128)
   key=8;



        Buf1[6] = CODE[key];
         



       



                        TM1629_DEMO2();       
               
                       
        }       





请看,现在应该除了第7个数码管不显示8外,其它应该都显示8加小数点吧

出0入0汤圆

发表于 2013-5-14 21:37:31 | 显示全部楼层
for(i=0;i<14;i++)   14改成16  你这样写在址时只写到0xcd     GRID8 的地址0xce 0xcf跟本没有进行操作
        {
                TM1629_WriteByte(0xc0+i,Buf2[i]);
        }  

出0入0汤圆

发表于 2013-5-21 10:15:23 | 显示全部楼层
Buf2[14]  也要改成16  楼主的程序是从那儿复制来的吧  原来作者就没考虑要显示小数点  多看几遍数据手册按里的要求时序自己写出来 就什么都明白了  

出0入0汤圆

 楼主| 发表于 2013-5-21 19:08:54 | 显示全部楼层
谢谢啦,问题终于解决了

出0入0汤圆

发表于 2015-1-5 18:51:02 | 显示全部楼层
lqzhw 发表于 2013-5-21 19:08
谢谢啦,问题终于解决了

怎么解决的?说说呢,我刚用这个,不听使唤,不能够显示正确的数字,楼主给点拨下呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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