[讨论] 请教关于51IO口切换的问题

吴下阿蒙   2015-3-4 20:21 楼主
现在我要控制6片TM1640,每片需要sdata和sclk两个IO,现在把所有的sclk接在一起,6片芯片的sdata分别接在6个IO口上,电路看起来似乎问题不大,但麻烦事来了,写代码时要怎么办?把6个芯片的驱动当成独立的6个模块来写,还是可以通过IO口切换,改变一下片选就可以?

回复评论 (6)

硬件上可以重新设计主控板,加一个6选一的模拟开关,来切换sdata,除了硬件改动外,软件有没有办法处理?
tm1640.png
点赞  2015-3-4 20:30
什么,将所有的SCLK连接在一起?问题大了,SCLK是时钟线,它当变化时,就意味着有数据输入了。如果所有的连接在一起,那么只要SCLK动作,就对所有的TM1640有效,而不管SDATA如何,这样会出错的。正确的做法是,将所有的SDATA并在一起,而SCLK分开。这样只要相应TM1640的SCLK不动作,SDATA再如何动作都不会有影响的。
点赞  2015-3-4 21:06
能否将sdata做为一个变量,由代码动态映射到P0.2--P0.7的任意一个脚上,这样就相当有一个片选一样,代码就容易处理了。
点赞  2015-3-4 21:07
引用: Aragorn 发表于 2015-3-4 21:06
什么,将所有的SCLK连接在一起?问题大了,SCLK是时钟线,它当变化时,就意味着有数据输入了。如果所有的连接在一起,那么只要SCLK动作,就对所有的TM1640有效,而不管SDATA如何,这样会出错的。正确的做法是,将所有的SDATA并在一起,而SCLK分开。这样只要相应TM1640的SCLK不动作,SDATA再如何动作都不会有影响的。

谢谢Aragorn
这个不用担心,刚刚试过了,我把sclk连着,拨掉sdata, 当 sclk还有脉冲时,数码管不受影响。
点赞  2015-3-4 21:24
使用位操作问题解决了

#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_();
}
点赞  2015-3-5 14:52
DSP_CS 是位选,作为全局变量。
点赞  2015-3-5 14:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复