你所描述的5种状态其实就是3种状态的往复:0-1-2-1-0,在你上一个贴子我给你的程序基础上加一条判断语句就可以解决换挡过程短暂 K1=1与K2=1引起的不稳定。请仔细看我的注释以便理解程序。
#include <reg52.h>
#define key_S 5000 //预设延时计数值,12M晶振约230ms(根据响应需求进行调节)
//如果需要精确延时就要使用定时器。
sbit KEY1=P2^0;
sbit KEY2=P2^1;
sbit OUT1=P3^0;
sbit OUT2=P3^1;
void Key_Scan()//按键扫描程序
{
static unsigned int count_1=0,count_2=0,count_3=0;//延时计数变量
if((KEY1==0)&&(KEY2==1))//轻按 状态1
{
if(++count_1>=key_S)//计数延时
{
count_1=key_S;//防止溢出
OUT1=1;
OUT2=0;
count_2=0; //count_2清0
count_3=0; //count_3清0
}
}
else if((KEY1==1)&&(KEY2==0))//重按 状态2
{
if(++count_2>=key_S)//计数延时
{
count_2=key_S;//防止溢出
OUT1=1;
OUT2=1;
count_1=0; //count_1清0
count_3=0; //count_3清0
}
}
else //松手或不按 状态0
{
if(++count_3>=key_S)//计数延时
{
count_3=key_S;//防止溢出
OUT1=0;
OUT2=0;
count_1=0; //count_1清0
count_2=0; //count_2清0
}
}
}
void main()
{
OUT1=0;//初始化输出1端口
OUT2=0;//初始化输出2端口
while(1)
{
Key_Scan(); //按键扫描
}
} |