ARDUINO操作74LS674(16bit并进串出位移寄存器)

简介,74LS674 是一枚16位并行输入串行输出位移寄存器芯片,有多种封装形式,常见的DIP封装型号为 SN74LS674N,因市面上这个芯片比较难买到,固文章也较少,实际上它跟常见的74HC系列的8bit位移寄存器使用方式是差不多的。直接上代码给大家参考,想更加清楚整个程序,可以下载文章最后的资源:

顺带一问,谁有更好的16bit位并进串出移寄存器求介绍,求留言。

SN74LS674N PDF文档:http://www.ti.com.cn/cn/lit/ds/symlink/sn74ls674.pdf

 

/*
 Name:		ArduinoESP32_74LS674.ino
 Created:	2018/12/26 11:21:29
 Author:	JamieChu
 QQ:        122179494
 WeiXin: 13632370065
 SN74LS674N 16位并行输入串行输出位移寄存器读取例程
 PDF文档:http://www.ti.com.cn/cn/lit/ds/symlink/sn74ls674.pdf

 原本使用ESP32的代码改为纯Arduino代码,
 仅供学习参考,删除了多余的判定代码,
 减少学习干扰!
 记得自己结合PDF文档进行实验!
*/

//实验使用的是ESP32,使用其他Arduino板请自行修改引脚编号
//控制引脚两片74LS674共用
#define CS 32
#define CLK 33
#define RW 25
#define MODE 26

//第一片74LS674芯片的串行IO,本例连接到ESP32的GPIO27
#define SER_0 27
//另一片74LS674芯片的串行IO,本例连接到ESP32的GPIO14
#define SER_1 14

unsigned long ser0 = 0;
unsigned long ser1 = 0;
unsigned long newCode = 0;

// the setup function runs once when you press reset or power the board
void setup() 
{
	//初始化串口
	Serial.begin(115200);
	
	//初始化IO
	pinMode(CS, OUTPUT);
	pinMode(CLK, OUTPUT);
	pinMode(RW, OUTPUT);
	pinMode(MODE, OUTPUT);
	pinMode(SER_0, INPUT_PULLDOWN);
	pinMode(SER_1, INPUT_PULLDOWN);

	digitalWrite(CS,HIGH);
}

// the loop function runs over and over again until power down or reset
void loop() 
{
	ReadSER();
	//ReadAllSER();
	Serial.println(newCode);
	delay(500);
}

//单片74LS674读取
void ReadSER()
{
	unsigned char tempCode;

	//还原所有位
	newCode = 0;

	//根据SN74LS674的文档,CLK的SETUP时间最少需要25ns,对于ESP32在CLK切换之间加1us的延时,
	//确保674正确识别时钟的变化,否则可能导致位移错误
	//读取P15;
	digitalWrite(CS,LOW);
	digitalWrite(RW, HIGH);
	digitalWrite(MODE, HIGH);
	digitalWrite(CLK, HIGH);
	delayMicroseconds(1);
	digitalWrite(CLK, LOW);
	delayMicroseconds(1);
	tempCode = digitalRead(SER_0);
	newCode |= tempCode;
	
	//读取P14 ~ P0;
	digitalWrite(MODE, LOW);
	for (int i = 0; i < 15; i++)
	{
		newCode = newCode << 1;
		digitalWrite(CLK, HIGH);
		delayMicroseconds(1);
		digitalWrite(CLK, LOW);
		delayMicroseconds(1);
		tempCode = digitalRead(SER_0);
		newCode |= tempCode;
	}
}

//并联两片74LS674读取,CS,RW,MODE,CLK引脚公用
void ReadAllSER()
{
	unsigned char tempCode_0 = 0;
	unsigned char tempCode_1 = 0;

	//还原
	ser0 = 0;
	ser1 = 0;

	//P15
	digitalWrite(CS, LOW);
	digitalWrite(RW, HIGH);
	digitalWrite(MODE, HIGH);
	digitalWrite(CLK, HIGH);
	delayMicroseconds(1);
	digitalWrite(CLK, LOW);
	delayMicroseconds(1);
	tempCode_0 = digitalRead(SER_0);
	tempCode_1 = digitalRead(SER_1);
	ser0 |= tempCode_0;
	ser1 |= tempCode_1;

	//读取P14 ~ P0;
	digitalWrite(MODE, LOW);
	for (int i = 0; i < 15; i++)
	{
		ser0 = ser0 << 1;
		ser1 = ser1 << 1;
		digitalWrite(CLK, HIGH);
		delayMicroseconds(1);
		digitalWrite(CLK, LOW);
		delayMicroseconds(1);
		tempCode_0 = digitalRead(SER_0);
		tempCode_1 = digitalRead(SER_1);
		ser0 |= tempCode_0;
		ser1 |= tempCode_1;
	}

	//组装数据
	newCode = ser1 << 16;
	newCode |= ser0;
}

CSDN下载:https://download.csdn.net/download/jamie_chu/10881062

百度云盘:https://pan.baidu.com/s/1eop6WR9OEQ-kbjyQDfJalA

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jamie_chu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值