简介,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