当前位置:   article > 正文

【STM32+HAL+Proteus】系列学习教程---74HC595驱动数码管

74hc595驱动数码管

实现目标

1、三位数码动态扫描;

2、STM32F103 HAL库驱动74HC595 芯片。


一、74HC595 芯片

       74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

                                                       74HC595管脚介绍及逻辑表

        74HC595的数据来源于14脚,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。假如,我们要将二进制数据0111 1111 输入到74HC595的移位寄存器中,下面来上一张动态图,模拟了前2个位输入的情景。

       8位数据输入完成后,给12脚一个上升沿,数据从位移寄存器转移到存储寄存器。

二、原理图设计

三、STM32CubeMX 配置

1.管脚配置

四、程序设计

1、74HC595驱动程序

  1. /* USER CODE BEGIN 4 */
  2. void HC595_Send_Byte(unsigned char byte)
  3. {
  4. unsigned char i;
  5. for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
  6. {
  7. /**** 步骤1:将数据传到DS引脚 ****/
  8. if (byte & 0x80) //先传输高位,通过与运算判断第八是否为1
  9. HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_SET); //如果第八位是1,则与 595 DS连接的引脚输出高电平
  10. else //否则输出低电平
  11. HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_RESET);
  12. /*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
  13. HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_RESET); // SHCP拉低
  14. for_delay_us(5); // 适当延时
  15. HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_SET); // SHCP拉高, SHCP产生上升沿
  16. for_delay_us(5);
  17. byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
  18. }
  19. /** 步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器 **/
  20. HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_RESET); // 将STCP拉低
  21. for_delay_us(5);
  22. HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_SET);// 再将STCP拉高,STCP即可产生一个上升沿
  23. for_delay_us(5);
  24. }
  25. /*
  26. for循环实现延时us
  27. */
  28. void for_delay_us(uint32_t nus)
  29. {
  30. uint32_t Delay = nus * 168/4;
  31. do
  32. {
  33. // __NOP();
  34. }
  35. while (Delay --);
  36. }
  37. /* USER CODE END 4 */

2、共阳数码管码表

  1. //共阳数码管码表
  2. char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

3、函数申明

  1. void HC595_Send_Byte(unsigned char byte);
  2. void for_delay_us(uint32_t nus);

4、动态显示数字“123”

  1. while (1)
  2. {
  3. HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_SET);
  4. HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);
  5. HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);
  6. HC595_Send_Byte(table[1]);//函数调用
  7. for_delay_us(5); // 适当延时
  8. HC595_Send_Byte(0xff); // 消影
  9. HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_SET);
  10. HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);
  11. HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);
  12. HC595_Send_Byte(table[2]);//函数调用
  13. for_delay_us(5); // 适当延时
  14. HC595_Send_Byte(0xff);// 消影
  15. HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);
  16. HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);
  17. HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_SET);
  18. HC595_Send_Byte(table[3]);//函数调用
  19. for_delay_us(5); // 适当延时
  20. HC595_Send_Byte(0xff);// 消影
  21. /* USER CODE END WHILE */
  22. /* USER CODE BEGIN 3 */
  23. }

五、实验现象

六、仿真实现


总结

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/801795
推荐阅读
相关标签
  

闽ICP备14008679号