硬件环境采用STM8SF103,电压为3.3V。电路需要注意的是STM8SF103这系列的IO作为输入口时只能是上拉输入和悬浮输入,虽然是弱上拉,在VCC为3.3V电压时,仍然能够被拉升至3.0V左右。
  所以按键检测电路IO口一端需要接地,而不是外接上拉。悬浮方式下IO仍然会有0.89V左右电压,读取对应的IO寄存器IDR,仍然处于逻辑高电平状态。
代码如下:
  1. //初始化只需要设置IO口模式即可。
  2. GPIO_Init(KEY2_PORT,KEY2_PIN,GPIO_MODE_IN_PU_NO_IT);//上拉输入,不产生中断
  3. //按键检测部分
  4. /*
  5. #defineKEY10
  6. #defineKEY1_PORT(GPIOD)
  7. #defineKEY1_PIN(GPIO_PIN_4)
  8. #defineKEY21
  9. #defineKEY2_PORT(GPIOC)
  10. #defineKEY2_PIN(GPIO_PIN_1)
  11. */
  12. u8CheckKey(u8key)
  13. {
  14. if(key==KEY1)
  15. {
  16. if(KEY1_PORT->IDR&KEY1_PIN)//检测到有按键了,IO口电压会被拉低
  17. {
  18. delay_5ms();
  19. if(KEY1_PORT->IDR&KEY1_PIN)//仍然存在低电平
  20. {
  21. while(!(KEY1_PORT->IDR&KEY1_PIN));//等待放开
  22. returnKEY1;
  23. }
  24. }
  25. return0;
  26. }elseif(key==KEY2)
  27. {
  28. if(!(KEY2_PORT->IDR&KEY2_PIN))//检测到有按键了
  29. {
  30. delay_5ms();
  31. if(!(KEY2_PORT->IDR&KEY2_PIN))//仍然存在低电平
  32. {
  33. while(KEY2_PORT->IDR&KEY2_PIN);//等待放开
  34. returnKEY2;
  35. }
  36. }
  37. return0;
  38. }
  39. return0;
  40. }
  41. 复制代码
总结一下,硬件电路将按键IO口的一端接地。软件配置不能使用悬浮输入方式,这种方式电压可能会不稳定。