使用一个按键控制led的亮灭,按键按下时led亮起,按键松开时led熄灭。通过按键控制实验来介绍下 io 口作为输入的使用。本例中用到了gpioe的pe3管脚。
led和按键的电路图。
按键 k_left、k_down、k_right 分别连接在 stm32f1 芯片的 pe2、pe3、pe4引脚上。
按键另一端是全部接在 gnd 上,这个和我们学习 51单片机是一样的,采用独立式按键接法,按下时输入到芯片管脚即为低电平。
整个程序实现的流程步骤如下:
初始化按键使用的端口及时钟
按键检测处理
按键控制处理
工程文件目录如下。
io口初始化程序代码在key.c文件中。
/**************************************************************** 函 数 名 : key_init* 函数功能 : 按键初始化* 输 入 : 无* 输 出 : 无*****************************************************************/void key_init(void){ gpio_inittypedef gpio_initstructure; //定义结构体变量 rcc_apb2periphclockcmd(rcc_apb2periph_gpioa|rcc_apb2periph_gpioe,enable); gpio_initstructure.gpio_pin=key_up_pin; //选择你要设置的io口 gpio_initstructure.gpio_mode=gpio_mode_ipd;//下拉输入 gpio_initstructure.gpio_speed=gpio_speed_50mhz; //设置传输速率 gpio_init(key_up_port,&gpio_initstructure); /* 初始化gpio */ gpio_initstructure.gpio_pin=key_down_pin|key_left_pin|key_right_pin; gpio_initstructure.gpio_mode=gpio_mode_ipu; //上拉输入 gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(key_port,&gpio_initstructure);}
要知道哪个按键被按下,就需要编写按键检测函数,具体代码如下:
/***************************************************************** 函 数 名 : key_scan* 函数功能 : 按键扫描检测* 输 入 : mode=0:单次按下按键 mode=1:连续按下按键* 输 出 : 0:未有按键按下key_up:k_up 键按下key_down:k_down 键按下key_left:k_left 键按下key_right:k_right 键按下*****************************************************************/u8 key_scan(u8 mode){ static u8 key=1; if(key==1&&(k_up==1||k_down==0||k_left==0||k_right==0)) //任意一个按键按下 { delay_ms(10); //消除抖动 key=0; if(k_up==1) { return key_up; } else if(k_down==0) { return key_down; } else if(k_left==0) { return key_left; } else { return key_right; } } else if(k_up==0&&k_down==1&&k_left==1&&k_right==1) //无按键按下 { key=1; } if(mode==1) //连续按键按下 { key=1; } return 0;}
主函数,代码如下:
#include system.h#include systick.h#include led.h#include key.hint main(){ u8 key; systick_init(72); led_init(); key_init();while(1) { key=key_scan(1); //á¬ðøé¨ãè°´¼üif(key) { led2=0; delay_ms(5);//每隔5ms灭一次if(key_scan(1)!=key) { led2=!led2; delay_ms(5); } } }}
2021世界半导体大会|赛迪研究院成功举办“2021世界半导体大会”
浅谈贴片安规Y电容的优缺点
华南地区首个AI公园项目已正式启动
易华录提出面向数据湖的数据安全治理框架
澳大利亚公司已扫清太阳能电池的主要障碍之一,利用铜代替银
STM32按键控制LED的亮灭
怎样使用Arduino和按钮自动重复按键
STM32的硬件I2C设计有BUG
大联大友尚集团推出基于onsemi产品的65W PD电源适配器方案
物联网网关如何配置云里物里IoT网关-G1操作说明
在PCB尺寸测量过程中,您是否有这样的困扰?
电动牙刷哪个牌子好?进取的生活理应有贵奢的它
电源设计说明:开关模式解决方案中的声学噪声抑制
全球首款碳纤维智能手机发布,比一袋薯片还轻
IGBT:走虚拟IDM之路
Amphenol Commercial SAS/PCIe 4.0连接器的特性和应用
cam350层的编辑
恩智浦半导体加入互联照明联盟
零跑汽车全系降价,最高综合优惠4万元
米尔科技荣获ARM公司颁发的“2013年亚太区最佳代理商大奖”