LED模块控制与左移运算详解

二、LED模块

(一)硬件结构

如图,为LED的硬件结构。首先我们来说明一下PD2如何控制锁存器,PD2------高电平时,PC8------PC15的高低电平对LED有效。若为低电平,PC8------PC15的高低电平对LED没有影响。

LED的配置步骤

(二)LED示例代码

cpp 复制代码
/**
* @brief     显示led灯
* @param   	 显示哪个灯
* @param     控制亮灭 0 - 亮   1 - 灭
* @retval   
*/
void led_show(uint8_t led, int id)
{
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);//把PD2置高电平 锁存器-透明模式-读取GPIO状况
	if(id)
	{
		HAL_GPIO_WritePin(GPIOC ,GPIO_PIN_8<<(led-1),GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOC ,GPIO_PIN_8<<(led-1),GPIO_PIN_RESET);
	}
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);//把PD2置低电平 锁存器-锁存-不再读取GPIO状况
}

(三)左移运算符

左移运算符(<<)是位运算的一种,它的作用是将一个数的二进制位 全部向左移动指定的位数,右边空出的位置用 0 补齐,左边超出的位数则直接丢弃。

那我们这里是如何使用左移运算选择LED灯的呢?

首先,我们来看一下GPIO_PIN_8 的地址为16进制**(uint16_t)0x0100** 转换为二进制为:

0000 0001 0000 0000

然后,我们通过左移运算符,左移一位便可以得到二进制为0000 0010 0000 0000

转换为16进制为 0x0200

对于着GPIO_PIN_9 (uint16_t)0x0200)

所以,通过左移运算符,可以选择LED灯。

最后,我们来讲讲16进制如何转换为二进制

十六进制的每 1 位,正好对应二进制的4 位(因为 2=16)

16 进制 二进制 16 进制 二进制 16 进制 二进制 16 进制 二进制
0 0000 4 0100 8 1000 C 1100
1 0001 5 0101 9 1001 D 1101
2 0010 6 0110 A 1010 E 1110
3 0011 7 0111 B 1011 F 1111

(四)结语

一定要注意PD2的一个功能!!! 17届蓝桥杯大家一起共勉!!!

相关推荐
LCG米3 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga6 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
女神下凡10 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
硅基手札12 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学14 小时前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_14 小时前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
HANDY0920016 小时前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式18 小时前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
蹊黎1 天前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
无敌贵点大王1 天前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件