前言
74HC595芯片单颗与级联的万能代码
代码
代码如下:
//引脚配置
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_RESET);
/*Configure GPIO pins : PA4 PA5 PA6 */
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
//引脚定义
#define HC595_DAT_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET) //串行数据输入
#define HC595_DAT_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define HC595_ST_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) //输出锁存器时钟
#define HC595_ST_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define HC595_SH_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET) //数据输入时钟
#define HC595_SH_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
uint8_t HC595_SJ[] = { //定义传输用到的数据,几个芯片就写几组数据
0X00, //芯片一数据
0X00, //芯片二数据
0X00, //芯片三数据
0X00, //芯片四数据
0X00, //芯片五数据
};
void HC595(uint8_t send1) //HC595传送一个芯片数据,参数1\要传输的数据
{
uint8_t i; //定义i变量计算次数
for (i = 0; i < 8; i++) //小于8就自加
{
HC595_SH_OFF; //拉低数据输入时钟线
if ((send1 & 0X80)) //数据与0X80取最高位
{
HC595_DAT_ON; //如果数据与0X80为高,就将串行数据输入端拉高
}
else //反之
{
HC595_DAT_OFF; //就将串行数据输入端拉低
}
send1 <<= 1; //数据向左移一位,为下一次传输做准备
HC595_SH_ON; 拉高数据输入时钟线
}
}
void HC595_JL(uint8_t *dat, uint8_t len)//595传送多个芯片数据,参数1\准备传输的数据 参数2\有几个芯片
{
uint8_t i; //定义i变量计算次数
for (i = 0; i < len; i++) //小于len(芯片数)就自加
{
HC595(~dat[i]);
/*
HC595传送一个芯片数据,数据前面的~是取反,将数据取反,
例:(例子为例子,可能说反,请以各位实际现象为准)
数据为dat[]={0X00}; //一组数据
HC595(dat[i]) 则1为高电平0为低电平,此时输出 0 0 0 0 0 0 0 0 8位低电平
HC595(~dat[i]) 则0为高电平1为低电平,此时输出 1 1 1 1 1 1 1 1 8位高电平
*/
}
HC595_ST_OFF; //拉低输出存储器锁存时钟线
HAL_Delay(1); //稍微延时
HC595_ST_ON; //拉高输出存储器锁存时钟线,进行数据输出显示
}
//最后在主函数调用 HC595_JL(uint8_t *dat, uint8_t len) 此函数即可
//例: HC595_JL(HC595_SJ, 5);
总结
我怕自己忘记,先发个帖,如有需要请随意使用.
附件:74HC595中文数据手册