找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3953|回复: 11
收起左侧

求教:关于16*16点阵的问题 74hc595录入的时候为什么是从低位开始呢

[复制链接]
ID:162190 发表于 2017-3-13 21:50 | 显示全部楼层 |阅读模式
void H595senddata(uchar dat0,uchar dat1,uchar dat2,uchar dat3)
{
   uchar i;
   for(i=0;i<8;i++)
   {
     MOSIO = dat0&0x01;
         dat0>>=1;
         S_CLK = 0;
         _nop_();
         _nop_();
         S_CLK = 1;
         _nop_();
         _nop_();
   }

74595录入的时候为什么是从低位开始呢?不是从高位开始一位一位的录入吗?请大神 赐教

回复

使用道具 举报

ID:111634 发表于 2017-3-13 21:54 | 显示全部楼层
本帖最后由 zl2168 于 2017-3-13 21:56 编辑

80C51串行发送是低位在前高位在后,而移位寄存器的移位秩序是从Q0→Q7。因此,最终的结果是80C51 SBUF中的D0~D7置于移位寄存器的Q7~Q0,位秩序相反。
以上摘自张志良编著《80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(c和汇编)语句条条有注解,便于阅读理解,便于自学。
80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。









回复

使用道具 举报

ID:146949 发表于 2017-3-13 22:13 | 显示全部楼层
本帖最后由 wosiyabo 于 2017-3-13 23:03 编辑

我的这个是左移录入,你的是右移录入。手头上没有595的板子,你把我这个移植入去试试看看结果再告诉我们吧
for(temp=8;temp!=0;temp--)                  
        {
                SI_595=(bit)(input1&0x80);
                SCK_595=0;
                SCK_595=1;
                input1=input1<<1;
        }
回复

使用道具 举报

ID:162190 发表于 2017-3-13 22:21 | 显示全部楼层
wosiyabo 发表于 2017-3-13 22:13
我的这个是左移录入,你的是右移录入。但是串行转送并行数据输出的值还是一样的。
for(temp=8;temp!=0;tem ...

我开发板上点亮的不是同一颗LED,结果应该是不一样的

左移是先录入最高位,右移先录入最低位,但开发板好像右移的结果是跟预期的一样的,74595不是高位在前吗
回复

使用道具 举报

ID:111634 发表于 2017-3-13 22:22 | 显示全部楼层
80C51串行发送是低位在前高位在后,而移位寄存器的移位秩序是从Q0→Q7。因此,最终的结果是80C51 SBUF中的D0~D7置于移位寄存器的Q7~Q0,位秩序相反。
回复

使用道具 举报

ID:162190 发表于 2017-3-13 22:31 | 显示全部楼层
zl2168 发表于 2017-3-13 22:22
80C51串行发送是低位在前高位在后,而移位寄存器的移位秩序是从Q0→Q7。因此,最终的结果是80C51 SBUF中的D ...

我手上这个开发板有时候高位在前,有时候低位在前,作为新手,被搞迷糊了
第一个:
void HC595SendData(  uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{  
        uchar i;
       
        //--发送第一个字节--//
        for(i=0;i<8;i++)
        {
                MOSIO = BT3 >> 7 ;        //从高位到低位
                BT3 <<= 1;

                S_CLK = 0;
                S_CLK = 1;               
        }

第二个:
void H595senddata(uchar dat0,uchar dat1,uchar dat2,uchar dat3)
{
   uchar i;
   for(i=0;i<8;i++)
   {
         S_CLK = 0;
     MOSIO = dat0&0x01;
         dat0>>=1;
         
         _nop_();
         _nop_();
         S_CLK = 1;
         _nop_();
         _nop_();
   }
回复

使用道具 举报

ID:146949 发表于 2017-3-13 23:13 | 显示全部楼层
本帖最后由 wosiyabo 于 2017-3-13 23:38 编辑

运算结果是高低位反的。。3楼正解
回复

使用道具 举报

ID:166656 发表于 2017-3-14 00:58 | 显示全部楼层
低电平有效
回复

使用道具 举报

ID:111634 发表于 2017-3-14 08:28 | 显示全部楼层
你还是没搞清串行传送概念。SBUF是51机串行发送缓冲寄存器,由移位脉冲由TXD端自动产生,传送数据由RXD端串行传送,传送秩序是从低位到高位。你程序是任一I/O口模拟串行传送,移位脉冲由程序指令产生,传送秩序可任意。建议你仔细学习51机串行传送概念,但许多书未讲清,我给你推荐的书中有51机串行口串行传送和任一I/O口模拟串行传送两种概念。
回复

使用道具 举报

ID:162190 发表于 2017-3-14 09:10 来自手机 | 显示全部楼层
好的,我再试试,非常感谢各位的回复
回复

使用道具 举报

ID:162190 发表于 2017-3-14 11:37 来自手机 | 显示全部楼层
zl2168 发表于 2017-3-14 08:28
你还是没搞清串行传送概念。SBUF是51机串行发送缓冲寄存器,由移位脉冲由TXD端自动产生,传送数据由RXD端串 ...

非常感谢,我好像明白了,之前纠结的是为什么同样的四个595芯片控制的同一个16*16点阵,一会儿从高到低一会儿从低到高都能按要求输出,现在觉得应该是取字模的时候顺序不一样,谢谢各位大拿的解疑释惑
回复

使用道具 举报

ID:123289 发表于 2017-3-14 22:36 | 显示全部楼层
注意:
可以从任意位开始,不一定从高到低,也不一定从低到高,此决定于硬件上LED的引脚与595的引脚连接的对位次序。
其实,可能随意连接(以PCB布线方便为准),因为软件可以控制移位送出的数据顺序,以配合你的硬件连接方案。
一般教课书上,为了说明方便,是按最好的排序方法讲解的。实际应用不一定是这样的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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