你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32基础篇 ——独立按键

[复制链接]
feixiang20 发布时间:2018-1-15 20:51
前面几个实验我们学习了了 STM32 的 IO 口作为输出以及系统时钟的使用,这次实验,通过学习按键来学习如何使用 STM32 的 IO 口作为输入用。我们将利用板载的 4 个按键,来控制板子上的 4 个 LED。 通过本次的实验, 了解到 STM32 的 IO 口作为输入口的方法。实验目标:
3 h# |# J  D# I  D/ a' v# ]1、了解按键输入的原理。
2 ]- n" w/ a- `( m4 q  |2、了解 STM32 的输入模式配置。
/ _  q" ]/ c' J) k3 S( W7 x& o1 F( W" I9 a& U9 L
硬件电路设计如图所示
4 M3 A/ m0 ~, z) B2 Q* {6 J, v! n6 i7 N, |$ S
1.jpg
8 |- s* k% h1 k# K- L- j& T# l8 p6 t& A8 e4 H/ o( H6 x
上面的原理图,三个按键分别接到单片机的  PE2、PE3、PE4。
* V0 V$ x( f; j% [9 L; n5 k* _0 ^5 ^6 d
按键消抖
9 x& f. U5 B1 Z) Z( e, }' ^按键所用开关为机械弹性开关,当机械触点断开 、闭合时,电压信号 如图示,因此需要做消抖处理。# s% M. q; d3 d$ d

9 v0 {$ X6 ~7 r$ l) N5 z2 u5 F 2.jpg
$ {0 y- g% _( v2 v' H7 J, ]" {( z- j, y7 h! I
由于机械点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键抖动会引起按键被误读多次。为了确保 CPU 对键的一次闭合仅作一次处理,必须去除按键抖动。一般来说一个简单的按键消抖就是先读取一次按键的状态,如果得到按键按下之后,延时 10ms,再次读取一次按键的状态,如果按键还是按下状态,那么说明按键已经按下。
, F0 B/ L# j& ?9 D5 l5 M9 ~2 m% O, k
3 d. Z' L# t, {8 U$ U( [$ T库函数输入函数
. \8 x/ k; |5 tGPIO_ReadInputDataBit ()函数 这个函数是读取一个设置为输出模式时,一个 IO 口的状态值。当读取的 IO 口为 1 的时候,输出 1,当 IO 口输出为 0 的时候,输出 0。
# v( ^) s  w; D: H) V6 X4 M; Z3 j" N, Q) |' |) S
按键 IO 初始化函数配置. j! _2 B) Y" b8 T* h
void key_init() 9 s  B; {0 S2 A
{
; @# R- i* l% r* Q  vGPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化 GPIO6 l" y. Z' H! I& Z
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);  d- v7 c( z" H; V* T
/* 配置 GPIO 的模式和 IO 口 */5 w; l- n1 {2 d, S) g& y% J: F
GPIO_InitStructure.GPIO_Pin=K_DOWN|K_LEFT|K_RIGHT;
  j3 E1 V* i5 ~( l' q( H8 uGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入; d( W' l) r) t, Q
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
% e& F3 t: n0 yGPIO_Init(GPIOE,&GPIO_InitStructure);
, V' b$ z* M4 ]7 k- I: g}# r  o3 p! o" z, x

! q" Q0 ]1 c8 L- a. v( k; u( u9 {宏定义输入:: B6 u6 [2 E+ M
#define K_DOWN GPIO_Pin_3 //PE3# M  B! K. ^4 S5 o3 R. h* Q9 t6 X
#define K_LEFT GPIO_Pin_2 //PE2# @# J4 e( U% a  |
#define K_RIGHT GPIO_Pin_4 //PE42 k, t! _- ]: |4 Y" t
#define k_up GPIO_ReadInputDataBit(GPIOA,K_UP)  //获取按键的状态2 d0 X. E* P3 k+ \) j# l
#define k_down GPIO_ReadInputDataBit(GPIOE,K_DOWN)2 `! g, x, P: k
#define k_left GPIO_ReadInputDataBit(GPIOE,K_LEFT)1 K( C8 E) H2 M1 m9 L9 H9 c
#define k_right GPIO_ReadInputDataBit(GPIOE,K_RIGHT)
0 U5 K! T; O1 m* q$ c2 l( u2 b0 R# \- a, M
按键扫描函数
2 |) d% G' |6 D7 A' ^* K' }void keyscan()  //按键处理函数
# G) ~. w' M7 z3 N! \' J  k" I& \4 W{: T! N/ {3 @6 N! i% }. ]. c  k
if(k_down==0)) [8 a% @( q: q( `9 A) j
{
7 W7 i$ Q) D- ^8 b+ Odelay_ms(10);
2 s& W; b) y- Q. Lif(k_down==0)
& h9 P7 f; e! i8 P# R2 ~{6 b! `2 G2 X: b4 Q7 I
GPIO_Write(GPIOC,(u16)(0xfd));# ]8 {/ y; \* p7 A1 n. F& X
}7 ^) }- C0 I. F8 O  Z8 K6 J+ q6 M
while(!k_down);
9 v$ U3 c: p3 w' R! m5 t}
* L+ O/ {- z1 }. J9 H* F4 @if(k_left==0)4 h5 {- P( i# v* I+ ~
{
1 V/ S3 |- X% x: ]- C- Pdelay_ms(10);
8 H: U1 c, x$ h$ ]: Eif(k_left==0)+ n/ x4 |3 ~- h2 x! O
{. Y9 ^; ]$ T. a+ I8 X
GPIO_Write(GPIOC,(u16)(0xfb));7 ?9 d! P% r  K! {+ l
}! D' _% M7 a0 p' f* Z
while(!k_left);
. X6 Z( @" g8 P# n  t1 g- Z/ b}
* ?3 C+ x, Z9 @+ [' R' M' Kif(k_right==0)
/ e/ q% t7 b5 ~( D8 k7 E; e' s5 g{
8 R9 t1 g" I5 _8 F5 {delay_ms(10);  ~% Y0 O" m6 i& [# v
if(k_right==0)
  K' @: s! k. y3 x) k% {( _; B{
# s# R  O% h2 q- {- aGPIO_Write(GPIOC,(u16)(0xf7));$ |4 m: D8 h5 y% [0 j: G1 w9 p' P) p
}
- X; D, Y7 Z, l# S7 Mwhile(!k_right);
- B* `: `% [3 d+ W}
! {. j3 D7 r  [$ b9 d}- g+ F1 j3 Y; w& e) Y6 _. ~: Q

( D7 |% _; ?! G- L4 P  T这个按键扫描函数只是一个简单的函数,在比较简单的程序里面比较实用,有很明显的缺陷,不支持多按键输入,而且由于使用的是延时消抖,不能充分利用 CPU 资源。大家 如在比较复杂的程序使用按键扫描的话,使用状态机方式的按键扫描,或者零时消抖的按键扫描方式。: H# M& R# y9 B7 L

' {0 R0 ~% {, s/ p: Y9 c, qint main()! l; l2 B4 P6 K' _" m- X
{
( F) t& w5 t  U: ^8 v1 h! Yled_Init();  //LED 初始化
3 k& {( v4 ]7 T% Ikey_init();  //按键端口初始化函数% D: y5 f) Z% S- m/ D3 P, f0 h
GPIO_Write(GPIOC,(u16)(0xff)); //LED 灭" q& D0 i% M- ]3 p/ A$ i
while(1)3 g# f# N: Y0 M1 G, w
{ / N& y* }+ X5 d' {4 a) _$ d4 `
keyscan();  //按键处理函数
/ q  c3 r6 f* a% H# ?( V# ^} ! k8 D) ?, A, J1 }# K2 q! b
}0 _' k( @" G: X( j) C

. H5 J  s* u4 X3 N独立按键就先写到这里吧,后面还会分享其它的按键扫描函数。: h$ j; n' U, @$ T

& U0 X7 U6 `# |7 i
收藏 评论1 发布时间:2018-1-15 20:51

举报

1个回答
黑夜之狼 回答时间:2018-1-16 09:01:37
呃....用delay来做消抖
; X& _" N+ p: m5 b' M另外,LZ的硬件是啥板子

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版