第1步:硬件
我的目标只是演示不同的方法我仅将74HC595的8个输出中的4个连接到LED。调试我的代码就足够了:)如果您想使项目看起来更好,则可以将所有Qx输出连接到LED:)
您可以在图像上看到连接。
似乎不同的数据表都有74HC595的不同引脚名称,所以我在我使用的数据表中附加了引脚分配。
74HC595恒定连接:
GND(引脚8)
Vcc(引脚16)至5V
OE(引脚13)接地
SRCLR(MR)(引脚10)至5V
我使用了1k电阻和3mm LED。
步骤2:简单方法
对于所有方法,您都会看到连接到电路的示波器的屏幕截图作为性能证明。黄色走线是串行时钟(SRCLK),蓝色走线是锁存信号(RCLK)。同样,对于所有方法,我将展示函数shiftByte()的实现,该函数采用单个字节并将其逐位(串行)写入74HC595
最简单的将数据写入移位寄存器的方法如本教程中所述。基本上,它使用内置的shiftOut()函数来实现串行接口。这样,写入8位数据需要90微秒。不幸的是,包括代码不是简单的方法,因此您将在附加的zip文件中找到草图,并在shiftOut()函数的屏幕截图中找到。这种方法可以,但是相对较慢。
步骤3:使用端口命令的方法
更好方式不是切换每个位,而是使用命令将数据写入整个端口。像这样:
PORTC&= B11111101;//数据时钟低
PORTC =(PORTC&B11111010)|(x&B00000001);//将时钟设置为低并输出位0
PORTC | = B00000100;//串行时钟高
您可以在此处找到有关端口操作命令的更多信息
使用此方法附带的示例草图。
以这种方式写入8位仅需4.5微秒。它比简单方法快20倍。
此方法的缺点:
代码不清楚。
所有使用的Arduino引脚应位于同一端口上。
应将74HC595的串行数据引脚连接到使用的Arduino端口的最低有效位
使用内联汇编代码可以实现进一步的优化。在所附的草图中,我能够在2.8微秒内写入8位。它比简单方法快32倍。
您可以在此处找到有关如何在C代码中使用内联汇编代码的好指南。
AVR指令集手册
此方法的缺点类似于上一个方法的缺点。
步骤5:使用硬件SPI接口
但是在这种情况下,最好的方法是使用硬件SPI接口。您可以在此处阅读如何使用它。基本上,它专用于芯片内部的串行通信硬件,可用于高速传输串行数据。写出所有8位只需要不到1微秒的时间。附有示例的草图。
对于此示例,74HC595与Arduino的连接应不同于所有其他示例中的连接。
由于此方法使用了Arduino内部的特定硬件,因此应连接74HC595
Arduino引脚13(SCK)到74HC595的引脚11(SRCLK)(串行移位时钟)
Arduino引脚A1到74HC595的引脚12(RCLK) (输出锁存时钟)通常这可以是任何引脚。
Arduino的11HC引脚(MOSI)到74HC595的14引脚(SER)(串行数据输入)
所以这就是最快的方法,也是相对简单的方法。
仅此而已。我希望您觉得此说明有用。任何评论将不胜感激。
-
移位寄存器
+关注
关注
2文章
258浏览量
22219 -
串行接口
+关注
关注
3文章
326浏览量
42561 -
74HC595
+关注
关注
7文章
191浏览量
30781
发布评论请先 登录
相关推荐
评论