找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 317|回复: 7
收起左侧

关于芯片74HC595的IO口(ser口)赋值问题

[复制链接]
ID:1067311 发表于 2024-3-21 15:54 | 显示全部楼层 |阅读模式
如代码中IO数据入口也就是ser直接赋值0或1行不行,我看别人都是用位操作赋值,ser本身只接收高电平或低电平,直接等于0或1是不是可以?
我看其他寄存器可位寻址,中也是可以单个“”位"直接赋值的,比如定时器中,EA0=0; TX0=1,这跟SER=0是不是一个道理?
函数之前 已经声明了 sbit ser=P3^5 请教
不考虑语法错误。

单片机源程序如下:
    int main()
    {
    _1sck=P3^6;
    _8rck=P3^4;
    sbit ser=P3^5//定义ser为位操作地址
    {
    void _74HC595write()
    {  
        ser=0;
        _8sck=0;
        _1rck=0;
        ser=1;//io口输入一位
        _1rck=1;//上升沿1移位
        _1rck=0;//复位
        ser=0;//io口输入一位
        _1rck=1;//上升沿1移位
        _1rck=0;//复位
        ser=1;//io口输入一位
        _1rck=1;//上升沿1移位
        _1rck=0;//复位
        ser=0;//io口输入一位
        _1rck=0;//上升沿1移位
        _1rck=0;//复位
        ser=1;//io口输入一位
        _1rck=1;//上升沿1移位
        _1rck=0;//复位
        ser=0;//io口输入一位
        _1rck=1;//上升沿1移位
        _1rck=0;//复位
        ser=0;//io口输入一位
        _1rck=1;//上升沿1移位
        _1rck=0;//复位
        ser=0;//io口输入一位
        _1rck=1;//上升沿1移位
        _1rck=0;//复位
        _8sck=1;//移满8位触发并行输出
        _1rck=0;
    }
    whle(1)
    {
    _74HC595write();
    }
    }

回复

使用道具 举报

ID:883242 发表于 2024-3-21 16:46 | 显示全部楼层
对于595来说,SER直接赋值是没有意义的,必须加CLK把SER的值移位到595的内部。
回复

使用道具 举报

ID:1109793 发表于 2024-3-21 18:05 | 显示全部楼层
参考一下,大概就是数据变化后要有点延时才行
  1. void dqd(uchar da){                  //êä3öÇy¶ˉ£¬°Ñ¶ÎÂë′óÄ£ÄaμÄ′®DDÏßêä3ö
  2. uchar i;

  3. for(i=8;i>0;i--){
  4.         MC = 0;
  5.         if((da&0x01) == 1){
  6.                 MD = 1;
  7.                 }else{
  8.                 MD = 0;
  9.                 }
  10.         da>>=1;
  11.         MC = 1;
  12.         }
  13.         MC = 0;
  14.         delay_us(20);
  15.         MC = 1;
  16. }
复制代码
回复

使用道具 举报

ID:1109793 发表于 2024-3-21 18:10 | 显示全部楼层
xiaobendan001 发表于 2024-3-21 18:05
参考一下,大概就是数据变化后要有点延时才行

这段是用了库存的595代替了164的代码
回复

使用道具 举报

ID:1067311 发表于 2024-3-21 18:27 来自手机 | 显示全部楼层
Hephaestus 发表于 2024-3-21 16:46
对于595来说,SER直接赋值是没有意义的,必须加CLK把SER的值移位到595的内部。

赋值后移位了,ser作为IO口,不是给0就是给1,直接赋值不可行么,为啥要执行位操作,执行位操作也是给高低电平
回复

使用道具 举报

ID:1067311 发表于 2024-3-21 18:30 来自手机 | 显示全部楼层
xiaobendan001 发表于 2024-3-21 18:05
参考一下,大概就是数据变化后要有点延时才行

意思就是可以给ser直接赋值,不用通过位操作也是可以的?
我认为ser口不管如何操作,反正底层就是给高低电平信号,应该是可行的
回复

使用道具 举报

ID:69038 发表于 2024-3-21 21:29 | 显示全部楼层
595是8级串入转并出的3态锁存器,其本质上是D触发器(阵列):就是在CK的上升沿(某些D触发器是下降沿),将D口的状态复制到Q。
在595上,一个D触发器相当于一个bit,595中有8个D串联组成了一组8bit的移位寄存器,
在SHCP的上升沿,将DS上的电平依次移入内部缓存(0-7),一个上升沿移入一位,共8级需8个上升沿,内部缓存外部不可读不可见,只有在第9个上升沿时,才能将第一级(0)移出到Q7S端口上。
也可以在STCP的上升沿,把内部缓存移到输出锁存上,这里是8个bit一次性移动,外部依然不可见不可读;
只有在OE的低电平时,才把输出锁存的电平一次性全输出到Q0-Q7的端口上。
以上就595的工作原理。所以,你单独赋值给SER是没有任何意义的。
回复

使用道具 举报

ID:866313 发表于 2024-3-22 10:43 | 显示全部楼层
使用74HC595目的是节省IO口,那么它是如何做到的呢?就是通过将MCU的一个IO口(数据输出引脚)输出的串行数据转换成并行数据,转换后的并行数据再通过74HC595的引脚输出到片外外设,所以使用时我们需要将MCU寄存器中的并行数据(通常是一个字节)首先转换成串行数据,放置到MCU的一个数据引脚上,然后74HC595对这个引脚上的电平进行采样,移位寄存后再次转换成串行数据。所以你有没有发现一个关键的步骤:MCU数据输出引脚上的电平需要依据MCU寄存器的字节数据进行变化!!!所以你如果直接对ser赋值,只能不断的往外送出同一个字节数据!!!
1.3 74HC595 简介
74HC595 它是一个芯片,是一个 8 位串行输入、并行输出的移位缓存器,那么它的功能就是将串行数据转化为并行数据,它的内部具有八位移位寄存器和一个存储器,还有三态输出功能。如下图所示
51hei.png
由上图可知,输入数据的最低位和 Q7 是对应的、最高位和 Q0 是对应的。

那么下面就讲一下我们的 74HC595 芯片应该怎么使用。首先说一下 MR 复位端
51hei1.png
这个端口是主复位端口,引脚名称 MR 上面有一根横线代表是低电平有效,当它为低电平时它可以将移位寄存器内的数据进行清零。通常我们把它接到 VCC 目的是防止数据的清零。
第二个端口是 DS 端口,这个端口与我们的 MCU 相连接,通过这个端口我们将串行数据传入到移位寄存器当中
51hei2.png


下面的是 SHCP 端口,这个端口是移位寄存器时钟输入,在它的上升沿时将输入的串行数据移入到移位寄存器当中;需要注意的是:它是一个移位寄存器,也就是说当下一个脉冲到来时,上一个脉冲移入的数据就会往下进行移位。如果我们串行数据输入 8 比特数据,那么 8 比特数据输入完之后,第一位输入的数据就会自动移到最后面;如果我们一次输入的数据超过 8 比特,那么最前面输入的数据就会通过 Q7S 端口输出,这个端口与下一个 74HC595 芯片的 DS 端口相连接,就相当于先前输入的数据会输入到下一个 74HC595 芯片当中
51hei3.png

当我们的串行数据都输入到 74HC595 芯片之后怎么控制它的输出呢?
我们的 74HC595 芯片,它的内部有一个八位存储寄存器,它由 STCP 这个信号控制它,叫存储寄存器时钟;在存储寄存器时钟的上升沿时,74HC595 芯片会将移位寄存器当中的数据写入到我们的存储寄存器当中
51hei4.png

当我们的输出使能信号 OE 为有效的低电平时,74HC595 芯片就将存储寄存器当中的数据通过 Q0、Q1、Q2、……、Q7 这八个端口传输出去
51hei5.png

这八个端口就与我们的片外外设相连接,这样就完成了串行输入到并行输出的一个转换,这就是我们的 74HC595 芯片。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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