单片机3种按键程序消抖方法

1,查询法延时模式

cpp 复制代码
    u8 key0=1;
    u8 x=0;
	
	KEY=1;
	while(1)
	{

		if(KEY==0)                //"按键按下"
		{
			delay(10);            //延时10ms
            if(KEY==0 && kdy0==1) //按下有10ms 且上状态是1。即下降沿时
		    {
			    key0=0;             //将上状态置0.防止按住不放时,重复执行按下程序语句。
			    x++;                //按下执行语句
		    }
            key0=KEY;               //弹起按键时将上一状态置1.否则保持为0.
		}
		
		P0=~smgduan[x];
	}

10ms延时时,程序是阻塞停止的,以下程序就不会停止主程序,

2,查询法不需要延时

cpp 复制代码
    u8 keyx=0xFF;
    u8 x=0;
	
	KEY=1;
	while(1)
	{
		keyx = keyx<<1 | KEY;   //左移并将KEY状态写入第0位,下一次执行时会被继续左移
		if(keyx !=0)            //8位没有全部为0,即没有8次检测全为"按键按下"
		{
			key0=1;             //上一状态
		}
		else if(key0==1)        //8次全0且上状态是1。即下降沿时
		{
			key0=0;             //将上状态置0.防止按住不放时,重复执行按下程序语句。
			x++;                //按下执行语句
		}

		P0=~smgduan[x];
	}

key0的作用是备份上一状态,使按下按键产生**"下降沿"**作用。

每一次循环检测一次,8次皆为0时确定为"按下";如果整个程序很长,一次循环占用时间超过几十毫秒,8次就是上百几百毫秒了,这样按下时间略快时就被认为是没按下了。所以程序总时长不超过10ms时好用,超过就要这样:

将按键检测程序放在 一个2ms的定时器中断函数中,程序每2ms 就会检测一下按键的状态。虽然这个检测程序占用CPU时间,但不到0.03ms而已,0.03ms vs 2ms,不到2%占用。

3,中断法 非阻塞程序

cpp 复制代码
void Int0()	interrupt 0	//外部中断0 必须用P3.2口 
{
	delay(10);          //与1例中都是有按下信号时延时10ms;区别是这里不需要主程序查询而已。
	if(KEY==0) 
	{
		x++;            //执行语句
	}
}

因为3.2中断输入已设置为**"下降沿触发方式了",**一直按下也不会再有中断发生的。

非阻塞也是相对的,中断也是延时了10ms.

总结:

中断法最好,但占用一个外部中断资源。

相关推荐
努力努力再努力wz10 小时前
【Linux网络系列】:网络+网络编程(UDPsocket+TCPsocket)
java·linux·c语言·开发语言·数据结构·c++·centos
风行男孩10 小时前
stm32基础学习——按键的使用
stm32·嵌入式硬件·学习
Trouvaille ~11 小时前
【LInux】进程程序替换与shell实现:从fork到exec的完整闭环
linux·运维·c语言·c++·ssh·进程替换·基础入门
SETH·XU11 小时前
简记:关于net-snmp中engineid冲突全局etimelist的赋值情况
c语言·网络·net-snmp·snmpv3·engineid冲突
小热茶11 小时前
浮点数计算专题【五、 IEEE 754 浮点乘法算法详解---基于RISCV的FP32乘法指令在五级流水线的运行分析与SystemC实现】
人工智能·嵌入式硬件·算法·systemc
_Ningye11 小时前
JL — AC695X — 配置工具的使用
c语言
brave and determined11 小时前
传感器学习(day09):三维手势识别:人机交互的未来革命
嵌入式硬件·手势识别·传感器·tof·嵌入式设计·多角成像技术·光飞时间技术
恒锐丰小吕11 小时前
无锡黑锋 HF5903 40V热插拔、50V耐压、可调限流保护开关技术解析
嵌入式硬件·硬件工程
枫叶丹411 小时前
【Qt开发】Qt窗口(十) -> QInputDialog 输入对话框
c语言·开发语言·数据库·c++·qt
zore_c11 小时前
【C语言】EasyX图形库——实现游戏音效(详解)(要游戏音效的看过来!!!)
c语言·开发语言·经验分享·笔记·游戏