STM32 4位数码管和74HC595

4位数码管

在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共有12个IO口。

当选择数码管1显示的时候,这可以选择1(位选)然后再根据1位数码管的原理(段选)显示这个数码管。

动态显示

根据人眼视觉残留的原理,在显示的时候,位选依次选择数码管,然后段选控制数码管显示。这种依次选择依次显示的速度非常快,快到人眼反应不过来,从而使4位数码管上的数字同时显示(只是人眼看上去同时显示)。

消影

在动态显示的时候,会发现数码管在闪烁,这是位选和段选不同步导致的。我们可以通过加延迟,或者置零来解决这个问题,这就是常说的消影。

如果还想用更少的引脚控制4位数码管,我们可以使用74HC595。

74HC595

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

|---------|------------|-------------|
| 符号 | 引脚 | 描述 |
| Q0---Q7 | 第15脚,第1-7脚 | 8位并行数据输出 |
| GND | 第8脚 | 地 |
| Q7 | 第9脚 | 串行数据输出 |
| /MR | 第10脚 | 主复位(低电平有效) |
| SH_CP | 第11脚 | 数据输入时钟线 |
| ST_CP | 第12脚 | 输出存储器锁存时钟线 |
| /OE | 第13脚 | 输出有效(第电平有效) |
| DS | 第14脚 | 串行数据输入 |
| VCC | 第16脚 | 电源 |
[74HC595引脚]

串入并出

当我们给DS依次输入8个bit的数据,会同时在Q0-Q7输出,那不就可以只用1个IO口连接到DS,相当于扩展成8个IO口。而4位数码管要12个IO口,那用2个74HC595不就好了。

串入串出

从原理图上我们可以看见74HC595(1)(左侧的)的QH'连接到了74HC595(2)的SER,也就是一个74HC595的串行输出连接到了下一个74HC595的串行输入。

当输入的数据超出并行输出的范围时,会依次顶替之前的数据,当输入16位数据时,原先输入到74HC595(1)的数据D0-D7,就会顶替掉成D8-D15,而被顶替的数据则通过QH'到SER的连接传输到74HC595(2)中,使其位D0-D7。

第一个74HC595(左侧的)用于选择数码管(位选),第二个74HC595用于显示数码管(段选)。

SH_CP和ST_CP

  • SH_CP(11脚):上升沿数据寄存器的数据移位。Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器数据不变。
  • ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将ST_CP置为低电平,当移位结束后,在ST_CP端产生一个正脉冲,更新显示数据

使用方法

第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。

方法:送位数据到_595。

第二步:目的:将位数据逐位移入74HC595,即数据串入

方法:SH_CP产生一上升沿,将DS上的数据移入74HC595移位寄存器中,先送低位,后送高位。(应该是先送高位)

第三步:目的:并行输出数据。即数据并出

方法:ST_CP产生一上升沿,将由DS上已移入数据寄存器中的数据

送入到输出锁存器

说明: 从上可分析:从SH_CP产生一上升沿(移入数据)和ST_CP产生一上升沿(输出数据)是二个独立过程,实际应用时互不干扰。即可输出数据的 同时移入数据。

引脚连接

P1的5个IO口连接单片机,而P2通过级联可以继续接数码管。

输入顺序

从图中可以看到数据是QA-QB-QC...QH,最先输入的是QA。

上图最后一行PARALLEL OUTPUTS(并行输出),可以知道QA是高位。

代码

bsp_74HC595.c

cpp 复制代码
#include "bsp_74HC595.h"

unsigned int num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x00};

void HC595_GPIO_Configuration()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

	GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
	GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
	GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET);
}
//串入
void HC595_Send_Byte(unsigned char num)
{
	unsigned int i;
	for(i = 0;i<8;i++)
	{
		if(num & 0x80)//取最高位 1000 0000
		{
			GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_SET);
		}
		else
		{
			GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET);
		}
		GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET);
		Delay_us(10);
		GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
		Delay_us(10);
		
		num <<=1;
	}
}
//并出
void HC595_Send_Data(unsigned char num,unsigned char show_bit)
{
	HC595_Send_Byte(num);
	HC595_Send_Byte(1 << show_bit);//高4位没有用

	GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
	Delay_us(10);
	GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
	Delay_us(10);
}

bsp_74HC595.h

cpp 复制代码
#ifndef __BSP_74HC595_H__
#define __BSP_74HC595_H__

#include<stm32f10x.h>
#include "Delay.h"
extern unsigned num[];
void HC595_GPIO_Configuration(void);

void HC595_Send_Data(unsigned char num,unsigned char show_bit);

void HC595_Send_Byte(unsigned char num);

#endif

main.c

cpp 复制代码
int main(void)
{
	
	HC595_GPIO_Configuration();
	while(1)
	{
		HC595_Send_Data(num[2],4);//4号数码管,显示数字2
		HC595_Send_Data(num[0],1);//1号数码管,显示数字0
		HC595_Send_Data(num[3],2);//2号数码管,显示数字3
	}
}
相关推荐
yuanbenshidiaos13 分钟前
c++------------------函数
开发语言·c++
yuanbenshidiaos17 分钟前
C++----------函数的调用机制
java·c++·算法
兔C32 分钟前
微信小程序的轮播图学习报告
学习·微信小程序·小程序
海海不掉头发39 分钟前
苍穹外卖-day05redis 缓存的学习
学习·缓存
tianmu_sama41 分钟前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
羚羊角uou1 小时前
【C++】优先级队列以及仿函数
开发语言·c++
姚先生971 小时前
LeetCode 54. 螺旋矩阵 (C++实现)
c++·leetcode·矩阵
FeboReigns1 小时前
C++简明教程(文章要求学过一点C语言)(1)
c语言·开发语言·c++
FeboReigns1 小时前
C++简明教程(文章要求学过一点C语言)(2)
c语言·开发语言·c++
小木_.2 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器