蓝桥杯嵌入式——数码管详解
由电路图,控制数码管显示的关键,就是掌握这个“
SN74LS595N
” 移位数据锁存器的工作原理。
一、芯片内部结构
假设你数电知识还可,能看出芯片内部结构是一个移位寄存器:
-
SRCLR/
复位端口,低电平有效。一般默认接VCC。 -
数据从
SER
进入,在SRCK的时钟触发下,上升沿数据移位,下降沿数据保持。当数据移动8次之后,即SRCK发生8次高低电平的翻转。8bit的数据已经完全输入到
移位数据寄存器
。 -
之后给
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 版权协议,转载请附上原文出处链接和本声明。