蓝桥杯嵌入式国赛 ---- 数码管

文章目录

  • 前言
  • 一、原理图
  • 二、由原理图得到的信息
  • 三、seg初始化
  • 四、seg应用函数
  • 五、seg在主函数的应用方法


前言

本文是基于嵌入式开发板CT117E,stm32f103RBT6。

一、原理图

蓝桥杯嵌入式国赛 ---- 数码管_第1张图片

二、由原理图得到的信息

  • 原理图重点关注的有三个口 :SER,SCK,RCLK。
  • 原理图的U1,U2,U3数据段互相连在一起。
  • 数码管是共阴数码管。所以是输入高电平有效。
  • SER: 74LS595串行数据输入引脚。主要用于输入高电平或者低电平。
  • SCK: 4LS595串行存储时钟输入引脚。主要用于使能移位,如使数据从U1的QA到U3的QH。
  • RLCK: 74LS595串行移位时钟输入引脚。主要使能数据从74LS595传输到数码管。

三、seg初始化

seg.c

#include "seg.h"
u8 Seg[17] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00};
//0-F ,全灭不显示 
void seg_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	/* GPIOD Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  /* Configure PD0 and PD2 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

seg.h

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

#define SER_H GPIO_SetBits(GPIOA,GPIO_Pin_1);
#define SER_L GPIO_ResetBits(GPIOA,GPIO_Pin_1);

#define RCK_H GPIO_SetBits(GPIOA,GPIO_Pin_2);
#define RCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_2);

#define SCK_H GPIO_SetBits(GPIOA,GPIO_Pin_3);
#define SCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_3);


void seg_show(u8 bit1,u8 bit2,u8 bit3);
void seg_init(void);
#endif


四、seg应用函数

数码管的显示

void seg_show(u8 bit1,u8 bit2,u8 bit3)
{
	u8 i;
	u8 temp;
	temp=Seg[bit3];	   //看原理图,三个芯片74ls595互连,最底的是数码管3,所以先进bit3的数据,再进bit2,bit1;
	for(i=0;i<8;i++)
	{
		if(temp & 0x80)		  //取8位数据的最高位,判断是1 还是0 ,再存数据进芯片74ls595
		{
			SER_H;     //数据线传输1到芯片74ls595
		}
		else
		{
			SER_L;	   //数据线传输0到芯片74ls595
		}
		SCK_H;		   //同意数据移位进入芯片74ls595
		temp=temp<<1;   //循环取各个数据位
		SCK_L;
	}

	temp=Seg[bit2];				
	for(i=0;i<8;i++)
	{
		if(temp & 0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_H;
		temp=temp<<1;
		SCK_L;
	}

	temp=Seg[bit1];
	for(i=0;i<8;i++)
	{
		if(temp & 0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		SCK_H;
		temp=temp<<1;
		SCK_L;
	}
	RCK_H;		   //同意锁存的数据传到数码管
	RCK_L;
}

上面的数据必须从第三个数据开始进行传输,且数据应该从最高位开始,一位一位进行传输,最后才能准确地显示我们的数字。看下面这张图,举例我们要在第三个数码管显示0,那么原理图的U3的A-H就应该是0011 1111(0x3f),高电平有效,最高位存放的是H,所以我们在程序中,最先取最高位数据temp & 0x80,输入到U1芯片74LS595,U1,U2,U3相互连接,通过移位将0x3f的最高位0,移到U3的H引脚上,同理再将其他位一次移到A-G上,最后再使能RCLK,传输到数码管上显示。
蓝桥杯嵌入式国赛 ---- 数码管_第2张图片

五、seg在主函数的应用方法

	while(1)
	{
		seg_show(1,2,3)	;
		Delay_Ms(2000);
		seg_show(4,5,6)	;
		Delay_Ms(2000);	
	}

你可能感兴趣的