当前位置:   article > 正文

一个I/O口实现两个按键功能_一个io口控制两个按键

一个io口控制两个按键

        最近在一个项目中,由于客户要求,需要留有1个引脚后续扩展功能,导致原本刚好的I/0口,经过考虑从按键管脚移走一个,用于扩展,留下来一个引脚控制两个按键。

        图中串在两个按键上下的电阻作用为防止两个按键同时按下时电源正负极短路,轻则烧坏芯片,重则烧坏电池。

        最开始的代码思路来自下面链接,根据我个人需要,我修改为利用定时器中断来延时。使用芯片为九齐的NY8B062E(I/O口带内部上下拉)

一个GPIO控制两个按键的方法icon-default.png?t=N7T8https://blog.csdn.net/sw7989/article/details/105609145

  1. #define Switch_Enable 1
  2. #define Switch_Disable 0
  3. #define PULL_UP 1
  4. #define PULL_DOWN 0
  5. #define Input_KEY PORTBbits.PB0
  6. unsigned char Key_Time; // 按键消抖计数
  7. unsigned char Switch_Flag; // 按键上下拉切换标志
  8. unsigned char Switch_Time; // 切换时间计数
  9. unsigned char Resistor_Status; // 电阻状态 1:上拉 0:下拉
  10. unsigned char Up_Trigger_Flag; // 按键触发标志
  11. unsigned char Down_Trigger_Flag;// 按键触发标志
  12. unsigned char Only_Once_Flag;
  13. // 九齐没有位定义功能,如果空间不够,可以利用位域功能实现位定义功能
  14. void isr(void) __interrupt(0)
  15. {
  16. if(INTFbits.T0IF) //500US
  17. {
  18. TMR0 = 0X09;
  19. Key_Time++;
  20. Switch_Time++;
  21. INTFbits.T0IF = 0; // Clear T0IF flag bit
  22. }
  23. }
  24. void Key_Scan(void)
  25. {
  26. if( ( Switch_Flag == Switch_Enable ) && ( System_Status == System_Status_Run ) )
  27. /*< 上下拉切换 */ //系统未开启时,关闭切换,电阻默认上拉,等待开机
  28. {
  29. BWUCON = 0X00; // 成功唤醒后关闭按键中断
  30. if( Switch_Time >= 10 ) // 5MS切换一次
  31. {
  32. Switch_Time = 0;
  33. if ( Resistor_Status == PULL_UP )
  34. {
  35. Resistor_Status = PULL_DOWN;
  36. ABPLCON = 0XEF; // 1110 1111 PB0 下拉
  37. BPHCON = 0XFF; // 1111 1111 关闭 PB0 上拉
  38. }
  39. else
  40. {
  41. Resistor_Status = PULL_UP;
  42. BPHCON = 0XFE; // 1111 1110 PB0 上拉
  43. ABPLCON = 0XFF; // 1111 1111 关闭 PB0 下拉
  44. }
  45. }
  46. Key_Time = 0;
  47. }
  48. if( ( Switch_Time > 4 ) || ( System_Status == System_Status_Sleep ) )
  49. // 等待电平稳定
  50. {
  51. if ( ( Resistor_Status == PULL_UP && !Input_KEY ) || ( Down_Trigger_Flag ) )
  52. /*< 上拉使能同时接地按键按下 */
  53. {
  54. Switch_Flag = Switch_Disable; /*< 禁止上下拉切换 */
  55. Down_Trigger_Flag = 1;
  56. if( Key_Time >= 60 ) // 30ms消抖
  57. {
  58. if ( !Input_KEY )
  59. {
  60. if(!Only_Once_Flag)
  61. {
  62. Only_Once_Flag = 1;
  63. // 按下一次只执行一次,防止由于未松开导致的多次触发
  64. }
  65. }
  66. else
  67. {
  68. Switch_Flag = Switch_Enable; /*< 使能上下拉切换 */
  69. Down_Trigger_Flag = 0; // 清除触发标志
  70. Only_Once_Flag = 0; // 按键执行程序恢复触发
  71. }
  72. Key_Time = 0;
  73. }
  74. }
  75. else if( (Resistor_Status == PULL_DOWN && Input_KEY ) || ( Up_Trigger_Flag ) )
  76. /*< 上拉禁止同时接电源按键按下 */
  77. {
  78. Switch_Flag = Switch_Disable; /*< 禁止上下拉切换 */
  79. Up_Trigger_Flag = 1;
  80. if( Key_Time >= 60 ) // 30ms消抖
  81. {
  82. if ( Input_KEY )
  83. {
  84. if( !Only_Once_Flag )
  85. {
  86. Only_Once_Flag = 1;
  87. // 按下一次只执行一次,防止由于未松开导致的多次触发
  88. }
  89. }
  90. else
  91. {
  92. Switch_Flag = Switch_Enable; /*< 使能上下拉切换 */
  93. Up_Trigger_Flag = 0; // 清除触发标志
  94. Only_Once_Flag = 0; // 按键执行程序恢复触发
  95. }
  96. Key_Time = 0;
  97. }
  98. }
  99. }
  100. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号