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

stm32基础篇 ——独立按键

[复制链接]
feixiang20 发布时间:2018-1-15 20:51
前面几个实验我们学习了了 STM32 的 IO 口作为输出以及系统时钟的使用,这次实验,通过学习按键来学习如何使用 STM32 的 IO 口作为输入用。我们将利用板载的 4 个按键,来控制板子上的 4 个 LED。 通过本次的实验, 了解到 STM32 的 IO 口作为输入口的方法。实验目标:
1 `* S- o4 ~4 V1 z( M2 {1、了解按键输入的原理。; H! f7 w6 B9 b7 J
2、了解 STM32 的输入模式配置。
: |+ V9 M5 |3 |0 N% ^4 b% l
; n  w) \7 I/ S8 p  O5 `) y6 Z硬件电路设计如图所示2 d* I$ ?( R) {; Z
$ J+ B" U' x1 T5 O8 d5 B
1.jpg ' l: _  h! |9 P! v/ O

% p2 t# Z, K* ^% ~  W上面的原理图,三个按键分别接到单片机的  PE2、PE3、PE4。" }: r# m; Y; M, Z2 L' j& _2 n2 s

! a' |! c* w& E  a* f5 B9 d8 J按键消抖$ l( I( h) Q8 G
按键所用开关为机械弹性开关,当机械触点断开 、闭合时,电压信号 如图示,因此需要做消抖处理。0 `; R/ b) [  T/ k: F

$ r3 G# l8 V9 @ 2.jpg 3 e# Y9 P* n3 ~9 f9 Y+ }6 W9 v  Y2 c

0 a# V0 t' E( L* L$ l由于机械点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键抖动会引起按键被误读多次。为了确保 CPU 对键的一次闭合仅作一次处理,必须去除按键抖动。一般来说一个简单的按键消抖就是先读取一次按键的状态,如果得到按键按下之后,延时 10ms,再次读取一次按键的状态,如果按键还是按下状态,那么说明按键已经按下。, n# o4 r7 [& h0 e
) h- r" J# X# n) u4 |
库函数输入函数
, K# H/ I/ ?  J; [GPIO_ReadInputDataBit ()函数 这个函数是读取一个设置为输出模式时,一个 IO 口的状态值。当读取的 IO 口为 1 的时候,输出 1,当 IO 口输出为 0 的时候,输出 0。" U! F. [- A' V2 b# c. F

5 T' K7 S6 ~  }按键 IO 初始化函数配置
. H( n) x4 w0 {$ m3 w9 U) svoid key_init() 0 N$ p4 j" U+ J% W5 z9 h
{& \2 r1 {% q5 J5 T- c
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化 GPIO
6 i; x. T: l* ~RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);* k3 r, J$ m: l9 H: R/ g- J
/* 配置 GPIO 的模式和 IO 口 */' w) T/ l. L* a) v
GPIO_InitStructure.GPIO_Pin=K_DOWN|K_LEFT|K_RIGHT;# J! E: R% A; e9 A( N
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入
# T4 \2 K7 G9 W* @' |5 jGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
; [3 a3 @. j& E7 C8 C7 [: uGPIO_Init(GPIOE,&GPIO_InitStructure);
$ m0 k7 @$ M9 V1 R6 b7 ]}( b+ N: U6 |+ B

" Q2 @' m' @% p  c% S宏定义输入:
) [3 W$ l: F4 M( S#define K_DOWN GPIO_Pin_3 //PE3
. @; R2 R: `4 ]; w: r& c#define K_LEFT GPIO_Pin_2 //PE2: g7 i1 m3 A9 F9 D: }# i1 J
#define K_RIGHT GPIO_Pin_4 //PE4
, F+ H6 F# E5 \: W6 R  o; |#define k_up GPIO_ReadInputDataBit(GPIOA,K_UP)  //获取按键的状态- O9 n7 @& y; J0 A% ^, l
#define k_down GPIO_ReadInputDataBit(GPIOE,K_DOWN): u! N# w' S) i/ j6 g; d( ]5 ~
#define k_left GPIO_ReadInputDataBit(GPIOE,K_LEFT)
" S& x" U6 O% r#define k_right GPIO_ReadInputDataBit(GPIOE,K_RIGHT)
( e: S. O- T5 `' y' ~& T  `2 C" j% J- ~% F( C. a8 P, G
按键扫描函数
9 {, X. u- c0 }0 e, i* z! Bvoid keyscan()  //按键处理函数6 L7 G/ m& @# Q1 @+ ^& w1 z
{
( H) `! a" ^6 y* H  Q8 D1 cif(k_down==0)" t0 k) O; Q' P) o3 I) V
{
( j. j, M  W7 R1 ]delay_ms(10);; f$ c% H: D% T9 R9 j
if(k_down==0)
" B/ D6 a5 x2 t( G1 o8 l3 O{" k( _9 Q, G5 S- N8 U) W
GPIO_Write(GPIOC,(u16)(0xfd));
9 k5 \" N* b. z- `}1 H! C  g' F4 F# f. t" P6 k  @  u
while(!k_down);
+ n* z6 _/ M! E% ~}9 D2 m# }+ o! O( E) T
if(k_left==0)1 q# r6 ^# y# Y! @
{
. |! u* _5 @2 p6 F, p3 o7 Fdelay_ms(10);, c1 G) W9 E( A1 l2 f
if(k_left==0)
( D* Z: O7 ?. N5 |1 Z{
* a# y" H4 m+ @1 b& s4 q7 B' |, q8 t& RGPIO_Write(GPIOC,(u16)(0xfb));
6 ]# i9 N! |* `* k}
9 k0 h6 {% g, {) |- g, twhile(!k_left);( l; e2 }0 A0 b# _
}
0 y1 T* b" H$ Z$ o# nif(k_right==0)
' d2 S; R: k6 e& f{
7 X0 k7 T, x# O) Bdelay_ms(10);0 g0 ~' i9 {7 ?+ E; m
if(k_right==0)3 Z. e! E% [9 l! `! \' q! [
{
+ R. W4 ?9 m$ T$ T; l* fGPIO_Write(GPIOC,(u16)(0xf7));5 e8 D" f3 Z' J# Y+ ^
}% E6 R; @9 q' A+ l
while(!k_right);
6 J/ C  K; M/ T4 z7 ~}
8 d0 a' N) n. D4 _}
; g0 U( R, X0 l
$ r4 s% \2 e- q- h8 Q: ?这个按键扫描函数只是一个简单的函数,在比较简单的程序里面比较实用,有很明显的缺陷,不支持多按键输入,而且由于使用的是延时消抖,不能充分利用 CPU 资源。大家 如在比较复杂的程序使用按键扫描的话,使用状态机方式的按键扫描,或者零时消抖的按键扫描方式。, F/ \( Q, v3 E  |+ a7 }6 J! U
' z. z' }# ?1 G
int main()
, _- [; ]9 t5 u8 l{
8 Y# v; W3 @% P; ^led_Init();  //LED 初始化. B  u2 w, y' m
key_init();  //按键端口初始化函数0 R8 a) R; ?1 D7 o/ F( f" _
GPIO_Write(GPIOC,(u16)(0xff)); //LED 灭5 |$ J. m% j9 L8 D' ^2 n
while(1)8 @: D1 h0 d& f: s. i& o* c2 L
{
% I3 r; G. d7 U2 ?3 nkeyscan();  //按键处理函数 2 o  p: t. H7 [. y
}
' u' P) i5 h6 b9 v$ W}  s7 s! e* B" R3 A7 L/ T

( b$ v: k: |, S* e4 u4 B6 ^9 c独立按键就先写到这里吧,后面还会分享其它的按键扫描函数。1 D* y; E$ E1 J2 Q4 U" i
5 f8 F7 C; g" |* P& V
收藏 评论1 发布时间:2018-1-15 20:51

举报

1个回答
黑夜之狼 回答时间:2018-1-16 09:01:37
呃....用delay来做消抖
& T0 V5 A  W  W  q- W另外,LZ的硬件是啥板子

所属标签

相似分享

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