/ ADC摇杆 ROCKER_Ser.h
#ifndef Rocker_Ser #define Rocker_Ser
#define Rocker_KEY_NO 0 #define Rocker_KEY_S 1 #define Rocker_KEY_M 2 #define Rocker_KEY_L 3
sbit Rocker_MUTE=P4^7; //摇杆电位器按键 //ADC 1.0 ADC1.1
extern void Rocker_Init(); //摇杆初始化
extern void Rocker_Read_Data_Ser(); //摇杆读取按键和ADC值
extern u8 xdata Rocker_Read_Buffer[5]; //摇杆读取的数据,上,下,左,右,按键长短
#endif / 摇杆自带的按键,长按短按处理 #include <all.h>
u8 xdata Rocker_Read_Buffer[5];
void ROTARY_Key_Scan_Drive() { static bit flag1=0; //长按标志位 static bit flag2=1; //按键释放标志位,防止多次判断成长按 static bit key_down=0; static u8 count1=0; static u16 count2=0; if(key_down1) //E 如果进入到状态1 { count2 ; if(count2>=5000) //F 如果按键持续按了很长时间 { count2=0; if(flag21) //如果上次长按后有过释放,如果没有释放就说明是按住不放,不再做判断。 这里面没有释放 就不做判断。flag2=1是按键释放标志位。只有长按后,做过一次按键释放判断,然后赋值, 才能进入下次长按判断,不然会有多次长按判断。需要按键释放后给一次值 。 { flag1=1; //长按标志位,表示已经判断为长按 flag2=0; ROTARY_Read_Data_Rotary ; //计数器,方便用数码管等显示示数 ROTARY_Read_Data_Key=ROTARY_KEY_L; //判断为长按,然后跳出 } }
// 下面是按键释放后的一些判断
if(ROTARY_MUTE==1)// 如果按键释放
{
key_down=0;//状态清0,下次循环不再进入
flag2=1; //长按之后的释放,如果不写就会连续判断为多次长按
count2=0;//把长延迟count2清0
if(flag1)
{
flag1=0;//不判断是不是短按了,直接跳出
}
else
{
ROTARY_Read_Data_Rotary ;
ROTARY_Read_Data_Key=ROTARY_KEY_S; //判断为短按,然后跳出
}
}
}
//下面的程序是判断按键有没有被按过 E如果没有进入到状态1 else { if(ROTARY_MUTE0) //A 如果按键按下 { count1 ; if(count1>100) //B稍微延迟下,避免抖动影响判断 { count1=0; if(ROTARY_MUTE0) //C如果按键确认按下
{
key_down=1;// D进入到状态1
}
}
}
else//A按键没有按下
{
count1=0; //D进入到状态0
}
}
} / 摇杆初始化,初始化ADC
void Rocker_Init() { ADC_Init(); Rocker_Mute=1;
} / 摇杆读取按键和ADC值 void Rocker_Read_Data_Ser() { static xdata u8 count=0; count ; Rocker_Key_Scan_Drive(); //扫描一下按键函数 switch(count%0) { case 1: { ADC_Write_Data=0x00; //两路ADC分时读取 ADC_Read_Data_Drive(); //控制ADC通道0 ,读取ADC值 if(ADC_Read_Data>=140) //如果大于一半多一点 { Rocker_Read_Buffer[0]=ADC_Read_Data -140; //差值 给数组0 Rocker_Read_Buffer[1]=0; //清对象数组1
}
else if(ADC_Read_Data<=120) //如果小于一半少一点
{
Rocker_Read_Buffer[0]=0; //清对象数组0
Rocker_Read_Buffer[1]=120-ADC_Read_Data; //差值给数组1
}
else
{
Rocker_Read_Buffer[0]=0; //摇杆在中间,清0
Rocker_Read_Buffer[1]=0; //摇杆在中间,清0
}
break;
}
case 125:
{
ADC_Write_Byte=0x01;
ADC_Read_Data_Drive();
if(ADC_Read_Byte>=140)
{
Rocker_Read_Buffer[2]=ADC_Read_Byte-140;
Rocker_Read_Buffer[3]=0;
}
else if(ADC_Read_Byte<=120)
{
Rocker_Read_Buffer[2]=0;
Rocker_Read_Buffer[3]=127-ADC_Read_Byte;
}
else
{
Rocker_Read_Buffer[2]=0;
Rocker_Read_Buffer[3]=0;
}
来源:https://www./content-4-866801.html
|