[RISC-V MCU 应用开发]

第七十四章、CH32V103应用教程——按键控制LED灯

[复制链接]
806|0
手机看帖
扫描二维码
随时随地手机跟帖
RISCVLAR|  楼主 | 2021-2-25 16:52 | 显示全部楼层 |阅读模式
本帖最后由 RISCVLAR 于 2021-2-25 16:52 编辑

CH32V103应用教程——按键控制LED灯

本章教程主要进行按键控制LED灯实验,主要涉及到GPIO的输入输出。本章教程在第二章GPIO的基础上进行,第二章已经对GPIO点亮LED灯进行讲解配置,因此本章主要讲解按键控制的程序配置。

1、GPIO简介及相关函数介绍
关于GPIO已经在第二章进行介绍,在此不再赘述。

2、硬件设计
本章教程主要进行按键控制LED灯实验。由于本教程所用开发板只有一个复位按键,因此需要外接按键电路进行使用。按键电路如下:
图片1.png
其中,KEY0接PA2引脚,KEY1接PA3引脚。开发板上带有两个LED灯(LED1和LED2),用两根杜邦线分别将LED1和LED2与对应GPIO引脚连接起来,此处连接方式为:
  • LED1与PA0连接;
  • LED2与PA1连接。

3软件设计
本章教程主要进行按键控制LED灯实验,由于前面第二章已经对GPIO点亮LED灯进行讲解配置,因此本章主要讲解按键控制的程序配置,具体程序如下:
key.h文件
#ifndef __KEY_H
#define __KEY_H

#include "ch32v10x_conf.h"

#define KEY0  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)  //读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)  //读取按键1

#define KEY0_PRESS   1       //KEY0
#define KEY1_PRESS   2       //KEY1

void KEY_Init(void);    //按键IO初始化
u8 KEY_Scan(u8 mode);   //按键扫描函数

#endif
key.h文件主要进行函数的声明;
key.c文件
#include "key.h"
#include "debug.h"

//按键初始化函数
//PA2和PA3设置成输入
void KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTC时钟

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3; //按键GPIO引脚配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //设置成上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化GPIOA15
}

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
u8 KEY_Scan(u8 mode)
{
    static u8 key_up=1;//按键按松开标志
    if(mode)  key_up=1;  //支持连按
    if(key_up&&(KEY0==0||KEY1==0))
    {
        Delay_Ms(10);//去抖动
        key_up=0;
        if(KEY0==0)      return KEY0_PRESS;
        else if(KEY1==0) return KEY1_PRESS;
    }else if(KEY0==1&&KEY1==1)  key_up=1;
    return 0;// 无按键按下
}
key.c文件主要包括按键初始化函数和按键处理函数。按键初始化函数主要进行按键对应GPIO的初始化,按键处理函数主要进行按键消抖以及返回按键值。
main.c文件
int main(void)
{
    u8 t=0;
    static u8 i=1;
    static u8 j=1;

        USART_Printf_Init(115200);
    Delay_Init();   //延时函数初始化
        LED_Init();     //LED初始化
        KEY_Init();     //按键初始化

        printf("SystemClk:%d\r\n",SystemCoreClock);

        while(1)
    {
        t=KEY_Scan(0);      //得到键值

        switch(t)
        {
            case KEY0_PRESS:
                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
                printf("i=%d\n",i);
                break;
            case KEY1_PRESS:
                GPIO_WriteBit(GPIOA, GPIO_Pin_1, (j==0) ? (j=Bit_SET):(j=Bit_RESET));
                printf("j=%d\n",j);
                break;
            default:
                Delay_Ms(10);
        }
        }
}
main.c文件主要进行函数初始化并根据返回按键值进行相应处理。当key0按下,LED1灯进行亮灭处理;当key1按下,LED2灯进行亮灭处理。

4下载验证
将编译好的程序下载到开发板并复位,当key0控制LED1亮灭的时候,串口打印显示如下图,i=0表示LED1亮,i=1表示LED灭。
图片2.png
当key1控制LED2亮灭的时候,串口打印显示如下图,j=0表示LED1亮,j=1表示LED灭。
图片3.png
开发板LED电路图如下所示:
图片4.png
由于一端接VCC,一端接GPIO引脚,因此GPIO引脚为低电平时灯亮,高电平时灯灭。

73、按键控制LED灯.rar

486.99 KB

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

293

帖子

33

粉丝