当前位置: 代码网 > 科技>人工智能 > 【STM32+HAL+Proteus】系列学习教程---74HC595驱动数码管

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

2024年08月01日 人工智能 我要评论
74HC595的数据来源于14脚,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。假如,我们要将二进制数据0111 1111 输入到74HC595的移位寄存器中,下面来上一张动态图,模拟了前2个位输入的情景。8位数据输入完成后,给12脚一个上升沿,数据从位移寄存器转移到存储寄存器。

实现目标

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驱动程序

/* user code begin 4 */

void hc595_send_byte(unsigned  char byte)
{
	unsigned  char i;
	for (i = 0; i < 8; i ++)  //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
	{
	  /****  步骤1:将数据传到ds引脚    ****/
		if (byte & 0x80)        //先传输高位,通过与运算判断第八是否为1
		  hal_gpio_writepin(gpioa, data_pin, gpio_pin_set); //如果第八位是1,则与 595 ds连接的引脚输出高电平
		else                    //否则输出低电平
		  hal_gpio_writepin(gpioa, data_pin, gpio_pin_reset);		
			
		/*** 步骤2:shcp每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
      hal_gpio_writepin(gpioa, shcp_pin, gpio_pin_reset);	 // shcp拉低	          
      for_delay_us(5);	// 适当延时	
		
      hal_gpio_writepin(gpioa, shcp_pin, gpio_pin_set);		// shcp拉高, shcp产生上升沿	
      for_delay_us(5);				
		  byte <<= 1;		// 左移一位,将低位往高位移,通过	if (byte & 0x80)判断低位是否为1
	}
	
	/**  步骤3:stcp产生一个上升沿,移位寄存器的数据移入存储寄存器  **/ 
   hal_gpio_writepin(stcp_gpio_port, stcp_pin, gpio_pin_reset);	// 将stcp拉低
   for_delay_us(5);		
   hal_gpio_writepin(stcp_gpio_port, stcp_pin, gpio_pin_set);// 再将stcp拉高,stcp即可产生一个上升沿	
   for_delay_us(5);	
}

/*
for循环实现延时us
*/
void for_delay_us(uint32_t nus)
{
 uint32_t delay = nus * 168/4;
 do
 {
//  __nop();
 }
 while (delay --);
}


/* user code end 4 */

2、共阳数码管码表

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

3、函数申明

void hc595_send_byte(unsigned  char byte);
void for_delay_us(uint32_t nus);

4、动态显示数字“123”

  while (1)
  {
		hal_gpio_writepin(gpioa, seg1_pin, gpio_pin_set);
		hal_gpio_writepin(gpioa, seg2_pin, gpio_pin_reset);		
		hal_gpio_writepin(gpiob, seg3_pin, gpio_pin_reset);		
		hc595_send_byte(table[1]);//函数调用			
    for_delay_us(5);	// 适当延时	
		hc595_send_byte(0xff);	//	消影
		
		hal_gpio_writepin(gpioa, seg2_pin, gpio_pin_set);
		hal_gpio_writepin(gpioa, seg1_pin, gpio_pin_reset);		
		hal_gpio_writepin(gpiob, seg3_pin, gpio_pin_reset);		
		hc595_send_byte(table[2]);//函数调用			
    for_delay_us(5);	// 适当延时	
		hc595_send_byte(0xff);//	消影	
		
		hal_gpio_writepin(gpioa, seg2_pin, gpio_pin_reset);
		hal_gpio_writepin(gpioa, seg1_pin, gpio_pin_reset);		
		hal_gpio_writepin(gpiob, seg3_pin, gpio_pin_set);		
		hc595_send_byte(table[3]);//函数调用				
    for_delay_us(5);	// 适当延时	
		hc595_send_byte(0xff);//	消影
    /* user code end while */

    /* user code begin 3 */
  }

五、实验现象

六、仿真实现


总结

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com