按键检测方法处理不同事件的对比,所有按键都以PIC16F505的RC4为输入端口作为例子。
方法1:
Void scan()
{
if(RC4==0)
{
Delay(50);
if(RC4==0)
{
num++;//多事件跳转变量num
RC0=1;//按键有效后要做的事情,比如点亮RC0上的LED
}
}
while(!RC4);//松手检测
}
此类按键扫描函数,合适离散型事件,比如一键多能,等。假如把松手检测部分去掉,则合适做LED无极调光,因为,只要按键按住不放,整个函数会一直检测是否有按键按下,并且执行按键有效后的语句。
方法2:
void scan()
{
while(!RC4)
{
delay(10);
i++;
}
if(i>10)//如果改成if(i>50)则认为是按键长击。否则是短击。
{
i=0;
RC0=0;//按键有效后腰做的事情
}
}
此类函数,灵敏度很高,合适处理松手后有效的事件,同样也是散转型事件,此函数如果把i的条件变一下可以改成长按有效的功能。可以让LED从静态工作状态进入动态工作状态,从单亮转到渐变等等。
方法3:
void scan()
{
static bit key_push;
static bit s1_push;
static bit s2_push;
if(RC4&&RC5)key_push=0;//无按键按下,标志清零
if(!RC4&&!key_push)//如果某个键按下
{
key_push=1;
s1_push=1;
RC0=1;//按键有效后做的事情
}
else s1_push=0;
if(!RC5&&!key_push)//如果某个键按下
{
key_push=1;
s2_push=1;
RC0=1;//按键有效后做的事情
}
else s2_push=0;
}
灵敏度高,单次触发,长按无效。一次可以检测7个以上独立按键。
方法4:
void KEY1()
{
static bit valid=0;
static bit finish=0;
if(valid==0)
{
if(RC5==0)
{
if(finish==0)
{
finish=1;
RC1=1;
delay(50);
RC1=0;
RC0=0;
PWM+=4;
}
}
else
{
valid=0;
finish=0;
}
}
else
{
if(RC5==0)valid=1;
}
}
上面按键处理是一段LED台灯分段调光的代码。单次触发,长按无效,按住不放,LED不会闪烁。
以上是实际工作中经常用到的按键处理方法,随着工作进展,更多的按键检测方法慢慢会被记载。
关键字:单片机 按键处理
引用地址:
单片机按键处理总结
推荐阅读最新更新时间:2024-03-16 14:04
HOLTEK 新推出 HT45F3W 血压计 MCU
Holtek在医疗量测领域不断追求卓越精进,正式推出高度整合,高性价比的血压计专用MCU HT45F3W。HT45F3W整合了多个可程序调整放大倍率及偏压的专用运算放大器,并内建有13-位模拟数字转换器,定电流产生器,同时具有Charge Pump及Regulator等功能,并搭配IAP ( In-Application Programming) 技术,对于程序更新及量测数据储存都可轻易完成。非常适用于臂式血压计及腕式血压计并各项居家医疗健康器材等产品。 HT45F3W包含有16K Word Flash程序内存、512Byte数据存储器、64Byte Data EEPROM及8 Level Stack等核心规格;同时兼具实用的外
[医疗电子]
51单片机双向跑马灯的实现
#include REGX51.H void delay(void) //延时函数 { unsigned char i, j; for(i=0;i 200;i++) { for(j=0;j 200;j++); } } void main(void) { while(1) { unsigned char i = 0; unsigned d = 0x80; for(i = 1; i 8; i++) //从右跑到左 { P0=~d; d = d 1; delay(); //延时 } //d = 0x01; for(i = 1; i 8; i++) // 从左跑到右 { P0= ~d; d = d 1; delay()
[单片机]
基于STC15F101W单片机调光灯/按键状态机源程序
基于STC15F101W调光灯,按键状态机,电脑USB供电,STC15F101W单片机驱动 单片机源程序如下: /********************************************** 程序名:LED程序 产品代号:LED调光台灯 硬件平台:STC15F100W (只有T0和T2两个定时器 ) 当前版本:1.0 编写人:@Richard 说明: ①适用于Led驱动板 ②可通过DIM端控制灯泡亮度与开关 ③有四个指示灯,共阳 命名规则:输出后缀_dr、输入后缀_sr、标志位后缀_flag (dr代表drive驱动、sr代表senso
[单片机]
瑞萨新一代“RX系列”微控制器
· 快速、高性能 CPU—— 新型架构可实现 200MHz 的高速运行,每个时钟周期可以同时处理更多的指令: Dhrystone v2.1 基准测得的结果为 1.25MIPS/MHz 。 该新型 CPU 采用了哈佛( Harvard )架构,可以提供独立的地址和数据通道,有助于实现一个周期内的指令执行和数据存取。这种单周期能力已通过现场使用瑞萨 MCU 进行了测试和验证。为了确保尽可能高的性能,瑞萨对该架构进行了严谨的设计和广泛的测试工作。因此,新型架构通过对寄存器、指令和地址模式的有效利用而进行了充分的优化。此外,它还有 16 个 32 位通用寄存器,有助于 CPU 处理所有可用寄存器的数据和地址。
[新品]
TI芯科技赋能中国新基建之新能源汽车充电桩
当充电桩在2020年被列入新基建的七大项目之中时,人们似乎看到了一个万亿元的市场即将被撬动,随之超过26个省市密集出台了50余项与充电设施相关的政策。但现实是,根据智研咨询提供的数据显示,在过去的一年里充电桩的出货量虽有明显上升(从12万到近30万),却未出现期望中的井喷。 市场的发展未能尽如人意,固然有各方利益协调的问题,但是从技术的角度来看也存在着各种阻碍因素,其中最亟需解决的是对于用户的充电体验至为重要的充电时间,此外则是充电桩信息的实时交互问题,而这些都聚焦于大功率直流充电桩。 焦虑的充电进行时 为了解决电动汽车的充电焦虑问题,更快的充电速度成为快充站的明确要求,实现充电5分钟,行驶200公里会成为行业的普
[汽车电子]
单片机逻辑电路与逻辑运算
在数字电路,我们经常会遇到逻辑电路,而在 C 语言中,我们则经常用到逻辑运算。二者在原理上是相互关联的,我们在这里就先简单介绍一下,随着学习的深入,再慢慢加深理解。 首先,在“逻辑”这个概念范畴内,存在真和假这两个逻辑值,而将其对应到数字电路或 C 语言中,就变成了“非 0 值”和“0 值”这两个值,即逻辑上的“假”就是数字电路或C 语言中的“0”这个值,而逻辑“真”就是其它一切“非 0 值”。 然后,我们来具体分析一下几个主要的逻辑运算符。我们假定有 2 个字节变量:A 和 B,二者进行某种逻辑运算后的结果为 F。 以下逻辑运算符都是按照变量整体值进行运算的,通常就叫做逻辑运算符: 逻辑运算符 说明 && 逻辑与 F =
[单片机]
以C8051F340单片机为核心的USB数据采集系统设计
1引言 电子设备运行状态的稳定性直接影响到现代企业的生产, 设备发生故障后高昂的维修费以及设备停机后给企业生产带来的损失, 使得各个企业纷纷采取措施, 降低设备的故障率。通过数据采集系统准确的获取设备运行特征数据, 并对数据进行分析,判断设备的运行状态是否良好, 达到提前预防故障出现、减少停机检修的目的。实际应用中对数据采集系统的可靠性, 准确性和便携性要求很高。目前常用的数据传输网络(如RS232 /RS485, CAN 等)已经不能满足大量采集数据和高速实时数据传输的要求。而USB传输具有高速可靠传输的优势, 具有成本低、可靠性高、维护方便等优点。本文以带有片上USB 和高速AD转换器的C8051F340为核心控制器件, 利用
[单片机]