【蓝桥杯嵌入式扩展板】数码管详解(附程序源码)

蓝桥杯嵌入式——数码管详解

由电路图,控制数码管显示的关键,就是掌握这个“SN74LS595N” 移位数据锁存器的工作原理。

一、芯片内部结构

在这里插入图片描述
假设你数电知识还可,能看出芯片内部结构是一个移位寄存器:

  1. SRCLR/ 复位端口,低电平有效。一般默认接VCC。
  2. 数据从SER进入,在SRCK的时钟触发下,上升沿数据移位,下降沿数据保持。当数据移动8次之后,即SRCK发生8次高低电平的翻转。8bit的数据已经完全输入到 移位数据寄存器
  3. 之后给RCK 一个上升沿,595移位数据寄存器的数据全部输入到数据寄存器进行输出。
    这是一个595芯片,将三个595,联结到一起,进行拓展。控制三个数码管,本来是八位,拓展后,变成24位,即SER不断输入数据,然后SRCK共翻转24次,将24bit的数据输入到 移位数据寄存器.之后RCK的一个上升沿,使得数据输出到数据寄存器,三位数码管显示

二、原理图

实验前,先连接对应跳帽 [A1->SER][A2->RCK][A3->SCK]
在这里插入图片描述
之后分析数码管对应的原理图
在这里插入图片描述
三、编程
1、void SEG_GPIO_Config(void)

void SEG_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(SEG_GPIO_SER_CLK|
						   SEG_GPIO_RCK_CLK|
						   SEG_GPIO_SCK_CLK,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_InitStruct.GPIO_Pin = SEG_GPIO_SER_PIN;		//SER
	GPIO_Init(SEG_GPIO_SER_PORT,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = SEG_GPIO_RCK_PIN;		//RCK
	GPIO_Init(SEG_GPIO_RCK_PORT,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = SEG_GPIO_SCK_PIN;		//SCK
	GPIO_Init(SEG_GPIO_SCK_PORT,&GPIO_InitStruct);
}

2、void SEG_Display(uint8_t Seg1,uint8_t Seg2,uint8_t Seg3)


uint8_t Seg7[17] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
					 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; 
void SEG_Display(uint8_t Seg1,uint8_t Seg2,uint8_t Seg3)
{
	uint8_t i = 0;
	uint8_t	seg_temp = 0;
	
	seg_temp = Seg7[Seg3]; //从码表读出Seg3对应的码值
	for(i = 0;i<8;i++)
	{
		SCK_L;		//先拉低,等待SER数据输入
		if(seg_temp&0x80)  //取出最高位
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_H;		//高电平触发移位
		seg_temp = seg_temp<<1;//左移一位
	}
	seg_temp = Seg7[Seg2];
	for(i = 0;i<8;i++)
	{
		SCK_L;
		if(seg_temp&0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_H;
		seg_temp = seg_temp<<1;
	}
	seg_temp = Seg7[Seg1];
	for(i = 0;i<8;i++)
	{
		SCK_L;
		if(seg_temp&0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_H;
		seg_temp = seg_temp<<1;
	}
	RCK_H;
	RCK_L;
}

3、头文件

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

#define SEG_GPIO_SER_PORT		GPIOA
#define SEG_GPIO_SER_PIN		GPIO_Pin_1
#define SEG_GPIO_SER_CLK		RCC_APB2Periph_GPIOA

#define SEG_GPIO_RCK_PORT		GPIOA
#define SEG_GPIO_RCK_PIN		GPIO_Pin_2
#define SEG_GPIO_RCK_CLK		RCC_APB2Periph_GPIOA

#define SEG_GPIO_SCK_PORT		GPIOA
#define SEG_GPIO_SCK_PIN		GPIO_Pin_3
#define SEG_GPIO_SCK_CLK		RCC_APB2Periph_GPIOA

#define	SER_H					GPIO_SetBits(SEG_GPIO_SER_PORT,SEG_GPIO_SER_PIN)
#define	SER_L					GPIO_ResetBits(SEG_GPIO_SER_PORT,SEG_GPIO_SER_PIN)

#define	RCK_H					GPIO_SetBits(SEG_GPIO_RCK_PORT,SEG_GPIO_RCK_PIN)
#define	RCK_L					GPIO_ResetBits(SEG_GPIO_RCK_PORT,SEG_GPIO_RCK_PIN)

#define	SCK_H					GPIO_SetBits(SEG_GPIO_SCK_PORT,SEG_GPIO_SCK_PIN)
#define	SCK_L					GPIO_ResetBits(SEG_GPIO_SCK_PORT,SEG_GPIO_SCK_PIN)

void SEG_GPIO_Config(void);
void SEG_Display(uint8_t Seg1,uint8_t Seg2,uint8_t Seg3);

#endif /*_BSP_SEG_H*/

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
为驱动数码管,常用的方法有两种:共阳极和共阴极。下面分别介绍两种方法的实现。 共阳极数码管驱动: 共阳极数码管的每个显示单元的阳极都连接在一起,共用一根引脚,而且每个显示单元的阴极都独立连接。因此,要点亮某个数码管的某一位,就需要将对应的阴极接地,同时将阳极接到电源上。 具体实现方法如下: 1.定义一个数组,存储每个数码管的阴极引脚号码; 2.定义一个数组,存储每个数字在数码管中的编码; 3.循环扫描每个数码管,依次点亮每一位数字; 4.在每个数码管的阴极引脚上输出低电平,点亮对应的数字; 5.在每个数码管的阴极引脚上输出高电平,熄灭数字。 共阴极数码管驱动: 共阴极数码管的每个显示单元的阴极都连接在一起,共用一根引脚,而且每个显示单元的阳极都独立连接。因此,要点亮某个数码管的某一位,就需要将对应的阳极接地,同时将阴极接到电源上。 具体实现方法如下: 1.定义一个数组,存储每个数码管的阳极引脚号码; 2.定义一个数组,存储每个数字在数码管中的编码; 3.循环扫描每个数码管,依次点亮每一位数字; 4.在每个数码管的阳极引脚上输出低电平,点亮对应的数字; 5.在每个数码管的阳极引脚上输出高电平,熄灭数字。 以上是两种方法的实现原理,具体实现时可以根据需要选择其中一种。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Successful 、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值