查看: 1014|回复: 0
收起左侧

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

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-5-1 00:26:29 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 18:05 编辑

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


    1、GPIO简介及相关函数介绍

    关于GPIO已经在第二章进行介绍,在此不再赘述。


    2、硬件设计

    本章教程主要进行按键控制LED灯实验。由于本教程所用开发板只有一个复位按键,因此需要外接按键电路进行使用。按键电路如下:
    CH32V CH573单片机芯片-第七十四章:CH32V103应用教程——按键控制LED灯risc-v单片机中文社区(1)

    其中,KEY0接PA2引脚,KEY1接PA3引脚。开发板上带有两个LED灯(LED1和LED2),用两根杜邦线分别将LED1和LED2与对应GPIO引脚连接起来,此处连接方式为:
    • LED1与PA0连接;
    • LED2与PA1连接。


    3、软件设计

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

    3. #include "ch32v10x_conf.h"

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

    6. #define KEY0_PRESS   1       //KEY0
    7. #define KEY1_PRESS   2       //KEY1

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

    10. #endif
    复制代码
    key.h文件主要进行函数的声明;
    key.c文件
    1. #include "key.h"
    2. #include "debug.h"

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

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

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

    13. //按键处理函数
    14. //返回按键值
    15. //mode:0,不支持连续按;1,支持连续按;
    16. //返回值:
    17. //0,没有任何按键按下
    18. //KEY0_PRES,KEY0按下
    19. //KEY1_PRES,KEY1按下
    20. u8 KEY_Scan(u8 mode)
    21. {
    22.     static u8 key_up=1;//按键按松开标志
    23.     if(mode)  key_up=1;  //支持连按
    24.     if(key_up&&(KEY0==0||KEY1==0))
    25.     {
    26.         Delay_Ms(10);//去抖动
    27.         key_up=0;
    28.         if(KEY0==0)      return KEY0_PRESS;
    29.         else if(KEY1==0) return KEY1_PRESS;
    30.     }else if(KEY0==1&&KEY1==1)  key_up=1;
    31.     return 0;// 无按键按下
    32. }
    复制代码
    key.c文件主要包括按键初始化函数和按键处理函数。按键初始化函数主要进行按键对应GPIO的初始化,按键处理函数主要进行按键消抖以及返回按键值。
    main.c文件
    1. int main(void)
    2. {
    3.     u8 t=0;
    4.     static u8 i=1;
    5.     static u8 j=1;

    6.         USART_Printf_Init(115200);
    7.     Delay_Init();   //延时函数初始化
    8.         LED_Init();     //LED初始化
    9.         KEY_Init();     //按键初始化

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

    11.         while(1)
    12.     {
    13.         t=KEY_Scan(0);      //得到键值

    14.         switch(t)
    15.         {
    16.             case KEY0_PRESS:
    17.                 GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
    18.                 printf("i=%d\n",i);
    19.                 break;
    20.             case KEY1_PRESS:
    21.                 GPIO_WriteBit(GPIOA, GPIO_Pin_1, (j==0) ? (j=Bit_SET):(j=Bit_RESET));
    22.                 printf("j=%d\n",j);
    23.                 break;
    24.             default:
    25.                 Delay_Ms(10);
    26.         }
    27.         }
    28. }
    复制代码
    main.c文件主要进行函数初始化并根据返回按键值进行相应处理。当key0按下,LED1灯进行亮灭处理;当key1按下,LED2灯进行亮灭处理。


    4、下载验证

    将编译好的程序下载到开发板并复位,当key0控制LED1亮灭的时候,串口打印显示如下图,i=0表示LED1亮,i=1表示LED灭。
    CH32V CH573单片机芯片-第七十四章:CH32V103应用教程——按键控制LED灯risc-v单片机中文社区(2)
    当key1控制LED2亮灭的时候,串口打印显示如下图,j=0表示LED1亮,j=1表示LED灭。
    CH32V CH573单片机芯片-第七十四章:CH32V103应用教程——按键控制LED灯risc-v单片机中文社区(3)
    开发板LED电路图如下所示:
    CH32V CH573单片机芯片-第七十四章:CH32V103应用教程——按键控制LED灯risc-v单片机中文社区(4)
    由于一端接VCC,一端接GPIO引脚,因此GPIO引脚为低电平时灯亮,高电平时灯灭。

    73、按键控制LED灯.rar
    CH32V CH573单片机芯片-第七十四章:CH32V103应用教程——按键控制LED灯risc-v单片机中文社区(5) 73、按键控制LED灯.rar (486.99 KB, 下载次数: 10)
    链接:https://pan.baidu.com/s/1hed3d88bbNgw6FOPrsZnAw
    提取码:c6x3
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第七十三章:CH32V103应用教程——TIM-编码器模式
    下一篇:第七十五章:CH32V103应用教程——舵机控制
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-3-28 21:00 , Processed in 1.116893 second(s), 48 queries .

    快速回复 返回顶部 返回列表