电子Inc 发表于 2015-3-8 23:46:02

TM1629数码管驱动芯片玩法分享

本帖最后由 电子Inc 于 2015-3-8 23:53 编辑

   在平常驱动数码管,我都喜欢直接用三极管动态,或者595级联驱动的,但是,前者浪费IO,而且动态扫描占用定时中断,后者虽然级联起来IO浪费得到解决,而且程序也简单,但是芯片
数量增加,无疑增加了成本,这里,我们喜欢用数码管驱动芯片,项目用到的是TM1629,今天,我们就以TM1629为例子来跟大家一起玩耍玩耍。
   首先,TM1629是天微的一款数码管驱动芯片,能够驱动8位15段的共阴数码管,仅用3个IO,布线简单,占用IO资源少,是很好用的一款芯片,但是,我们平常用到的都是8段的数码管,而
TM1629可以驱动15段,这样,剩下的就比较浪费了,那么怎么能提高利用率呢,我们采用共阳的接法,就是用TM1629的段来控制共阳数码管的位,TM1629的位来控制共阳数码管的段,这样
我们就可以控制15位8段数码管了。下面,我们谈谈,怎么控制吧。

上图是共阳数码管的接法,然后我们再看看芯片的RAM地址映射图

那么假如是共阴的接法,我们如果再位1数码管输入0x3F,我用2进制列表给给大家看,我们怎么控制显示输出

SEG1 SEG2 SEG3 SEG4 SEG5 SEG6 SEG7 SEG8 SEG9 SEG10 SEG11 SEG12 SEG13 SEG14 SEG15 SEG16
1      1      1      1       1      1      0       0            ....                                                                              GRID1
                                                                               .....                                                                              GRID2
                                                                                                                                                                        ...
                                                                                                                                                                     GRID8
给地址输入0x3f,如果是共阴,就会直接显示这个数据,但是,现在我们是共阳的接法,原来的段变成位,位变成段,那么共阳是如下表输入

SEG1 SEG2 SEG3 SEG4 SEG5 SEG6 SEG7 SEG8 SEG9 SEG10 SEG11 SEG12 SEG13 SEG14 SEG15 SEG16
1                                                                                                                                                               GRID1
1                                                                            .....                                                                              GRID2
1                                                                                                                                                               GRID3
1                                                                                                                                                               GRID4
1                                                                                                                                                               GRID5
1                                                                                                                                                               GRID6
0                                                                                                                                                               GRID7
0                                                                                                                                                               GRID8


我们可以发现,这样的输入法,我们相当于把数据90°翻转,那么,我们就可以写这样一个算法来完成了,
假如我们现在已经有底层驱动函数 WriteDat(u8 u8Dat,u8 u8Dat);

void SEG_C_ChangeTo_A( u8 *pBuffer )
{
    u8 TmpBuff = {0};
    u8 i, j, k, x;
    for( i = 0; i< 8; i++ )
    {
      k = 0x01;
      x = 0;
      for( j = 0; j< 8; j++ )
      {
            TmpBuff;
            if( 0x01 == (*(pBuffer+i) & k))
            TmpBuffer |= 0x80;
            k <<= 1;
            x+= 2;
      }      k = 0x01;
      x = 1;
      for( j = 0; j< 8; j++ )
      {
            TmpBuff;
            if( 0x01 == (*(pBuffer+i+8) & k))
            TmpBuffer |= 0x80;
            k <<= 1;
            x+= 2;
      }
for( i = 0; i<16; i++ )
WriteDat( 0xc0+i, TmpBuff );
}
完毕,感谢宝贵的时间看帖,如有问题,请多提,如有砖,请多拍!
                     

f晨星 发表于 2015-3-9 10:58:25

厉害{:soso__3110130392203091378_3:}

jianhong_wu 发表于 2015-3-9 15:34:42

感谢分享。辛苦了。
页: [1]
查看完整版本: TM1629数码管驱动芯片玩法分享