GPIO应用-LED

LED

由8个发光二极管LED按照组成数字0到9的方式进行物理连接,形成LED数码管,简称LED

LED的选择

需要根据实际应用的需求来决定,若只需要显示数字“0”~“9”,需要7段LED即可。

若同时需要显示小数点,则需要8段LED

8段数码管由8个发光二极管LED组成。

MCU是通过I/O引脚来控制LED某段发光二极管的亮暗,从而达到显示某个数字的目的。

控制LED亮暗

确定选用的数码管是共阴极数码管或共阳极数码管。

共阴极数码管:公共端需要接地,8段数码管的信号端高电平有效,只需要在各段加上高电平信号即可使相应的段发光。

共阳极数码管:公共端接电源阳极,8段数码管的信号端低电平有效,只需要在各段加上低电平信号即可使相应的段发光。

例如共阳极8段数码管,[hgfedcba]=[0111 1111]时,h段亮,显示为小数点;[hgfedcba]=[1100 0000]时,除h、g段均亮,显示为数字“0”或字母“O”。

单个LED只能显示一个数字或字母,实际中使用多个LED显示多个数字或字母。

电气参数

能承受的最大电流;额定电压;限流电阻;电流放大电路。

对LED编程

通过一个8位数据线的数据口来控制段。

8段数码管的公共端根据共阴或共阳接到固定的低电平或高电平,现在接到MCU的一个输出引脚(片选信号)由MCU控制,这些n个数码管合在一起称为n连排数码管。

四连排共阴极8段数码管共有12根线需要连接到MCU。

若要控制更多数码管,还可以外加一个译码芯片。

各个数码管的段信号端称为数据端分别对应相连,可以由MCU的8个引脚控制,同时还有4个位选信号也称为控制端。

位选是指向第几个数码管,用于分别选中要显示数据的数码管,可用MCU的4个引脚来控制。

每个时刻只让一个数码管有效,即只有一个位选信号为0,其他为1,由于人眼的视觉暂停效应,看起来则是同时显示的效果。

这种n连排数码管也称动态扫描数码管,其含义就是任何一个时刻,只有一个数码管显示,而整体上看起来一起显示,是由于MCU对其动态刷新,而人眼具有视觉暂留效应而造成的现象。

驱动构件设计

LED与MCU的硬件接线在工程中使用宏定义描述,且每个接线单独使用宏定义,更具有普适性,若LED接在MCU的不同引脚,只需修改LED的硬件接线宏定义即可。

LED数码管各字母及数据的显示码

在头文件led.h中给出了主要函数的声明,主要包括LED初始化LEDInit;LED显示LEDshow。

在初始化函数中将相关MCU引脚初始化为GPIO功能,并将所有数码管初始化状态设置为暗。

显示函数的主要功能是将入口参数的4字节数组中的内容显示在数码管上。

数组中的哪一个字节显示在数码管的那个位置上?

虽然一个时刻只能显示一个数码管,但可以使用静态变量确定下次要显示的位选信号,这样显示函数就可使用4字节数组作为形参,实际调用时,将待显示的4字节数组作为实参传入即可。

每隔10ms,在定时中断服务例程中,调用该函数一次。由于人眼的视觉暂留,就可稳定的显示需要的内容。

编程过程

  1. 根据LED实际使用的MCU引脚,修改led.h文件中“LED的硬件接线”
  2. 在“includes.h”文件中声明全局变量位置声明LED显示缓冲区数组。

  3. 在main.c文件中“变量赋初值”位置给LED显示缓冲区赋初值

  4. 在isr.c的某一定时中断处理函数中添加调用LEDshow函数定时刷新,利用视觉暂留显示缓冲区中的全部内容。

只要main函数中正常初始化并开启SysTick中断及总中断,LED就正常显示了。任何程序中改变LED显示缓冲区g_LEDBuffer的值,LED显示随即改变。

嵌入式技术基础与实践(第4版)

### 导包 在进行STM32的开发时,需要包含相应的头文件来使用芯片的标准库函数和寄存器定义。通常会包含 `stm32f10x.h` 这个设备头文件,它定义了STM32F10x系列微控制器的寄存器映射和相关的宏定义,为后续操作芯片硬件资源提供基础。示例代码如下: ```c #include "stm32f10x.h" // Device header ``` ### 使能GPIO时钟 在STM32中,要使用某个外设,必须先使能其时钟。对于GPIO端口,使用 `RCC_APB2PeriphClockCmd` 函数来使能相应端口的时钟。例如,若要使用GPIOA端口,代码如下: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ``` 这里开启GPIOA端口时钟是因为后续要控制连接在GPIOA引脚上的LED。 ### 初始化GPIO 初始化GPIO需要定义一个 `GPIO_InitTypeDef` 类型的结构体变量,用于存储GPIO引脚的初始化参数,然后将这些参数应用到相应的GPIO端口。具体步骤如下: 1. 定义结构体变量: ```c GPIO_InitTypeDef GPIO_InitStructure; ``` 2. 配置结构体成员: ```c GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式,可输出高电平和低电平,适合驱动LED等负载 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 选择GPIOA端口的引脚1进行配置 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚的输出速度为50MHz,较高速度可提供更快的信号切换速度 ``` 3. 应用配置: ```c GPIO_Init(GPIOA, &GPIO_InitStructure); // 将配置好的参数应用GPIOA端口的引脚1上 ``` ### 点亮LED 控制GPIO引脚的电平可以实现LED的点亮和熄灭。可以使用 `GPIO_ResetBits` 函数将指定引脚置为低电平来点亮LED,使用 `GPIO_SetBits` 函数将指定引脚置为高电平来熄灭LED。示例代码如下: ```c // 点亮LED GPIO_ResetBits(GPIOA, GPIO_Pin_1); // 熄灭LED GPIO_SetBits(GPIOA, GPIO_Pin_1); ``` 也可以使用 `GPIO_WriteBit` 函数更灵活地设置引脚电平,`Bit_RESET` 表示低电平,`Bit_SET` 表示高电平: ```c // 点亮LED GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); // 熄灭LED GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); ``` 综合以上步骤,完整的代码示例如下: ```c #include "stm32f10x.h" // Device header int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置GPIO结构体 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 初始化GPIO GPIO_Init(GPIOA, &GPIO_InitStructure); while(1) { // 点亮LED GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); // 延时一时间 // 这里假设已经包含了延时函数的头文件 // delay_ms(500); // 熄灭LED GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); // 延时一时间 // delay_ms(500); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值