[嵌入式软件][入门篇][仿真平台] STM32F103实现LED、按键

发布时间:2024年01月20日

上一篇:[嵌入式软件][入门篇] 搭建在线仿真平台(STM32)

本文章使用的电路,见上一篇。

一、点亮LED灯

(1) 简介

  1. LED是一种半导体器件,大家其实对LED并不陌生,各种电器的指示灯、手机键盘灯、LED液晶屏的背光、高亮LED手电筒等,都是通过LED发光的。
  2. LED有两种主要用途,一种是作为指示灯;另一种是照明。
  3. 照明用的LED一般都是大功率LED,需要较大的电压电流才能正常工作。而这里我们要用到的则是用作指示灯的小功率LED。
  4. 常见的小功率LED,在它的正负极加上3V左右的电压,就会发光,正常发光的时候,电流大概是2~5mA。
  5. 这里要注意,LED有正负极之分,接反了不会发光。另外,电压也不可太高,那样会烧坏LED。

(2) 示例代码

#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"

#include "delay.h"
#include "led.h"
int main() {
    //LED初始化
    LED_Init();
    // 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)
    while(1) {
        LED = 1;      // 高电平熄灭
        delay_ms(50);
        LED = 0;      // 低电平点亮
        delay_ms(50); 
        /* 可用简写为:
           LED = !LED; // 取反
           delay_ms(50); 
        */
    }
}

(3) 仿真效果(闪烁)

仿真效果
在这里插入图片描述

电路中,一高一低,才能正常工作。

二、按键检测

(1) 简介

1. 按键原理

按键的基本原理是设置单片机IO口(PA1)为输入状态,如DDRB = 0XF0(方向寄存器,“1”为输出,“0”为输入);

2. 检测按键端口

单片机一直检测按键端口(PA1)的状态,当端口为高电平时(即按键按下),实行相应的动作(比如控制LED灯)。

原理就是这么回事,但是正真实现时,按键会有抖动,要进行按键去抖。

3. 消抖

① 按键实行一个动作过程是需要一定时间的,一般为100mS-1S左右,而一个单片机执行一个机器周期的时间很短,时钟为10MH的周期为0.1μs,
② 这样按键每一次动作程序就会多次检测按键,出现误判(一次按下,多次动作)。
③ 一般消抖都是用延时10ms,来过滤抖动。

(2) 示例代码1 (按下点亮,松开熄灭)

每次按下,红灯点亮,松开按键红灯熄灭。

#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"

#include "delay.h"
#include "led.h"
#include "key.h"

#define io_get(gpio, pin) GPIO_ReadInputDataBit(gpio, pin)

int main() {
    // LED初始化
    LED_Init();
    // 按键初始化
    KEY_Init();
    // 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)
    while(1) {
        if (io_get(GPIOA, GPIO_Pin_1) == KEY_ON) {
            LED = 0;      // 低电平点亮
        } else {
            LED = 1;      // 高电平熄灭
        }
        delay_ms(10); 
    }
}

(3) 仿真效果1 (按下点亮,松开熄灭)

每次按下,红灯点亮,松开按键红灯熄灭。
在这里插入图片描述

(4) 示例代码2 (按下点亮,再按熄灭)

模拟家中电灯,一个完整的开关。

#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"

#include "delay.h"
#include "led.h"
#include "key.h"

#define io_get(gpio, pin) GPIO_ReadInputDataBit(gpio, pin)

int main() {
    // LED初始化
    LED_Init();
    // 按键初始化
    KEY_Init();
    // 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)
    while(1) {
        if (Key_Scan(GPIOA, GPIO_Pin_1)) { // 检测按键整个过程。按下->松开
            LED = !LED;  // 每次按下,切换开关。低电平点亮 高电平熄灭
        }
    }
}

(5) 仿真效果2 (按下点亮,再按熄灭)

按一次,点亮,再按下,则熄灭。
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_29246181/article/details/135633848
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。