结果是 LED 显示从 0 到 255 的二进制计数。
您可以试验代码并操纵一些值并观察对 LED 的影响。尝试将shiftOut 语句中的MSBFIRST参数更改为LSBFIRST,看看会发生什么。
这是理解基本移位寄存器操作的简单方法。
驱动 7 段显示器74HC575 的另一个用途是驱动 7 段 LED 显示屏。您可以使用它来显示连接到一台显示器的数量,或者您可以级联多个 74HC595 来驱动多台显示器。
7 段 LED 显示屏典型的 7 段 LED 显示布局如下所示:
请注意,“7 段”显示器中实际上有八个 LED 元件,第八个 LED 用作小数点。在某些显示中,这可以用冒号代替。
LED 显示屏有两种配置:
- 共阳极– 所有 LED 都使用共阳极(正极)连接。
- 共阴极- 所有 LED 都与一个共阴极(负极)连接相连。
两种显示类型都使用相同的引脚排列,因此了解您的类型非常重要。一个很好的判断方法(除了参考显示器部件号)是在“二极管测试”功能上使用万用表。当以正确的极性连接时,它可用于点亮 LED 元件。
共阴极显示器更常见,是我们将用于实验的类型。
74HC595 7 段显示器连接由于共阴极 7 段 LED 显示屏实际上只是将八个 LED 连接到一个公共阴极(负极)端子,因此与我们在第一个实验中使用的八个 LED 没有什么不同。所以我们可以使用完全相同的电路来接线。
使用连接图中的图表将显示引脚连接到降压电阻。COM 引脚(公共阴极)连接到 Arduino 的地。请注意,显示器将有两个 COM 引脚,您只需连接一个。
完成所有连接后,您可以通过运行上一个代码来测试它,该代码应该测试所有 LED 段,包括小数点。
但要真正显示连贯的东西,我们需要不同的代码。
74HC595 7段显示代码这是我们将用来测试我们的 7 段显示器的代码。
/*
74HC595 Shift Register with 7-segment LED display
74hc595-7segdisplay.ino
Count in hex from 0-F and display on 7-segment Common Cathode LED display
DroneBot Workshop 2020
https://dronebotworkshop.com
*/
// Define Connections to 74HC595
// ST_CP pin 12
const int latchPin = 10;
// SH_CP pin 11
const int clockPin = 11;
// DS pin 14
const int dataPin = 12;
// Patterns for characters 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F
int datArray[16] = {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110, B11101110, B00111110, B10011100, B01111010, B10011110, B10001110};
void setup ()
{
// Setup pins as Outputs
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop()
{
// Count from 0 to 15
for (int num = 0; num < 16; num )
{
// ST_CP LOW to keep LEDs from changing while reading serial data
digitalWrite(latchPin, LOW);
// Shift out the bits
shiftOut(dataPin, clockPin, MSBFIRST, datArray[num]);
// ST_CP HIGH change LEDs
digitalWrite(latchPin, HIGH);
delay(1000);
}
}
此代码与前一个代码有许多相似之处,当您认为它在同一件事上做得很好时,这并不奇怪。
我们通过定义与 74HC595 的连接重新开始。
然后我们创建一个包含 16 个元素的数组,每个元素代表要在 7 段 LED 上显示的字符模式。
这些元素以二进制形式编写,因此很容易理解它们的工作原理。在二进制字节中,每一位代表一个 LED 段。从 MSB 到 LSB(从左到右),它们代表显示屏中的以下段:
a – b – c – d – e – f – g – DP
当该位设置为“1”时,LED 各段点亮,“0”表示熄灭。
数组是有序的,所以元素 0 是“0”的字符。元素1是“1”等的字符。它是十六进制的,所以元素15是“F”。
查看数组元素,您将看到排列。
再次在设置中,我们将连接设置为输出,然后进入循环。
我们再次使用计数器,只是这次 介于 0 和 15 之间。我们将在 LED 显示屏上以十六进制格式显示这些值。
我们一次遍历数组一个元素,使用shiftOut将数组中的数据发送到移位寄存器。
加载代码并观察显示。如果一切都正确连接,您会看到它从 0 到 F 计数,然后重复。
74HC165 的额外输入端口现在我们已经了解了如何使用移位寄存器添加输出端口,现在是时候做相反的事情并添加一些输入了。对于这项工作,我们将使用 74HC165。
我们将使用 74HC165 移位寄存器和八个轻触式按钮开关。移位寄存器将从开关中获取 8 个输入,并将它们作为串行数据发送到 Arduino。
Arduino shiftIn() 函数Arduino 再次具有用于接收串行数据的专用功能。
所述SHIFTIN()函数中的一个字节在一个时间移位串行数据。可以设置为先取 MSB 或 LSB。它通常与 74HC165 或CD4021BE等移位寄存器一起使用。
与其表亲shiftOut函数一样,shiftIn函数也提供时钟信号来同步数据传输。
Arduino & 74HC165 连接74HC165 的输入需要拉低以防止错误读数,因此除了我们的八个按钮开关之外,我们还需要八个下拉电阻。我使用了 10k 电阻,但从 4.7k 到 27k 的任何值都可以正常工作。