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


文章目录

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

前言 【蓝桥杯嵌入式|蓝桥杯嵌入式国赛 ---- 数码管】本文是基于嵌入式开发板CT117E,stm32f103RBT6。
一、原理图 蓝桥杯嵌入式|蓝桥杯嵌入式国赛 ---- 数码管
文章图片

二、由原理图得到的信息
  • 原理图重点关注的有三个口 :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,传输到数码管上显示。
蓝桥杯嵌入式|蓝桥杯嵌入式国赛 ---- 数码管
文章图片

五、seg在主函数的应用方法
while(1) { seg_show(1,2,3) ; Delay_Ms(2000); seg_show(4,5,6) ; Delay_Ms(2000); }

    推荐阅读