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

  • Post author:
  • Post category:其他




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

由电路图,控制数码管显示的关键,就是掌握这个“

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*/



版权声明:本文为qq_45689790原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。