74LS164

串行输出转换为并行输出

这里写图片描述
·A、B:串行数据输入端
·Clock:时钟输入端
·Clear:同步清除输入端(低电平有效)

·真值表
这里写图片描述

eg: PA.0连接A,PA.1连接Clock,PA.2连接Clear,PA.0发送数据11000100至Q0-Q7

//寄存器方式.
#include "public.h"

#define GPIOA_ODR_ADDR (GPIOA_BASE+0x0c)
#define GPIOA_IDR_ADDR (GPIOA_BASE+0x08)
#define BitBand(Addr,BitNum) *((unsigned long *)((Addr&0xf0000000)+0x2000000 + ((Addr&0xfffff)<<5) + (BitNum<<2)))

#define PAOut(n)    BitBand(GPIOA_ODR_ADDR,n)
#define PAIn(n)     BitBand(GPIOA_IDR_ADDR,n)

void Delay_Ms(u16 dly);

int main(void)
{
    u8 i;
    u8 data = 0xC4;

    GPIOA->CRL = 0x333;

    PAOut(2) = 1; 

    for(i=0; i<8; i++)
    {
        PAOut(1) = 0;
        Delay_Ms(1);
        if((data&0x01) == 0x01)
            PAOut(0) = 1;
        else
            PAOut(0) = 0;
        PAOut(1) = 1;
        Delay_Ms(1);
        data=data>>1;
    }
    return 0;

}

void Delay_Ms(u16 dly)
{
    u16 i,j;
    for(i=0; i<dly; i++)
        for(j=1000; j>0; j--);
}
//库函数方式.
#include "stm32f10x.h"

void Delay_Ms(u16 dly);
void LS164_Send(u8 data);

int main(void)
{
    u8 data = 0xC4;
    LS164_Send(data);
    return 0;
}

void Delay_Ms(u16 dly)
{
    u16 i,j;
    for(i=0; i<dly; i++)
        for(j=1000; j>0; j--);
}
void LS164_Send(u8 data)
{
    u8 i;
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_SetBits(GPIOA, GPIO_Pin_2);
    for(i=0; i<8; i++)
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);
        Delay_Ms(1);
        if((data&0x01) == 0x01)
            GPIO_SetBits(GPIOA, GPIO_Pin_0);
        else
            GPIO_ResetBits(GPIOA, GPIO_Pin_0);
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
        Delay_Ms(1);
        data = data>>1;
    }

}
### 功能 74LS164 是一款高速 TTL 型的 8 位串入并出移位寄存器。它可以将串行输入的数据逐位地移入寄存器中,在时钟信号的作用下,数据依次从一个触发器传递到下一个触发器。当 8 位数据全部移入后,可以在并行输出端同时输出这 8 位数据。其具有清零功能,通过低电平有效的清零端可以将寄存器的输出清零。 ### 使用方法 - **引脚连接**: - **串行数据输入**:有两个串行数据输入端 A 和 B,数据可以从这两个引脚输入,只有当 A 和 B 都为高电平时,时钟上升沿到来时才会将高电平数据移入寄存器。 - **时钟输入(CLK)**:上升沿触发,每一个时钟上升沿到来时,寄存器中的数据会向右移动一位,同时将 A 和 B 端的逻辑与结果移入最左边的触发器。 - **清零端(CLR)**:低电平有效,当该引脚为低电平时,寄存器的所有输出端都被清零。 - **并行输出端(Q0 - Q7)**:用于输出寄存器中存储的 8 位数据。 - **数据输入与输出操作**: 先将清零端置为高电平,使寄存器可以正常工作。然后在串行输入端输入数据,同时提供时钟信号,数据会随着时钟上升沿逐位移入寄存器。当 8 个时钟脉冲过后,8 位数据就全部移入寄存器,此时可以在并行输出端得到这 8 位数据。 以下是一个简单的伪代码示例,模拟 74LS164 的使用: ```python # 模拟 74LS164 的使用 # 初始化引脚状态 clr = 1 # 清零端置高 clk = 0 # 时钟初始为低 data_input_A = 1 # 串行数据输入 A data_input_B = 1 # 串行数据输入 B # 模拟 8 个时钟周期输入数据 for i in range(8): # 提供时钟上升沿 clk = 1 # 模拟数据移入 print(f"第 {i+1} 个时钟上升沿,数据移入") clk = 0 ``` ### 应用场景 - **LED 显示驱动**:当需要控制多个 LED 显示时,如果微控制器的 I/O 口资源有限,可以使用 74LS164 来扩展。将 LED 的控制信号串行输入到 74LS164 中,通过并行输出端连接到 LED,实现对多个 LED 的控制。 - **数码管显示**:数码管通常需要多个引脚来显示不同的数字和字符,使用 74LS164 可以将串行数据转换为并行数据,从而减少微控制器与数码管之间的引脚连接数量。 - **数据传输扩展**:在一些需要进行数据串行 - 并行转换的电路中,74LS164 可以将串行输入的数据转换为并行数据,方便后续电路处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值