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

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

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

一、芯片内部结构

【蓝桥杯嵌入式扩展板】数码管详解(附程序源码)_第1张图片
假设你数电知识还可,能看出芯片内部结构是一个移位寄存器:

  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]
【蓝桥杯嵌入式扩展板】数码管详解(附程序源码)_第2张图片
之后分析数码管对应的原理图
【蓝桥杯嵌入式扩展板】数码管详解(附程序源码)_第3张图片
三、编程
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*/

你可能感兴趣的:(STM32,STM32嵌入式学习,嵌入式,stm32,嵌入式,经验分享,单片机)