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

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

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

一个GPIO控制两个按键的方法https://blog.csdn.net/sw7989/article/details/105609145

#define Switch_Enable            1
#define Switch_Disable          0
#define PULL_UP                 1
#define PULL_DOWN               0
#define Input_KEY               PORTBbits.PB0
unsigned char Key_Time;         // 按键消抖计数
unsigned char Switch_Flag;      // 按键上下拉切换标志
unsigned char Switch_Time;      // 切换时间计数
unsigned char Resistor_Status;  // 电阻状态 1:上拉 0:下拉
unsigned char Up_Trigger_Flag;  // 按键触发标志
unsigned char Down_Trigger_Flag;// 按键触发标志
unsigned char Only_Once_Flag;
// 九齐没有位定义功能,如果空间不够,可以利用位域功能实现位定义功能
void isr(void) __interrupt(0)
{if(INTFbits.T0IF)  //500US{TMR0 = 0X09;Key_Time++;Switch_Time++;INTFbits.T0IF = 0;   // Clear T0IF flag bit      }
}
void Key_Scan(void)
{if( ( Switch_Flag == Switch_Enable ) && ( System_Status == System_Status_Run ) )/*< 上下拉切换 */    //系统未开启时,关闭切换,电阻默认上拉,等待开机{BWUCON  = 0X00;    // 成功唤醒后关闭按键中断if( Switch_Time >= 10 )    // 5MS切换一次{Switch_Time = 0;if ( Resistor_Status == PULL_UP ){Resistor_Status =  PULL_DOWN;ABPLCON = 0X6F;     // 0111 0000 PB3 PB0 下拉BPHCON  = 0XFF;      // 1111 1110    PB0 上拉}else{Resistor_Status =  PULL_UP;    BPHCON  = 0XFE;        // 1111 1110    PB0 上拉ABPLCON = 0X7F;     // 0111 0000 PB3 下拉 关闭 PB0 下拉}}Key_Time = 0;    }if( ( Switch_Time > 4 ) || ( System_Status == System_Status_Sleep ) ) // 等待电平稳定{if ( ( Resistor_Status == PULL_UP && !Input_KEY ) || ( Down_Trigger_Flag ) )/*< 上拉使能同时接地按键按下 */{Switch_Flag = Switch_Disable;   /*< 禁止上下拉切换 */Down_Trigger_Flag = 1;if( Key_Time >= 60 )    // 30ms消抖{if ( !Input_KEY ){if(!Only_Once_Flag) {Only_Once_Flag = 1;// 按下一次只执行一次,防止由于未松开导致的多次触发}        }else{Switch_Flag = Switch_Enable; /*< 使能上下拉切换 */       Down_Trigger_Flag = 0; // 清除触发标志Only_Once_Flag = 0;       // 按键执行程序恢复触发}  Key_Time = 0;}}else if( (Resistor_Status == PULL_DOWN && Input_KEY ) || ( Up_Trigger_Flag ) )/*< 上拉禁止同时接电源按键按下 */{Switch_Flag = Switch_Disable;  /*< 禁止上下拉切换 */Up_Trigger_Flag = 1;if( Key_Time >= 60 )    // 30ms消抖{if ( Input_KEY ){if( !Only_Once_Flag )  {Only_Once_Flag = 1;// 按下一次只执行一次,防止由于未松开导致的多次触发}}else{Switch_Flag = Switch_Enable; /*< 使能上下拉切换 */       Up_Trigger_Flag = 0;   // 清除触发标志Only_Once_Flag = 0;       // 按键执行程序恢复触发}  Key_Time = 0;}}}
}

一个I/O口实现两个按键功能相关推荐

  1. 一个普通IO口检测两个按键的方法

    一个普通IO口检测两个按键的方法 (图一) (图二) 1 如图一所示: 当MCU供电为5V时候: IO口低电平电压范围:0-1.5V: IO口高电平电压范围:3.5-5.0V: 使用注意事项: 1.所 ...

  2. 一个I/O口控制两个LED灯

    方案1: 优点:平时基本没有功耗: 缺点:电路复杂. 经本人在PIC18F4550测试板上测试,完全没有问题. 方案二: 本人没有测试. 优点:电路简单 缺点:平时还有功耗,二极管VD1一直导通态. ...

  3. 如何使用一个单片机的IO口控制两个LED?

    简 介: 本文介绍了一种使用单个IO口独立控制两个LED点亮的方案.并对于不同颜色的LED和不同工作电压下的MCU进行了讨论.给出了在不同的颜色组合.工作电压的情况下不同的驱动方案. 关键词: IO, ...

  4. 多功能按键设计——利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按

    看了一个晚上,结合了马潮老师的书,才搞懂这个程序,确实经典!原文: 题目:多功能按键设计.利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按. (amobbs.com 阿莫电子论坛 ...

  5. Python---编写一个函数,提示输入两个数字a,b,并进行a与b的除法运算。

    题目: 编写一个函数,提示输入两个数字 a,b ,并进行 a 与 b 的除法运算,把运算结果打印出来.要求对输入和程序进行检测,可以排除所有的错误. 源代码: def devision():try:a ...

  6. c语言两字符串转数字后相加,一个觉得很难的C语言问题。对两个数字字符串相加。 C语言 如何把一个字符串中相连的两个数字转化为一......

    导航:网站首页 > 一个觉得很难的C语言问题.对两个数字字符串相加. C语言 如何把一个字符串中相连的两个数字转化为一... 一个觉得很难的C语言问题.对两个数字字符串相加. C语言 如何把一个 ...

  7. java中的复合数据类型是什么_【填空题】类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素。一个类的实现包括两部分:____和_____....

    [填空题]类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素.一个类的实现包括两部分:____和_____. 更多相关问题 [名词解释] 观叶树木 [单选] 开花时有浓郁香气的树种是 ...

  8. 【解答】一个电动模型,每一组电池能让其行驶8分钟,一个充电器能同时给两组电池充电,一组充满需要15分钟,至少准备(?)组电池,(?)个充电器,可以让模型每次行驶完可以立即换电池行驶不用等待。

    阿里2015年实习生题目: 一个电动模型,每一组电池能让其行驶8分钟,一个充电器能同时给两组电池充电,一组充满需要15分钟,至少准备(?)组电池,(?)个充电器,可以让模型每次行驶完可以立即换电池行驶 ...

  9. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

    描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...

最新文章

  1. 用Kotlin在IntelliJ Idea中无法生成 spring-configuration-metadata.json 文件
  2. linkedhashmap 顺序_有关于LinkedHashMap一份简单理解
  3. Codeforces Round #324 (Div. 2) E. Anton and Ira 贪心
  4. 整合用户篇—Oauth2理解与构造简单的系统
  5. spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现
  6. VS2010环境下MFC使用DataGrid绑定数据源
  7. 关键字回顾(final/finally/finalize()、Synchronized、volatile、static)
  8. SQL 创建数据库、表以及索引
  9. 神操作!傅里叶变换取代Transformer自注意力层
  10. VMware vSAN的六大优势和案例分享
  11. SQL server 数据库调用远程数据库存储过程的实现方法
  12. 做对了什么与留下了什么 小米上市的背后
  13. 7-5 约分最简分式
  14. 8421码 BCD码
  15. 大数据有哪些基本特征,有什么作用和用途?
  16. Photoshop 油画效果
  17. Zabbix Agent 主被动模式 坑与技巧
  18. 互联网风雨十年,我所经历的技术变迁
  19. 大白话解读什么是七层网络协议,TCP/IP五层模型通信知识(一)
  20. 删除线性表节点(线性表)

热门文章

  1. 电脑无法启动,电源灯一直闪烁,风扇不转!
  2. 简单之正分数乘积运算
  3. 散户怎么在市场中利用佳庆指标进行炒股
  4. 【WINDOWS / DOS 批处理】dir命令参数详解(二)
  5. 在B站上听相声是一种什么体验?太刺激了!
  6. win10系统家庭版安装
  7. 计算机网络技术是一把双刃剑,网络一把双刃剑作文
  8. RGF相关Python2及Python3的库解决
  9. 解决input file上传图片,部分手机拍照或者本地图片无法上传(图片太大,需要上传之前先压缩)
  10. 互联网+时代,淘宝模式的衰退不可避免