1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 74LS595 74HC595使用方法以及驱动数码管显示(附:使用代码)

74LS595 74HC595使用方法以及驱动数码管显示(附:使用代码)

时间:2018-10-20 20:30:42

相关推荐

74LS595 74HC595使用方法以及驱动数码管显示(附:使用代码)

74LS595 74HC595使用方法以及驱动数码管显示(附:使用代码)

由于74HC595与74LS595功能是一样的没有区别。LS和HC代表不同工作速度,HC代表CMOS芯片电路中工作速度最高的产品,LS表示普及、通用型产品。其驱动方法也是一样的。

器件功能

74LS595是串行输入并行输出的器件,可以串联使用,达到引脚拓展的目的。主要引用在数码管的驱动,点阵的驱动等需要多个引脚的地方。

内部结构和控制时序

74LS595有三部分组成,包括:一个8位移位寄存器、一个8位数据存储器、一个8位三态输出控制器(高电平 低电平 高阻态)。

SHCP为串行数据输入时钟,在器上升沿,移位寄存器发生位移;DS为串行数据输入引脚,在SHCP为上升沿时数据写入移位寄存器;STOP为数据存储器存储信号线,在其上升沿将移位寄存器的8位数据存入存储寄存器;MR为D触发器正常工作引脚,所以芯片正常工作时,此引脚要一直置于高电平;OE为数据并行输出引脚,其为低电平时,数据寄存器的数据并行输出,其为高电平时,引脚表现出高阻态。具体引脚功能如下图所示。

使用代码讲解

以下为3片74LS595串联驱动3个8段数码管的代码讲解,驱动其他外设与其类似可以在其基础上修改。

//以下为HAL库引脚初始化代码,使用库函数可以在此基础上修改,所需引脚设置为推挽输出即可,寄存器版本控制CHR、CHL、BSRR、BRR等寄存器即可。void LCD_CtrlLinesConfig(void){GPIO_InitTypeDef GPIO_InitStruct = {0};//定义尹伽婆初始化结构体__HAL_RCC_GPIOA_CLK_ENABLE(); //使能时钟线AGPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3; //选择所需初始化引脚GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//选择推挽输出模式GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;//输出速度为高GPIO_InitStruct.Pull = GPIO_NOPULL; //既不上拉也不下拉HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //进行初始化GPIOA->BSRR |= 0x000E; //设置A1 A2 A3输出为高}

//以下为串行输入引脚、移位寄存器控制引脚、时钟引脚宏定义#define STOP(i) if(i) GPIOA->ODR= GPIOA->ODR&~0X00000004 |(1<<2); else GPIOA->ODR= GPIOA->ODR&~0X00000004 |(0<<2); //对A2输出电平进行宏定义#define SHCP(i) if(i) GPIOA->ODR= GPIOA->ODR&~0X00000008 |(1<<3); else GPIOA->ODR= GPIOA->ODR&~0X00000008 |(0<<3); //对A3输出电平进行宏定义#define DS(i) if(i) GPIOA->ODR= GPIOA->ODR&~0X00000002 |(1<<1); else GPIOA->ODR= GPIOA->ODR&~0X00000002 |(0<<1); //对A1输出电平进行宏定义

以下是调用函数,实现数码管显示不同的字形,可以在此函数上进行拓展实现不同的显示功能

void Disp_Smg(uint8_t Bit1,uint8_t Bit2,uint8_t Bit3) //数码管显示{static uint8_t Seg7[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; //数码管字形存储数组static uint8_t i=0; //循环所用变量static uint32_t code_temp=0; //数据存储变量code_temp= (Seg7[Bit3]<<16) + (Seg7[Bit2]<<8) + Seg7[Bit1]; //将数据存入暂存变量for(i=0;i<24;i++) //三个数码管共24位所以上限设置为24{if(code_temp & 0X800000) //先传送最高位DS(1) //最高位为1elseDS(0) //最高位为0code_temp=code_temp<<1; //数组左移,次高位进入最高位SHCP(0) //为上升沿做准备SHCP(1)//出现上升沿进行移位存储}STOP(0); //为上升沿做准备STOP(1); //出现上升沿进行数据存储}

//由于此代码直接对数据进行显示,所以OE引脚一直连接的低电平,需要暂存显示的可以附加对OE引脚发控制。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。