#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 */ |