74LS595和74HC595驱动数码管显示的使用方法及代码详解

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

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

器件功能

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

内部结构和控制时序

74LS595内部框图
74LS595有三部分组成,包括:一个8位移位寄存器、一个8位数据存储器、一个8位三态输出控制器(高电平 低电平 高阻态)。
74LS595控制时序
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(); //使能时钟线A
    GPIO_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)  //最高位为1
		else
			DS(0) //最高位为0
		code_temp=code_temp<<1; //数组左移,次高位进入最高位
		SHCP(0) //为上升沿做准备
		SHCP(1)//出现上升沿进行移位存储
	}
	STOP(0); //为上升沿做准备
	STOP(1); //出现上升沿进行数据存储
}

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

物联沃分享整理
物联沃-IOTWORD物联网 » 74LS595和74HC595驱动数码管显示的使用方法及代码详解

发表评论