文章目录
- 前言
- 一、原理图
- 二、由原理图得到的信息
- 三、seg初始化
- 四、seg应用函数
- 五、seg在主函数的应用方法
前言 【蓝桥杯嵌入式|蓝桥杯嵌入式国赛 ---- 数码管】本文是基于嵌入式开发板CT117E,stm32f103RBT6。
一、原理图
文章图片
二、由原理图得到的信息
- 原理图重点关注的有三个口 :SER,SCK,RCLK。
- 原理图的U1,U2,U3数据段互相连在一起。
- 数码管是共阴数码管。所以是输入高电平有效。
- SER: 74LS595串行数据输入引脚。主要用于输入高电平或者低电平。
- SCK: 4LS595串行存储时钟输入引脚。主要用于使能移位,如使数据从U1的QA到U3的QH。
- RLCK: 74LS595串行移位时钟输入引脚。主要使能数据从74LS595传输到数码管。
#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);
}
推荐阅读
- ROS机器人学习——TF坐标变换
- 硬件工程师|单片机是不是嵌入式呢,老生常谈了
- 单片机|GPIO相关寄存器
- 硬件小制作|单片机如何输出4-20ma电流信号()
- 蓝桥杯单片机备赛|蓝桥杯单片机进阶模块--NE555
- 单片机|单片机进阶---PCB开发之照葫芦画瓢(一)
- 单片机stm32|学习单片机切记这四点要求,少走弯路
- 嵌入式|STM32控制WS2812灯带【含完整代码】
- 芯片|芯片之家精选文章合集 (二)(收藏起来慢慢看)