基于stm32f103的按键与仿真调试

此文包括两部分
1 在stm32f103开发板上实现按键控制灯开灯灭功能
2 利用st-link对程序进行仿真
第一部分
与点灯类似,实现按键输入也是通过控制GPIO口的电平来控制,只是此时的模式(mode)需要选为输入,并且对于wake_up引脚需要下拉(另外两个是上拉)。
按键原理,当没有按下时为默认的上拉或下拉,按下后电平状态反向。可以通过读取此时PIN口的电平状态来判断按键是否被按下。
此外,需要注意的是,按键一般有两种模式
1 按下后只执行一次,下次按下再执行一次。
2 按下后不断执行
前者适用于按一下动一下的情况,后者适用于长按的情况
暂且想到两种实现方式
1 利用while语句,在函数最后判断,等到手松开后才跳出循环
2 利用标识符,通过标识符的01状态来判断使用哪种模式
代码如下:

  u8 Key_Scan(u8 mode)
{
  static u8 Key_Up=1;
  if(mode==1)Key_Up=1;
  if(Key_Up&&(Key_0==0||Key_1==0||Wake_Up==1))
  {
    delay_ms(10);
    Key_Up=0;
    if(Key_0==0) return Key0_Pres;
    else if(Key_1==0) return Key1_Pres;
    else if(Wake_Up==1) return WakeUp_Pres;
  }
  else if(Key_0==1&&Key_1==1&&Wake_Up==0)Key_Up=1;
  return 0;
}

值得注意的是,虽然前者思路简单,但是后者优点显著
1 模式切换方便
2 由于第一种方式使用while循环语句,导致若按键没被松开便一直不会显示,且函数会一直停留,对复杂程序可能有影响。
第二种方法的要点在于设置标志位,当松手后标志位重新置1,表示可以再次识别按键。
2 仿真
利用st-link可以对代码进行仿真,进一步检查代码的问题,对函数一步步分析,可得知运行情况。但是由于本人不懂汇编语言,无法对其进行更准确的判断

项目过程中出现了的错误:
由于对上下拉的不了解,在编写代码时没有区分wake-up和key0,key1的电平区别,导致判断语句中一直执行与预期效果不符。最后通过仿真和代码比对完成了。
上拉:默认高电平
下拉:默认低电平
由于对key0,key1及wake-up已经进行过上下拉设置,因此要根据其硬件电路来编码。
PS:但仍然不知道上下拉的作用是什么。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值