74HC595是具有三态输出功能(即具有高电平、低电平和高阻抗三种输出状态)的门电路。输出寄存器可以直接打消。具有100MHz的移位频率。
引脚先容此部分不繁芜,先容千篇一律,直接摘录了网上比较好的一个:
来源:https://blog.csdn.net/weixin_41445387/article/details/80500046595的数据来源只有这一个口,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。如果,我们要将二进制数据0111 1111 输入到595的移位寄存器中,下面来上一张动态图,仿照了前2个位输入的情景。
0111 1111 这个数据完备输入后是这样的
那么数据是怎么一个一个地进入移位寄存器的呢,这里是由单片机时钟脉冲掌握的,就彷佛是钟表一样,秒针隔一秒就走一下,74HC595数据的移动是通过MCU输出时钟脉冲旗子暗记,吸收到旗子暗记之后,移动数据,腾出位置为吸收下一个数据做准备,即通过MCU向11引脚发送脉冲旗子暗记,HC595吸收到上升沿之后,移动数据。
数据吸收完成之后,如何将移位寄存器的数据转移到存储寄存器,存储寄存器是直接和8个输出引脚相通的,将移位寄存器的数据转移到存储寄存器后,Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 就可以接管带到我们开始输入的一个字节的数据。所谓存储寄存器,便是数据可以存在这个寄存器中,并不会随着一次输出就消逝,只要595不断电,也没有新的数据从移位寄存器中过来,数据就一贯不变且有效。新的数据过来后,存储寄存器中的数据就会被覆盖更新。
12脚: (storage register clock input ) 存储寄存器时钟数据从位移寄存器转移到存储寄存器,也是须要时钟脉冲驱动的,这便是12脚的浸染。它也是上升沿有效。
Part2代码实现
上面对事理进行了先容,非常的大略,接下来,来看看代码如何实现。本次代码依然是基于falling-star board,小伙伴们可以自行在自己的板子上实现,随着做,没问题的,同时呢,本次利用的是RT-Thread平台。
新建RT_Thread工程文件->新建->RT_Thread项目
工程名字,自己起个名字就OK了,把稳不要含有中文基于芯片RT_thread版本选择最新的即可芯片选择STM32F103RE(选择自己的~)掌握台串口,根据板子硬件设计选择调试器及接口 ST_LINK+SWD 逐步等待完成即可 本次用到的组件很少,基本上默认掌握台,串口,PIN就可以了cubemx配置
喜好用cubemx的小伙伴,用了rt-thread并不是意味着要放弃cubemx了,rt-thread与cubemx的完美结合,让开发变得更加轻松,接下来,且看如何结合~
选中cubemx settings,double click即可打开cubemx,逐步等待~
打开之后可能会创造封装不太对,一个办法是不用改,MCU资源和操作完备一样的,不会影响,另一个办法是改了它,据小伙伴说,cubemx文件可以用记事本打开,哦呵,真的是打开之后,一大堆配置项,长见识了,修正一下就可以了。
接下来便是cubemx配置的问题了~旧调重弹了,各位看官麻烦移步:cubemx的精确打开办法 从最上面的事理剖析,我们可以知道,须要掌握的引脚有3个,DATA、SCLK、RCLK,上图,实际上小飞哥买的是4位的,8位的多了个级联,且来看看4位的如何驱动
硬件连接为
MCU 数码管 VCC 3.3V/5V RCLK PA0 SCLK PA1 DIO PA4 GND GND
串口1配置
时钟树图
配置完,关闭cubemx即可,可以看到,配置代码已经同步更新进来 串口配置代码
GPIO配置代码
Part3代码编写先在工程中添加一个新文件夹,迎来存放HC595的驱动代码,建立.c.h文件
先来对用到的IO做个大略的宏定义
/Copyright(c)2006-2021,RT-ThreadDevelopmentTeamSPDX-License-Identifier:Apache-2.0ChangeLogs:DateAuthorNotes2021-07-02Administratorthefirstversion/#ifndef_BSP_HC595_DRV_H_#define_BSP_HC595_DRV_H_#include<rtthread.h>#defineHC595_RCLKGET_PIN(A,0)#defineHC595_SCLKGET_PIN(A,1)#defineHC595_DIOGET_PIN(A,4)#defineRT_HC595_RCLK_HIGH(x)x?rt_pin_write(HC595_RCLK,PIN_HIGH):rt_pin_write(HC595_RCLK,PIN_LOW)#defineRT_HC595_SCLK(x)x?rt_pin_write(HC595_SCLK,PIN_HIGH):rt_pin_write(HC595_SCLK,PIN_LOW)#defineRT_HC595_DIO(x)x?rt_pin_write(HC595_DIO,PIN_HIGH):rt_pin_write(HC595_DIO,PIN_LOW)voidrt_HC595_PIN_Init(GPIO_TypeDefrclk_gpiox,uint16_trclk_gpio_pin,GPIO_TypeDefsclk_gpiox,uint16_tsclk_gpio_pin,GPIO_TypeDefdio_gpiox,uint16_tdio_gpio_pin);voidrt_Hc595_Display(rt_uint16_tdata);#endif/BSP_HC595_DRV_BSP_HC595_DRV_H_/
GPIO初始化,为了方便变动IO,对GPIO分组及GPIO_PIN作为参数传入初始化
voidrt_HC595_PIN_Init(GPIO_TypeDefrclk_gpiox,uint16_trclk_gpio_pin,GPIO_TypeDefsclk_gpiox,uint16_tsclk_gpio_pin,GPIO_TypeDefdio_gpiox,uint16_tdio_gpio_pin){rt_err_tresult;//初始化HC595用到的GPIOGPIO_InitTypeDefGPIO_Initure;__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_Initure.Pin=rclk_gpio_pin;GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;GPIO_Initure.Pull=GPIO_PULLDOWN;GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(rclk_gpiox,&GPIO_Initure);HAL_GPIO_WritePin(rclk_gpiox,rclk_gpio_pin,GPIO_PIN_RESET);GPIO_Initure.Pin=sclk_gpio_pin;GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;GPIO_Initure.Pull=GPIO_PULLDOWN;GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(sclk_gpiox,&GPIO_Initure);HAL_GPIO_WritePin(sclk_gpiox,sclk_gpio_pin,GPIO_PIN_RESET);GPIO_Initure.Pin=dio_gpio_pin;GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;GPIO_Initure.Pull=GPIO_PULLDOWN;GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(dio_gpiox,&GPIO_Initure);HAL_GPIO_WritePin(dio_gpiox,dio_gpio_pin,GPIO_PIN_RESET);returnresult;}
数码管编码
unsignedcharLED_0F[]={//0123456789AbCdEF-0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf};unsignedcharLED[8]={1,2,3,4,5,6,7,8};//用于LED的8位显示缓存
单字节数据写入函数
voidrt_HC595_DataWrite(rt_uint8_tdata){rt_uint8_ti;for(i=8;i>=1;i--){if(data&0x80)RT_HC595_DIO(1);elseRT_HC595_DIO(0);data<<=1;RT_HC595_SCLK(0);display(50);RT_HC595_SCLK(1);}}
数码管显示函数,这里封装得比较大略,数据输入,显示不同位,共4位
voidrt_Hc595_Display(rt_uint16_tdata){unsignedcharled_table;//查表指针unsignedchari,j=0;rt_uint8_tdisplaydata[4]={0};displaydata[0]=data/1000;displaydata[1]=data/100%10;displaydata[2]=data/10%10;displaydata[3]=data%10;for(j=0;j<4;j++){led_table=LED_0F+displaydata[j];i=led_table;//掌握小数点显示if(0x08>>j==2){i&=0x7f;}rt_HC595_DataWrite(i);rt_HC595_DataWrite(0x08>>j);RT_HC595_RCLK_HIGH(0);RT_HC595_RCLK_HIGH(1);}}
Part4效果演示
关注"大众号,后台回答“74HC595”,即可获取本次实验源码,欢迎添加小飞哥微信,进群互换~