加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

嵌入式外设-数码管显示小数与整数(74HC595)驱动代码编写

06/11 09:48
8452
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
    • 一、前言
    • 二、资料获取
    •  三、设备使用
    • 四、代码编写
    •  五、参考
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

一、前言

### 数码管
数码管(Digital Display)是一种用来显示数字和一些字符的电子元件。它通常由多个发光二极管(LED)组成,这些LED排列成一定的形状,例如圆形、棒状或条状,通过不同的排列组合来表示不同的数字和符号。根据LED的排列方式,数码管可以分为一位数码管、两位数码管、四位数码管等。

### 74HC595
74HC595是一款8位串行输入、并行输出的移位寄存器芯片。它内部包含8个串入、串/并出移位寄存器和8位三态输出锁存器。其主要引脚包括:

- SER:串行数据输入端
- SRCLK:移位寄存器时钟输入端
- RCLK:输出寄存器时钟输入端
- OE:输出使能控制端
- Q0~Q7:8位并行输出端

74HC595的工作原理是:在SRCLK的上升沿时,串行输入数据(SER)移入寄存器;在RCLK的上升沿时,寄存器的数据置入锁存器。通过控制SER、SRCLK、RCLK三个引脚,可以实现对数码管的控制。

### 74HC595数码管驱动电路
在使用74HC595驱动数码管时,通常需要将数码管的各个段(Segment)连接到74HC595的并行输出端(Q0~Q7),同时将数码管的位选(Common)引脚连接到74HC595的某个输出端,用于控制数码管的显示。

二、资料获取

关注微信公众号--星之援工作室 发送关键字(74HC595

网上资料很多,但是大部分都不是特别全面,我这里是在他们的基础上优化和改进了一下
可以判断多位显示以及小数点显示等

➡️➡️

 三、设备使用

接线

接线方式如下,可根据个人喜好进行引脚的切换

 演示

这里我采用的两位数码管进行显示

这是没有小数点的显示 效果

这是显示小数点的显示 效果,小数点我设置在第二位的

四、代码编写

main.c

主程序可更改显示的数据


/*接线 
VCC------------>供电
DIO------------>PB9
SCLK------------>PB8 
LOAD------------>PB7 
GND------------>接地

可自动判断显示的位数 
可设置小数点显示的位置,也可以不显示
*/
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "HC595.h"

int main(void)
{
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	// LED 端口初始化 
	LED_GPIO_Config();
	// 串口初始化
	uart_init(115200);
	//数码管初始化
	HC595_Init();
	printf("init okn");
	
	while ( 1 )
	{
		HC595_Send_Data(0,66);
	}
}

HC595.h

可更改配置的IO口

#ifndef __HC595_H
#define	__HC595_H
#include "stm32f10x.h"

/* 定义IIC连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
#define HC595_DIO_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define HC595_DIO_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define HC595_DIO_GPIO_PIN		    GPIO_Pin_9

#define HC595_CLK_GPIO_PORT    	GPIOB		                /* GPIO端口 */
#define HC595_CLK_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define HC595_CLK_GPIO_PIN			  GPIO_Pin_8

#define HC595_LOA_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define HC595_LOA_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define HC595_LOA_GPIO_PIN		    GPIO_Pin_7

#define HC595_DIO_OUT PBout(9)
#define HC595_SCK_OUT PBout(8)
#define HC595_LOA_OUT PBout(7)

// 端口初始化
void HC595_Init( void );
// 串入
void HC595_Send_Byte(unsigned char byte);
// 并出 
// X 表示小数点显示的位置 Y表示显示的数据
void HC595_Send_Data( u8 x, u16 y);

#endif /* __HC595_H */

HC595.c

#include "HC595.h"
#include "delay.h"
 
unsigned char  LED_table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0x00};//0 1 2 3 4 5 6 7 8 9 A B C D F  //  共阳数码管

//端口初始化
void HC595_Init( void )
{
 
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd( HC595_CLK_GPIO_CLK | HC595_DIO_GPIO_CLK | HC595_LOA_GPIO_CLK, ENABLE );

	GPIO_InitStructure.GPIO_Pin = HC595_CLK_GPIO_PIN | HC595_DIO_GPIO_PIN|HC595_LOA_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init( HC595_CLK_GPIO_PORT, &GPIO_InitStructure );
	
	HC595_DIO_OUT = 0;
	HC595_SCK_OUT = 0;
	HC595_LOA_OUT = 0;
}
//串入
void HC595_Send_Byte(unsigned char byte)
{
	uint8_t i;
	for(i=0;i<8;i++)  
	{
		HC595_SCK_OUT = 0;
		delay_ms(10);
		if(0x80&byte)
			HC595_DIO_OUT = 1;
		else
			HC595_DIO_OUT = 0;
		byte = byte <<1 ;
		delay_ms(10);
		HC595_SCK_OUT =1;
		delay_ms(10);
	}
	HC595_DIO_OUT = 0;
	HC595_SCK_OUT = 0;	

}
// 并出 
// X 表示小数点显示的位置 Y表示显示的数据
void HC595_Send_Data(u8 x, u16 y)
{
	static unsigned int thousand_bit, hundred_bit, ten_bit, single_bit;
	
	thousand_bit = y / 1000;
	hundred_bit = (y % 1000) / 100;
	ten_bit =y % 1000 % 100 / 10;
	single_bit = y % 10;
	// 自动反馈位数 , 选择小数点

	switch(x){
		case 0: {
			if(y>9){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]);
			}else if(y>99){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]);
				HC595_Send_Byte(LED_table[hundred_bit]);
			}else if(y>999){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]);
				HC595_Send_Byte(LED_table[hundred_bit]);
				HC595_Send_Byte(LED_table[thousand_bit]);
			}else{
				HC595_Send_Byte(LED_table[single_bit]);
			}
		}break;
		case 1: {
			if(y>9){
				HC595_Send_Byte(LED_table[single_bit]+0x80);
				HC595_Send_Byte(LED_table[ten_bit]);
			}else if(y>99){
				HC595_Send_Byte(LED_table[single_bit]+0x80);
				HC595_Send_Byte(LED_table[ten_bit]);
				HC595_Send_Byte(LED_table[hundred_bit]);
			}else if(y>999){
				HC595_Send_Byte(LED_table[single_bit]+0x80);
				HC595_Send_Byte(LED_table[ten_bit]);
				HC595_Send_Byte(LED_table[hundred_bit]);
				HC595_Send_Byte(LED_table[thousand_bit]);
			}else{
				HC595_Send_Byte(LED_table[single_bit]+0x80);
			}
		}break;
		case 2: {
			if(y>9){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]+0x80);
			}else if(y>99){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]+0x80);
				HC595_Send_Byte(LED_table[hundred_bit]);
			}else if(y>999){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]+0x80);
				HC595_Send_Byte(LED_table[hundred_bit]);
				HC595_Send_Byte(LED_table[thousand_bit]);
			}else{
				HC595_Send_Byte(LED_table[single_bit]);
			}
		}break;
		case 3: {
			if(y>9){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]);
			}else if(y>99){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]);
				HC595_Send_Byte(LED_table[hundred_bit]+0x80);
			}else if(y>999){
				HC595_Send_Byte(LED_table[single_bit]);
				HC595_Send_Byte(LED_table[ten_bit]);
				HC595_Send_Byte(LED_table[hundred_bit]+0x80);
				HC595_Send_Byte(LED_table[thousand_bit]);
			}else{
				HC595_Send_Byte(LED_table[single_bit]);
			}
		}
	}
	HC595_LOA_OUT = 1;
	delay_ms(10);
	HC595_LOA_OUT = 0;
}




 五、参考

STM32学习记录——74HC595四位数码管显示icon-default.png?t=N7T8https://blog.csdn.net/stm_white/article/details/116039956?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171651582716800211575717%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171651582716800211575717&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-116039956-null-null.142%5Ev100%5Epc_search_result_base7&utm_term=stm332%2074hc595%E6%95%B0%E7%A0%81%E7%AE%A1%E6%98%BE%E7%A4%BA&spm=1018.2226.3001.4187

【STM32学习】(14)两个74HC595控制四个数码管显示icon-default.png?t=N7T8https://blog.csdn.net/XiaoCaiDaYong/article/details/105584177?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171651960616800211557784%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171651960616800211557784&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-7-105584177-null-null.nonecase&utm_term=stm332%2074hc595%E6%95%B0%E7%A0%81%E7%AE%A1%E6%98%BE%E7%A4%BA&spm=1018.2226.3001.4450


联系方式 微信号:13648103287

  • 联系方式.docx

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
STM32F207ZGT6 1 STMicroelectronics High-performance Arm Cortex-M3 MCU with 1 Mbyte of Flash memory, 120 MHz CPU, ART Accelerator, Ethernet

ECAD模型

下载ECAD模型
$13.88 查看
FT2232HL-REEL 1 FTDI Chip USB Bus Controller, CMOS, PQFP64, LEAD FREE, LQFP-64

ECAD模型

下载ECAD模型
$6.27 查看
ATMEGA328P-PU 1 Microchip Technology Inc IC MCU 8BIT 32KB FLASH 28DIP

ECAD模型

下载ECAD模型
$3.98 查看

相关推荐

电子产业图谱

方案定制,程序设计方案、单片机程序设计与讲解、APP定制开发。本公众号致力于向读者传递关于程序设计和开发的相关知识,并分享一些关于软件开发的最佳实践。如果您有什么问题或建议,请随时联系我们。我们将竭诚为您服务