蓝桥杯嵌入式学习——扩展板之数码管

        时间紧迫,还是直接学习扩展板资源吧

目录

一. 原理

1. 原理图

2. 解释

3. 注意事项

二. 代码编写

1. leds.c 文件

2. leds.h 文件

3. main.c 文件


一. 原理

1. 原理图

       

        只需要注意图中标记的三个引脚就能实现数码管的功能

2. 解释

SER:理解为数据位

SCK:给一个上升沿,将数据移位,比如图中的U1里QA的数据移位到U1的QB。同时也是将数码管之间的数据进行了移位,比如U1里QH的数据移位到U2的QA。

RCLK:给一个上升沿,将移位寄存器SN74LS595N的数据转到存储寄存器,就写进了数码管。

3. 注意事项

(1)数据移位方向是从U1的QA开始,一直移到U3的QH,多出来的丢弃。

(2)数码管是共阳数码管

(3)扩展板的跳线帽要接上,接P3与P4

(4)PA1-SER,PA2-RCK,PA3-SCK

二. 代码编写

        在cubemx的引脚配置很简单,就是将PA1-PA3设为输出模式即可,其他都默认,直接上代码。

1. leds.c 文件

        LEDS_Display是数码管显示函数,以第十届真题为例写的,带有字母,想必以后考也不会考纯数字的显示,就发了这个比较长的代码,不过原理很简单。

#include "leds.h"

unsigned char LEDS[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};    // 0-9,A-F,灭
void LEDS_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);

  /*Configure GPIO pins : PA1 PA2 PA3 */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void LEDS_Display(int data,uint8_t a) // data 十进制三位数,a 选择展示方式 0 纯数字 1 Axx 2 Cxx    
{
	int i,j;
	unsigned char tem = 0;

	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
	
	for(j = 0; j < 2; j++)
	{
		tem = LEDS[data%10]; 
		if((data == 0) && (j > 0))tem = LEDS[16];
		data/=10;
		for(i = 0; i < 8; i++)
		{
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
				if(tem & 0x80)
				{
						HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
				}
				else
				{
						HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
				}

				tem = tem << 1;
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
		}
	}
	if(a == 0)
		tem = LEDS[data%10]; 
	else if(a == 1)
		tem = LEDS[10];	// A
	else
		tem = LEDS[12];	// C
	data/=10;
	for(i = 0; i < 8; i++)
	{
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
			if(tem & 0x80)
			{
					HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
			}
			else
			{
					HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
			}
			tem = tem << 1;
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
	}
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
}


2. leds.h 文件

#include "main.h"

void LEDS_Init(void);
void LEDS_Display(int data,uint8_t a); //数码管显示数字

3. main.c 文件

#include "leds.h"

int main(void)
{
  HAL_Init();
  SystemClock_Config();//系统时钟设置
  
  LEDS_Init();
  LEDS_Display(123,2);
  while (1)
  {
//		HAL_Delay(500);
  }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为驱动数码管,常用的方法有两种:共阳极和共阴极。下面分别介绍两种方法的实现。 共阳极数码管驱动: 共阳极数码管的每个显示单元的阳极都连接在一起,共用一根引脚,而且每个显示单元的阴极都独立连接。因此,要点亮某个数码管的某一位,就需要将对应的阴极接地,同时将阳极接到电源上。 具体实现方法如下: 1.定义一个数组,存储每个数码管的阴极引脚号码; 2.定义一个数组,存储每个数字在数码管中的编码; 3.循环扫描每个数码管,依次点亮每一位数字; 4.在每个数码管的阴极引脚上输出低电平,点亮对应的数字; 5.在每个数码管的阴极引脚上输出高电平,熄灭数字。 共阴极数码管驱动: 共阴极数码管的每个显示单元的阴极都连接在一起,共用一根引脚,而且每个显示单元的阳极都独立连接。因此,要点亮某个数码管的某一位,就需要将对应的阳极接地,同时将阴极接到电源上。 具体实现方法如下: 1.定义一个数组,存储每个数码管的阳极引脚号码; 2.定义一个数组,存储每个数字在数码管中的编码; 3.循环扫描每个数码管,依次点亮每一位数字; 4.在每个数码管的阳极引脚上输出低电平,点亮对应的数字; 5.在每个数码管的阳极引脚上输出高电平,熄灭数字。 以上是两种方法的实现原理,具体实现时可以根据需要选择其中一种。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值