发个自用的74HC595通用驱动,支持N片级联,只要在头文件里声明级联个数即可,同样的,只要把头文件里的端口定义修改一下即可方便移植到任意平台。。。。。C文件不用作任何修改!!!
// driver_595.c
#include "driver_595.h"
unsigned char sys_595Buffer[Total595] = {0};
/* 74HC595控制端口初始化 */
void Driver_595Init(void)
{
SER_Init();
SER = 1;
SRCLK_Init();
SRCLK = 1;
RCLK_Init();
RCLK = 1;
}
/* 74HC595发送n个字节:先发送属于最末端595的那个字节的高位,依此类推 */
void Driver_595SendBytes(void)
{
unsigned char i, j;
RCLK = 0; // 存储寄存器的时钟输入。
for (i = 0; i < Total595; i ++)
{
for (j = 0; j < 8; j ++)
{
SRCLK = 0; // 移位寄存器的时钟输入。
if (sys_595Buffer[Total595 - 1 - i] & 0x80) // 先发送数组的最后一个字节的最高位,依此往前类推
SER = 1;
else
SER = 0;
SRCLK = 1; // 上升沿时移位寄存器中的数据依次移动一位,即Q0中的数据移到Q1中,Q1中的数据移到Q2中,依次类推;下降沿时移位寄存器中的数据保持不变。
sys_595Buffer[Total595 - 1 - i] <<= 1;
}
}
RCLK = 1; // 上升沿时移位寄存器中的数据进入存储寄存器,下降沿时存储寄存器中的数据保持不变。应用时通常将其置为低电平,移位结束后再产生一个正脉冲更新显示数据。
}
// driver_595.h
#ifndef DRIVER_595_H
#define DRIVER_595_H
#include "config.h"
/* 宏定义 */
#define Total595 (2) // 根据具体情况配置,其值等于实际电路中级联的74HC595的个数
// 74HC595控制端口,pin10(/SRCLK)接VCC,pin13(/OE)接GND
#define SER PA_ODR_ODR4 // 74HC595pin12,串行数据输入
#define SRCLK PA_ODR_ODR6 // 74HC595pin11,移位寄存器时钟输入
#define RCLK PA_ODR_ODR5 // 74HC595pin14,存储寄存器时钟输入
#define SER_Init() do{PA_DDR_DDR4 = 1;PA_CR1_C14 = 1;PA_CR2_C24 = 0;}while(0)
#define SRCLK_Init() do{PA_DDR_DDR6 = 1;PA_CR1_C16 = 1;PA_CR2_C26 = 0;}while(0)
#define RCLK_Init() do{PA_DDR_DDR5 = 1;PA_CR1_C15 = 1;PA_CR2_C25 = 0;}while(0)
/* 全局变量 */
extern unsigned char sys_595Buffer[Total595]; // sys_595Buffer[0]对应级联电路中第一个595,sys_595Buffer[Total595 - 1]对应级联电路中最后一个595,给数组赋值时注意不要混淆。
/* 外部函数 */
extern void Driver_595Init(void);
extern void Driver_595SendBytes(void);
#endif /* end of HeadFile */