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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
74LS138是一种3-8译码器,它可以将3个输入线的不同组合映射到8个输出线上。通过使用74LS138,您可以将一个Arduino数字引脚扩展到8个输出线,以控制更多的设备或执行更复杂的任务。 以下是使用74LS138扩展Arduino的基本步骤: 1. 连接74LS138的引脚。将74LS138的A、B和C输入引脚连接到Arduino的3个数字引脚。将74LS138的GND引脚连接到Arduino的GND引脚。将74LS138的VCC引脚连接到Arduino的5V引脚。 2. 连接74LS138的输出引脚。将74LS138的8个输出引脚连接到您要控制的设备或电路。 3. 编写Arduino代码。使用Arduino IDE编写代码,将3个数字引脚配置为输出,并使用digitalWrite函数在这些引脚上设置正确的电平,以将74LS138的A、B和C输入引脚设置为所需的值。 例如,以下代码将使用74LS138扩展Arduino的数字引脚3,4和5,以控制8个LED灯: ``` const int A_PIN = 3; const int B_PIN = 4; const int C_PIN = 5; void setup() { pinMode(A_PIN, OUTPUT); pinMode(B_PIN, OUTPUT); pinMode(C_PIN, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); } void loop() { for (int i = 0; i < 8; i++) { digitalWrite(A_PIN, i & 0x1); digitalWrite(B_PIN, (i >> 1) & 0x1); digitalWrite(C_PIN, (i >> 2) & 0x1); digitalWrite(6, (i == 0) ? HIGH : LOW); digitalWrite(7, (i == 1) ? HIGH : LOW); digitalWrite(8, (i == 2) ? HIGH : LOW); digitalWrite(9, (i == 3) ? HIGH : LOW); digitalWrite(10, (i == 4) ? HIGH : LOW); digitalWrite(11, (i == 5) ? HIGH : LOW); digitalWrite(12, (i == 6) ? HIGH : LOW); digitalWrite(13, (i == 7) ? HIGH : LOW); delay(1000); } } ``` 该代码将使用数字引脚3、4和5作为74LS138译码器的输入,并将数字引脚6到13作为输出。每个输出引脚将控制一个LED灯,显示0到7的二进制数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jamie_chu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值