什么是74HC595
74HC595是一颗单片机IO口扩展芯片,阅读芯片资料后,发现它有以下特点:
- 8位串行输入
- 8位串行或并行输出
- 引脚可输出低电平,高电平以及高阻态
- 输出寄存器可以直接清除
74HC595通过将串行输入转为并行输出,只占用单片机3个I/O即可引出更多的管脚,大大的节省了单片机的I/O资源。
74HC595管脚说明

如图,74HC595总共拥有16个引脚,以下是其功能:
| 引脚号 | 定义 | 功能 |
|---|---|---|
| 14脚 | DS(SER) | 串行数据输入引脚 |
| 0-7脚 | Q0…Q7 | 并行数据输出 |
| 8脚 | GND | 地 |
| 16脚 | VCC | 电源 |
| 9脚 | Q7S | 级联输出端(用于接下一个74HC595的DS) |
| 10脚 | MR | 清空移位寄存器 |
| 11脚 | SCK(SHCP) | 移位寄存器时钟引脚(上升沿) |
| 12脚 | RCK(STCP) | 存储寄存器时钟输入引脚(上升沿) |
| 13脚 | OE | 输出使能控制脚(低电平有效) |
功能表

食用方法
通常我们会用将SCK,RCK和DS三根线与单片机I/O接口连接
因此我会重点讲述这三根线的使用
我们先来分析一下74HC595的原理
如图

这是8个寄存器,我们可以把它当作一个栈,DS用来输入数据,当移位寄存器时钟引脚(SCK)处于上升沿的的时候,这根引脚的状态将被保存在第一个位置,而原先在这里的数据将被移到下一位
如下图



以此类推,直至8位寄存器全部填满
那么
寄存器满了之后如果DS还有数据输入呢
如果你的Q7S管脚恰好一不小心接到了另外一个74HC595的DS…
那么最后一位被移出去的数据就会做为下一个74HC595的输入

当寄存器的最后一位被填满后,就需要存储寄存器时钟输入引脚(RCK)

当存储寄存器时钟输入引脚(RCK)处于上升沿的的时候,寄存器将会将内部的数据全部输出
如图


如上所述,74HC595就可以进行串行输入转并行输出了
示例代码
这是我用51单片机和16*16LED点阵屏播放Badapple的时候写的74HC595的驱动代码
这里使用了4块74HC595引出32根管脚用于驱动点阵屏
#include "IO.h"
void HC595_in(u8 datah1,u8 datah2,u8 datal1,u8 datal2)
{
u8 i;
SE = 0;//DC管脚
SC = 0;//移位寄存器时钟引脚(SCK)
RC = 0;//存储寄存器时钟输入引脚(RCK)
for(i=1;i<=8;i++)//对输入的8位二进制数遍历来控制DC输入的电平
{
if(datal2 >= 0x80)SE = 0;
else SE = 1;
SC = 0;
SC = 1;
datal2 <<= 1;
}
for(i=1;i<=8;i++)
{
if(datal1 >= 0x80)SE = 0;
else SE = 1;
SC = 0;
SC = 1;
datal1 <<= 1;
}
for(i=1;i<=8;i++)
{
if(datah2 >= 0x80)SE = 1;
else SE = 0;
SC = 0;
SC = 1;
datah2 <<= 1;
}
for(i=1;i<=8;i++)
{
if(datah1 >= 0x80)SE = 1;
else SE = 0;
SC = 0;
SC = 1;
datah1 <<= 1;
}
SE = 0;
SC = 0;
RC = 0;
}
void scan()//拉高RCK输出数据
{
RC = 0;
RC = 1;
RC = 0;
}
void clear()//清屏
{
HC595_in(0x00,0x00,0x00,0x00);
scan();
}

2万+

被折叠的 条评论
为什么被折叠?



