标题: C语言程序问题,新手小白求指教 [打印本页]

作者: 机械嗷嗷嗷    时间: 2021-7-23 14:14
标题: C语言程序问题,新手小白求指教
for(a=0;a<8;a++)
{
SER= dat >>7;//从最高位开始发送
dat<<=1;
SRCLK =0;//发送时序
_nop_();
_nop_();
SRCLK = 1;
}
程序是这样的
那这个程序的含义是不是每当SRCLK由0变为1的时候就把一位数据输入到SER中呢求前辈指

作者: lkc8210    时间: 2021-7-23 15:48
看代码不能截头截尾,这是DS1302的写入代码吧? 还是595的?
正确解释应该是
先把一位数据放到SER脚输出
然后用SRCLK脚输出一个下降沿
等待两个时钟周期
把SRCLK脚还原高电平
作者: 机械嗷嗷嗷    时间: 2021-7-23 16:17
lkc8210 发表于 2021-7-23 15:48
看代码不能截头截尾,这是DS1302的写入代码吧? 还是595的?
正确解释应该是
先把一位数据放到SER脚输 ...

感谢指教可我还是有一个点不太懂
          SRCLK=0;
                 _nop_();
            _nop_();
               SRCLK=1;
SRCLK是一个移位寄存器,为什么要输入一个下降沿呢?具体实现了什么作用?(刚刚学这个,很多东西都不知道,见谅)
具体代码如下
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
sbit LED=P0^7;
u8 ledNum;

void Hc595SendByte(u8 dat)
{
        u8 a;

        SRCLK = 1;
        RCLK = 1;

        for(a=0;a<8;a++)                 //发送8位数
        {
                SER = dat >> 7;                 //从最高位
                dat <<= 1;
                SRCLK=0;
                     _nop_();
                _nop_();
                    SRCLK=1;
       
        }
        RCLK=0;
        _nop_();
        _nop_();
        RCLK=1;
}
void delay(u16 i)
{
        while(i--);
}
void main()
{
        LED=0;
        ledNum = ~0x01;
        while(1)
        {
        Hc595SendByte(ledNum);
        ledNum=_crol_(ledNum,1);
        delay(100000);
        }
}
就是控制8*8LED矩阵的一列的一个程序
作者: 名字不是重点    时间: 2021-7-23 16:21
刚好看到一个时序图
这类串行传送数据的,要按时序图来。
正确的做法是
1、时钟置低       SRCLK =0;
2、准备好数据    SER= dat >>7;
3、延时 (可选,目的是要建立可靠的数据保持时间)
4、时钟置高       SRCLK =1;    //传出1bit
5、数据移位       dat<<=1;

这样代码会更符合时序要求。

串行传输,简单地说就是:在CLK的上升沿(个别是下降沿),把SDA上的数据传出(或读入)。

作者: glinfei    时间: 2021-7-23 16:49
机械嗷嗷嗷 发表于 2021-7-23 16:17
感谢指教可我还是有一个点不太懂
          SRCLK=0;
                 _nop_();

对CLK的时序要求都是手册要求的,不用管为什么,看手册时序图就可以了。但你搞错一个事,按你程序是时钟置高时准备SER的数据,置低时把SER发送出去,一次只能发1位。
作者: lkc8210    时间: 2021-7-23 16:57
名字不是重点 发表于 2021-7-23 16:21
刚好看到一个时序图
这类串行传送数据的,要按时序图来。
正确的做法是

没错~是上升沿才对

Screenshot_2021-07-23-16-53-46-189_com.google.android.apps.docs~01.jpg (98.86 KB, 下载次数: 51)

Screenshot_2021-07-23-16-53-46-189_com.google.android.apps.docs~01.jpg

作者: yzwzfyz    时间: 2021-7-23 17:16
你可以这样理解!
实际上是需要看电路是如何连接的。即硬件设计。
作者: glinfei    时间: 2021-7-23 17:37
lkc8210 发表于 2021-7-23 16:57
没错~是上升沿才对

你看楼主程序延时的位置跟你说的正好相反,所以我说按这个程序,是clk置低时发数据。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1