|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 电子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[16] = {0};
- u8 i, j, k, x;
- for( i = 0; i< 8; i++ )
- {
- k = 0x01;
- x = 0;
- for( j = 0; j< 8; j++ )
- {
- TmpBuff[x>>= 1];
- if( 0x01 == (*(pBuffer+i) & k))
- TmpBuffer[x] |= 0x80;
- k <<= 1;
- x+= 2;
- }
复制代码- k = 0x01;
- x = 1;
- for( j = 0; j< 8; j++ )
- {
- TmpBuff[x>>= 1];
- if( 0x01 == (*(pBuffer+i+8) & k))
- TmpBuffer[x] |= 0x80;
- k <<= 1;
- x+= 2;
- }
- for( i = 0; i<16; i++ )
- WriteDat( 0xc0+i, TmpBuff[i] );
- }
复制代码
完毕,感谢宝贵的时间看帖,如有问题,请多提,如有砖,请多拍!
|
|