一、74HC595 简介
功能:8位串行输入→并行输出移位寄存器,带输出锁存器。
关键引脚:
SER(DS, 14脚):串行数据输入。
SRCLK(SHCP, 11脚):移位寄存器时钟(上升沿触发数据移位)。
RCLK(STCP, 12脚):存储寄存器时钟(上升沿触发数据锁存到输出)。
OE(13脚):输出使能(低电平有效,通常直接接地)。
Q0-Q7(15脚、1-7脚):并行输出(驱动数码管段选)。
Q7'(9脚):级联输出(接下一片74HC595的SER)。
二、硬件连接(以驱动共阴数码管为例)
1. M051单片机与74HC595连接
2. 74HC595与数码管连接
段选:Q0-Q7 → 数码管的a-dp段(需串联220Ω限流电阻)。
位选:若驱动多位数码管,用另一片74HC595或三极管控制公共端。
三、驱动程序(Keil C)
1. 初始化GPIO
#include "M051Series.h"
#define SER_PIN P1_0 // 数据线
#define SRCLK_PIN P1_1 // 移位时钟
#define RCLK_PIN P1_2 // 锁存时钟
void GPIO_Init() {
GPIO_SetMode(P1, 0x07, GPIO_PMD_OUTPUT); // P1.0~P1.2设为输出
SER_PIN = 0;
SRCLK_PIN = 0;
RCLK_PIN = 0;
}
2. 74HC595写入函数(单字节)
void HC595_SendByte(uint8_t data) {
for (uint8_t i = 0; i < 8; i++) {
SER_PIN = (data >> (7 - i)) & 0x01; // 从高位到低位发送
SRCLK_PIN = 1; // 上升沿移位
__nop(); // 短暂延时(根据时钟速度调整)
SRCLK_PIN = 0;
}
RCLK_PIN = 1; // 上升沿锁存数据到输出
__nop();
RCLK_PIN = 0;
}
3. 示例:显示数字0-9(共阴数码管段码表)
const uint8_t seg_table[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
void DisplayNumber(uint8_t num) {
if (num <= 9) {
HC595_SendByte(seg_table[num]);
}
}
4. 主函数调用
int main() {
SYS_Init(); // 新唐M051系统初始化
GPIO_Init(); // 初始化GPIO
while (1) {
for (uint8_t i = 0; i < 10; i++) {
DisplayNumber(i);
CLK_SysTickDelay(1000000); // 延时约1秒(根据时钟调整)
}
}
}
四、关键注意事项
时序要求:
74HC595在3.3V下工作正常,但需确保时钟频率不过高(建议<10MHz)。
__nop() 延时可根据实际调试调整(若显示乱码,增加延时)。
级联多片74HC595:
将第一片的Q7'接第二片的SER,共用SRCLK和RCLK。
发送数据时,先发送远端芯片的数据(如两片则发送2字节)。
数码管类型适配:
若为共阳数码管,段码取反(~seg_table),且公共端接VCC。
|