一、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。
|