离线
TA的每日心情 | 慵懒 2021-7-23 17:16 |
---|
签到天数: 17 天 [LV.4]
|
有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 草帽王子 于 2021-9-10 18:05 编辑
本章教程主要进行按键控制LED灯实验,主要涉及到GPIO的输入输出。本章教程在第二章GPIO的基础上进行,第二章已经对GPIO点亮LED灯进行讲解配置,因此本章主要讲解按键控制的程序配置。
1、GPIO简介及相关函数介绍
关于GPIO已经在第二章进行介绍,在此不再赘述。
2、硬件设计
本章教程主要进行按键控制LED灯实验。由于本教程所用开发板只有一个复位按键,因此需要外接按键电路进行使用。按键电路如下:
其中,KEY0接PA2引脚,KEY1接PA3引脚。开发板上带有两个LED灯(LED1和LED2),用两根杜邦线分别将LED1和LED2与对应GPIO引脚连接起来,此处连接方式为:
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灭。
当key1控制LED2亮灭的时候,串口打印显示如下图,j=0表示LED1亮,j=1表示LED灭。
开发板LED电路图如下所示:
由于一端接VCC,一端接GPIO引脚,因此GPIO引脚为低电平时灯亮,高电平时灯灭。
73、按键控制LED灯.rar
73、按键控制LED灯.rar
(486.99 KB, 下载次数: 11)
链接:https://pan.baidu.com/s/1hed3d88bbNgw6FOPrsZnAw
提取码:c6x3
复制这段内容后打开百度网盘手机App,操作更方便哦
完
|
上一篇: 第七十三章:CH32V103应用教程——TIM-编码器模式下一篇: 第七十五章:CH32V103应用教程——舵机控制
|