按动按钮,1-2 3-4导通,
延时程序:5-10ms抖动需要延时消除抖动 (软件消抖)
RC电路充放电(硬件消抖)
#include"reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit KEY1=P3^1;//定义特殊位置按键用sbit sbit KEY2=P3^0; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED1=P2^0; #define KEY1_PRESS 1//只使用一个LED来判断按键K1即可,也可多加几个LED来显示 #define KEY2_PRESS 2 #define KEY3_PRESS 3 #define KEY4_PRESS 4 #define KEY_UNPRESS 0 void delay_time(u16 time_delay) { while(time_delay--); } u8 key_scan(u8 mode)//检验按键是否按下的函数 //mode来选择是否是连续按下还是单次按下 { static u8 key=1;//定义变量key通过0/1的值来判断高/低点平 if(mode)key=1;//1是连续按下,0是单次按下 if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)) { delay_time(1000);//消抖 key=0;//1进入循环之后改为0跳出循环 if(KEY1==0) return KEY1_PRESS; else if(KEY2==0) return KEY2_PRESS; else if(KEY3==0) return KEY3_PRESS; else if(KEY4==0) return KEY4_PRESS; } else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) { key=1; } return KEY_UNPRESS; } void main() { u8 key=0; while(1) { key=key_scan(0);//0是单独按下,1是连续按下 if(key==KEY1_PRESS) LED1=!LED1;//通过KEY1控制LED1 } }