蓝桥杯嵌入式国赛之数码管学习笔记

本文介绍了共阴极数码管的工作原理,以及使用74LS595进行驱动的机制。通过HAL库实现了数码管的显示程序,详细展示了如何配置GPIO和编写控制代码来逐位移位并显示数字。同时,给出了标准库的实现方式作为对比。
摘要由CSDN通过智能技术生成

数码管原理

在这里插入图片描述
在这里插入图片描述
数码管存在共阴极和共阳极两种方式点亮,蓝桥杯嵌入式采用的是共阴极的接线方法(1点亮),共阳极(0点亮)的数码管的段码与共阴极的是互补

在这里插入图片描述
链接: 上图出处

74LS595原理

在这里插入图片描述
在这里插入图片描述

蓝桥杯嵌入式扩展版原理图

SCK是上升沿的时侯要把数据写入;
RCK是上升沿的时候数据才能锁存显示;

SER高低电平写入数据

在这里插入图片描述
需要用跳线帽把P3排针的前三个和P4排针的前三个连接在一起。

PA1->SER
PA2->RCK
PA3->SCK

程序代码

HAL库实现

在这里插入图片描述
将三个引脚设置为推挽输出GPIO_Mode_Out_PP。

#define ser_h HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET)
#define ser_l HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET)
#define rck_h HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)
#define rck_l HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)
#define sck_h HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET)
#define sck_l HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET)

u8 seg17[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void seg_show(u8 num1,u8 num2,u8 num3)
{
	u8 temp=seg17[num3];
	for(int i=0;i<8;i++)
	{
	  if(temp&0x80)
		{
	   	ser_h;
		}
		else
		{
		  ser_l;
		}
		sck_l;
		sck_h;
		temp=temp<<1;
	}
	
  temp=seg17[num2];
	for(int i=0;i<8;i++)
	{
	  if(temp&0x80)
		{
	   	ser_h;
		}
		else
		{
		  ser_l;
		}
		sck_l;
		sck_h;
		temp=temp<<1;
	}
	
	temp=seg17[num1];
	for(int i=0;i<8;i++)
	{
	  if(temp&0x80)
		{
	   	ser_h;
		}
		else
		{
		  ser_l;
		}
		sck_l;
		sck_h;
		temp=temp<<1;
	}
	
  rck_l;
	rck_h;
}

因为74LS595采用的是移位寄存器和存储寄存器,并且三个数码管采用的是级联的方式,移位时三个74LS595一起变化,把数码管的段码从最高位一位一位移动到QA到QH,在移动到下一片级联的74LS595.
第一个for循环:此时数码管3的段码存放在数码管1的移位寄存器中。
第二个for循环:数码管3的段码移动到数码管2的移位寄存器中,数码管2的段码存放在数码管1的移位寄存器中。
第三个for循环:数码管3的段码移动到了数码管3的移位寄存器中,数码管2的段码移动到了数码管2的移位寄存器中,数码管1的段码移动到了数码管1 的移位寄存器中。
再通过RCK的上升沿将移位寄存器的值传到存储寄存器并输出。

标准库

只是对gpio的调用函数和初始化有些许不同,原理一样

#define RCLK_PIN    GPIO_PIN_2
#define RCLK_PORT   GPIOA
#define SER_PIN   	GPIO_PIN_1
#define SER_PORT    GPIOA
#define SCK_PIN   	GPIO_PIN_3
#define SCK_PORT    GPIOA


#define RCLK_H			HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_SET)
#define RCLK_L			HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_RESET)

#define SER_H				HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_SET)
#define SER_L				HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_RESET)

#define SCK_H				HAL_GPIO_WritePin(SCK_PORT, SCK_PIN, GPIO_PIN_SET)
#define SCK_L				HAL_GPIO_WritePin(SCK_PORT, SCK_PIN, GPIO_PIN_RESET)

uc8 Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};

void SEG_Init(void)
{

    GPIO_InitTypeDef GPIO_InitStruct ;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, GPIO_PIN_RESET);
    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

//
void SEG_DisplayValue(u8 Bit1,  u8 Bit2, u8 Bit3)
{
    u8 i = 0;
    u8 code_tmp = 0;
    code_tmp = Seg7[Bit3];

    for(i = 0; i < 8; i++)
    {
        if(code_tmp & 0x80)
        {
            SER_H;
        }
        else
        {
            SER_L;
        }

        code_tmp = code_tmp << 1;
        SCK_L;
        SCK_H;
    }

    code_tmp = Seg7[Bit2];
    for(i = 0; i < 8; i++)
    {
       
        if(code_tmp & 0x80)
        {
            SER_H;
        }
        else
        {
            SER_L;
        }

        code_tmp = code_tmp << 1;
        SCK_L;
        SCK_H;

    }

    code_tmp = Seg7[Bit1];
    for(i = 0; i < 8; i++)
    {
        
        if(code_tmp & 0x80)
        {
            SER_H;
        }
        else
        {
            SER_L;
        }

        code_tmp = code_tmp << 1;
        SCK_L;
        SCK_H;

    }

    RCLK_L;
    RCLK_H;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值