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

stm32基础篇 ——独立按键

[复制链接]
feixiang20 发布时间:2018-1-15 20:51
前面几个实验我们学习了了 STM32 的 IO 口作为输出以及系统时钟的使用,这次实验,通过学习按键来学习如何使用 STM32 的 IO 口作为输入用。我们将利用板载的 4 个按键,来控制板子上的 4 个 LED。 通过本次的实验, 了解到 STM32 的 IO 口作为输入口的方法。实验目标:
( |# r; U" a. ]% F6 a  h1 P! n6 m1、了解按键输入的原理。: O5 C* P9 p/ A6 U0 C8 R
2、了解 STM32 的输入模式配置。
6 M' _" r3 X! V8 u8 Q) b7 N# |7 N; ~- p& d; K4 A: ^% D
硬件电路设计如图所示
# H* _2 N" G& G( D2 {3 M7 c2 J
7 w* a5 C  j+ Y7 X+ f, G 1.jpg $ R/ j( a- w; W# w- H
; o0 n( w) H" a+ _
上面的原理图,三个按键分别接到单片机的  PE2、PE3、PE4。
8 {; q% K4 Z6 C3 ~# m" ?- Z
9 {- ]7 ^* g9 N按键消抖1 M7 `4 X" C, A) d; M, k0 r9 W
按键所用开关为机械弹性开关,当机械触点断开 、闭合时,电压信号 如图示,因此需要做消抖处理。$ n# [& y5 f$ F8 x, K
7 Y: ~1 ]  h) J0 g% a) J+ [: H! Q# K/ z( K
2.jpg
' [' `- u- K8 Y5 R" `/ r' V/ Z% i
由于机械点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键抖动会引起按键被误读多次。为了确保 CPU 对键的一次闭合仅作一次处理,必须去除按键抖动。一般来说一个简单的按键消抖就是先读取一次按键的状态,如果得到按键按下之后,延时 10ms,再次读取一次按键的状态,如果按键还是按下状态,那么说明按键已经按下。
' y, P) `0 }! m# y* b& w' u  `
; Q2 [# q  Q9 x' P  a! M- S; L库函数输入函数0 P! K3 K+ q5 D9 d7 p! e6 }
GPIO_ReadInputDataBit ()函数 这个函数是读取一个设置为输出模式时,一个 IO 口的状态值。当读取的 IO 口为 1 的时候,输出 1,当 IO 口输出为 0 的时候,输出 0。4 P' j; i. Y, }4 t4 f

# _" Y  s7 F; `- Y& K按键 IO 初始化函数配置5 G8 `* D7 ^( y" p. E! D! Y
void key_init() $ e0 k! O) k  `6 H; u# ?: X
{5 S) i: d) n& I) H3 `2 P
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化 GPIO6 E3 k& Q( p" z" Q/ [0 y
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
8 h4 |% Z* u, K% Q6 e' G1 ^/* 配置 GPIO 的模式和 IO 口 */& Z& [) U5 m/ h: P( t+ N$ J
GPIO_InitStructure.GPIO_Pin=K_DOWN|K_LEFT|K_RIGHT;
# l8 ^; e# V0 `$ G, c3 T; QGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入
4 e5 k. _! a. N) B  @GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;2 z9 v9 W: ]2 Z( d' w. X2 g
GPIO_Init(GPIOE,&GPIO_InitStructure);
2 ^3 B# G" c8 x+ o- `* t5 M}4 N3 o- P9 i" x6 W6 B

6 _* p3 W5 @; W1 z0 Q/ l: v宏定义输入:
# X% x0 P% S+ }  V) t+ K/ Y  S. G#define K_DOWN GPIO_Pin_3 //PE3
$ X* L; p8 \% k# ~#define K_LEFT GPIO_Pin_2 //PE2
7 X/ y, J! w4 t/ o; e#define K_RIGHT GPIO_Pin_4 //PE4
8 h  ?! B7 Z! C. i& B5 o* I0 C#define k_up GPIO_ReadInputDataBit(GPIOA,K_UP)  //获取按键的状态
9 ^8 F/ F/ Q4 t: |$ Z; M#define k_down GPIO_ReadInputDataBit(GPIOE,K_DOWN)
* e3 ~/ V% [9 v; h#define k_left GPIO_ReadInputDataBit(GPIOE,K_LEFT)
( o% ~0 ?2 {/ _/ N2 R: R1 I+ a#define k_right GPIO_ReadInputDataBit(GPIOE,K_RIGHT)/ s- Y8 x1 w5 q% Q

% e# @% H, h& a按键扫描函数! @! M; E( \* x! s
void keyscan()  //按键处理函数5 G, Y( W4 O% M7 |- M
{8 l: E: I/ E" i. J' A6 M; T) a6 V
if(k_down==0)
2 h' s1 x% i; ]5 {$ C/ b6 Y{1 O& J* U0 @  F3 c
delay_ms(10);
% ]' y, `7 o: H8 x) |4 |if(k_down==0)
" x. G" j1 }2 w8 B{
- D& N3 K4 ?& E6 L0 \GPIO_Write(GPIOC,(u16)(0xfd));
4 j. R3 W1 N+ O, ?3 q/ i}
! K1 ?3 y$ A9 k. G! j1 Q; }' Uwhile(!k_down);
; T6 L& k9 \( q$ m}
# Z6 H4 i: D1 z8 r  fif(k_left==0)0 ?8 ?9 J# i2 ~4 {9 h
{
9 I7 V& {( Q: i% N0 Q6 gdelay_ms(10);
9 Z. p  F* L, q+ Z7 w1 Gif(k_left==0)" k0 f% Z# D0 y3 w4 I# I! O
{  ~: B( d3 _% Q# Q! ]2 h
GPIO_Write(GPIOC,(u16)(0xfb));
3 E9 a' T  L  R* P}
6 E1 s. U; ^0 U- Q, e! vwhile(!k_left);5 W, p4 \: [4 a! N& _) t: I
}
3 p! U+ P* s& _$ h& H6 G& Oif(k_right==0)
4 F" i6 }  H+ u' t' i$ G' L3 G  @{! V: I; i! |) ~6 y
delay_ms(10);5 u; }" d. I0 g8 r4 K
if(k_right==0)
; k& j: J  N9 X! i) W8 S' A{
' z$ p% ]% ]: AGPIO_Write(GPIOC,(u16)(0xf7));
, U- W+ X4 h2 D. ]4 s/ F/ l. ]4 |}' {& c9 V: a6 I# q2 O; k
while(!k_right);" K. q3 |- g  [+ s/ E$ i+ L  ?
} 3 G+ _" N; m1 h' m
}
7 n% o% o9 S2 C  @* [
: }2 p/ E* C& z6 N$ s这个按键扫描函数只是一个简单的函数,在比较简单的程序里面比较实用,有很明显的缺陷,不支持多按键输入,而且由于使用的是延时消抖,不能充分利用 CPU 资源。大家 如在比较复杂的程序使用按键扫描的话,使用状态机方式的按键扫描,或者零时消抖的按键扫描方式。
3 O+ ]" a  u7 S! o7 @* ^
4 V; _1 p/ e/ T4 c" b% Y% l. c) ?int main()
+ S. R2 W0 q/ a$ ^& M- i+ [{ " H1 f+ G: B: f6 {' P
led_Init();  //LED 初始化$ |) V4 n: G- v0 G' C+ n# H3 k
key_init();  //按键端口初始化函数
) ~7 l, s' u9 B5 uGPIO_Write(GPIOC,(u16)(0xff)); //LED 灭  p. Z$ G+ u; q* v
while(1)
7 a! }) ?' v# E% X{ ( L2 G( E7 M6 v, K) U4 H
keyscan();  //按键处理函数
! `0 n8 `8 F/ j& I5 c* t$ u! R}
& x1 Q3 w' n  J}1 x; `0 n1 h6 G+ }

9 s4 M0 _# f* u独立按键就先写到这里吧,后面还会分享其它的按键扫描函数。
7 d5 q6 C: J$ E* b5 n4 _
4 @% W2 N4 A) @" \" L' K1 W. I4 D
收藏 评论1 发布时间:2018-1-15 20:51

举报

1个回答
黑夜之狼 回答时间:2018-1-16 09:01:37
呃....用delay来做消抖4 z+ P5 [/ r3 w. p0 a& i1 r8 }
另外,LZ的硬件是啥板子

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版