现在我要控制6片TM1640,每片需要sdata和sclk两个IO,现在把所有的sclk接在一起,6片芯片的sdata分别接在6个IO口上,电路看起来似乎问题不大,但麻烦事来了,写代码时要怎么办?把6个芯片的驱动当成独立的6个模块来写,还是可以通过IO口切换,改变一下片选就可以?
硬件上可以重新设计主控板,加一个6选一的模拟开关,来切换sdata,除了硬件改动外,软件有没有办法处理?
什么,将所有的SCLK连接在一起?问题大了,SCLK是时钟线,它当变化时,就意味着有数据输入了。如果所有的连接在一起,那么只要SCLK动作,就对所有的TM1640有效,而不管SDATA如何,这样会出错的。正确的做法是,将所有的SDATA并在一起,而SCLK分开。这样只要相应TM1640的SCLK不动作,SDATA再如何动作都不会有影响的。
能否将sdata做为一个变量,由代码动态映射到P0.2--P0.7的任意一个脚上,这样就相当有一个片选一样,代码就容易处理了。
引用: Aragorn 发表于 2015-3-4 21:06
什么,将所有的SCLK连接在一起?问题大了,SCLK是时钟线,它当变化时,就意味着有数据输入了。如果所有的连接在一起,那么只要SCLK动作,就对所有的TM1640有效,而不管SDATA如何,这样会出错的。正确的做法是,将所有的SDATA并在一起,而SCLK分开。这样只要相应TM1640的SCLK不动作,SDATA再如何动作都不会有影响的。
谢谢
Aragorn!
这个不用担心,刚刚试过了,我把sclk连着,拨掉sdata, 当 sclk还有脉冲时,数码管不受影响。
使用位操作问题解决了
#define sdaH P1 = P1 | tmp1
#define sdaL P1 = P1 & tmp0
void start()
{
uchar tmp1, tmp0;
tmp1=0x01<
tmp0=~tmp1;
sdaH; //sda=1;
scl=1;
_nop_();
_nop_();
sdaL; //sda=0;
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}