分享

单片机------ADC------39---摇杆

 印度阿三17 2021-02-22

/
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(flag2
1) //如果上次长按后有过释放,如果没有释放就说明是按住不放,不再做判断。 这里面没有释放
就不做判断。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_MUTE
0) //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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多