74HC597( 8位输入锁存移位存放器) 使用总结

74hc595为串行转并行芯片(输出芯片)

74hc597为并行转串行芯片(输入芯片)

管脚图:

HC597管脚图

典型应用:

典型应用

真值表:
真值表

时序图:
时序图

//应用程序

sbit HC597_PL0  = P0^3;  //并行加载  (高电平时禁止输出(高阻态))
sbit HC597_STcp = P0^2;  //移位时钟  (上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变)
sbit HC597_SHcp = P0^1;  //储存时钟  (上升沿时数据寄存器的数据移位)
sbit HC597_MR0  = P0^0;  //主复位    (低电平时将移位寄存器的数据清零)

sbit HC597_U1D = P1^0;   //数据口

unsigned char read_HC597(void)
{
    unsigned char  Dat1=0;
	u8  i = 0;
	HC597_MR0 = 0;  //清除寄存器数据
	_nop_();_nop_();

	HC597_PL0  = 0;  //	
	HC597_STcp = 0;	

	_nop_();_nop_();

	HC597_MR0  = 1;  //输入数据
	_nop_();_nop_();	

	HC597_PL0  = 1;  //读取开关数据
	HC597_STcp = 1;	 //RCK置上升沿(数据加载到输入锁存器)	

	for(i=0;i<8;i++)
	{
		 Dat1 <<= 1 ;
		if(HC597_U1D) Dat1 |= 0x01;
		
		HC597_SHcp = 0; //数据可变
		_nop_();	
		HC597_SHcp = 1; //数据不变	
		_nop_();	
	}
	return Dat1;
}
由于没有看到电路图,我假设你是在问如何实现一个8LED动态扫描显示的问题。 首先,我们需要了解什么是动态扫描显示。动态扫描显示是指将多个数码管按照一定的顺序轮流显示,每个数码管显示的时间非常短,人眼看到的是所有数码管同时显示的效果。 对于一个8LED动态扫描显示,我们可以将8个LED分成两组,每组4个LED。每组4个LED的控制线分别接在两个74HC595移位的输出端口上。其中,一个74HC595移位的输出端口控制一组LED的亮灭,另一个74HC595移位的输出端口则控制另一组LED的亮灭。 具体的实现方法是,将LED数码管的8个引脚分别与两个74HC595移位的串行数据输入(SER)相连接。将两个74HC595移位的时钟输入(SRCLK)连接到单片机的一个IO口上,在每个时钟周期内向SRCLK输入一个脉冲,实现移位操作。将两个74HC595移位输入(RCLK)连接到单片机的另一个IO口上,在每个扫描周期内向RCLK输入一个脉冲,将移位中的数据到输出端口,控制LED的亮灭。 下面是C51代码的实现: ```c #include <reg52.h> sbit SRCLK = P1^0; // 74HC595移位时钟输入端 sbit RCLK = P1^1; // 74HC595移位输入端 sbit SER = P1^2; // 74HC595移位串行数据输入端 unsigned char DBuf[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; // 显示缓冲区,存放0x00~0x09的BCD码 unsigned char code LedChar[] = { // 数码管段码表 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; void Display(unsigned char *p) // 显示函数 { unsigned char i, j; for(i = 0; i < 8; i++) // 循环扫描显示 { SER = 0; // 先将SER置0 for(j = 0; j < 8; j++) // 将显示缓冲区中的数据依次写入移位 { if(i == j) // 当i=j时,将要显示的数码管的段码写入移位 { SER = LedChar[p[j]]; } else // 其他数码管的段码写入0 { SER = 0; } SRCLK = 0; // 将SER的数据移入移位 SRCLK = 1; } RCLK = 0; // 移位中的数据 RCLK = 1; P2 = ~(0x01 << i); // 控制对应的数码管亮灭 DelayMs(2); // 每个数码管的显示时间为2ms P2 = 0xff; // 关闭所有数码管 } } void main() { while(1) { Display(DBuf); // 调用显示函数 } } ``` 上面的代码中,Display函数实现了动态扫描显示的功能。首先,循环扫描8个LED,每个LED的显示时间为2ms,然后将对应的BCD码转换成数码管的段码,写入移位中。在移位中的数据到输出端口之前,通过控制对应的数码管的亮灭,实现LED的动态扫描显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值