74HC165 是一种8位串行输入并行输出移位寄存器,常用于扩展微控制器的输入引脚数量。它能够将多个输入信号通过少数几个控制引脚读取,从而节省微控制器的输入引脚资源。以下是其主要功能和应用:
主要功能
- 输入扩展:可以读取多个数字输入信号。
- 串行数据传输:将多个并行输入转换为串行数据,便于微控制器读取。
- 级联使用:多个74HC165可以级联,进一步扩展输入数量。
引脚说明
74HC165的主要引脚及其功能如下:
- Q7 (Pin 9):串行数据输出,用于将读取到的数据传输给微控制器。
- CLK (Pin 2):时钟输入,用于同步数据传输。
- SH/LD (Pin 1):移位/加载控制引脚,当为低电平时,将并行数据加载到寄存器,当为高电平时,允许数据移位。
- Q7' (Pin 7):串行输出,用于级联多个74HC165。
- D0 - D7 (Pins 11-18):并行数据输入引脚,用于接收外部数字信号。
- CE (Pin 15):使能输入,当为低电平时,允许数据移位。
- GND (Pin 8):接地。
- VCC (Pin 16):电源。
工作原理
- 加载并行数据:当 SH/LD 为低电平时,外部并行输入信号通过 D0-D7 输入到寄存器。
- 移位操作:当 SH/LD 为高电平时,时钟信号的每一次上升沿都会使寄存器内的数据右移一位,并通过 Q7 引脚输出。
应用场景
- 键盘扫描:读取多按键状态,只需少量控制引脚。
- 传感器读取:多个传感器输入信号集中读取。
- 状态监控:扩展微控制器输入,用于监控多个开关或状态信号。
示例
假设我们要将74HC165与Arduino Mega 2560连接,读取8个开关状态:
// 引脚定义
const int latchPin = 35; // SH/LD
const int clockPin = 34; // CLK
const int dataPin = 43; // Q7
void setup() {
// 初始化串行通信
Serial.begin(9600);
// 初始化引脚模式
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, INPUT);
}
void loop() {
// 将SH/LD置低以加载并行数据
digitalWrite(latchPin, LOW);
delayMicroseconds(5);
digitalWrite(latchPin, HIGH);
// 读取串行数据
byte data = shiftIn(dataPin, clockPin, MSBFIRST);
// 输出读取到的数据
Serial.println(data, BIN);
delay(1000);
}
// shiftIn函数,用于读取串行数据
byte shiftIn(int myDataPin, int myClockPin, int myBitOrder) {
byte value = 0;
int i;
for (i = 0; i < 8; ++i) {
digitalWrite(myClockPin, HIGH);
if (myBitOrder == LSBFIRST)
value |= digitalRead(myDataPin) << i;
else
value |= digitalRead(myDataPin) << (7 - i);
digitalWrite(myClockPin, LOW);
}
return value;
}
latchPin
控制加载并行数据。clockPin
当引脚置高时,通过上升沿控制数据移位。dataPin
读取串行数据。LSBFIRST:最低有效位优先
- 对于每个时钟周期,从数据引脚读取的每一位数据按顺序放入字节的低位开始位置。
- 比如,第一个读取的位放在
value
的第0位,第二个读取的位放在value
的第1位,以此类推。MSBFIRST:最高有效位优先
- 对于每个时钟周期,从数据引脚读取的每一位数据按顺序放入字节的高位开始位置。
- 比如,第一个读取的位放在
value
的第7位,第二个读取的位放在value
的第6位,以此类推。
通过这种方式,Arduino可以使用少量引脚读取多个开关的状态,充分利用了74HC165的输入扩展能力。
标签:读取,引脚,移位,寄存器,串行,74HC165,数据,输入 From: https://blog.csdn.net/qq_52301885/article/details/140780985