此文包括两部分
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:但仍然不知道上下拉的作用是什么。