单片机------ADC------39---摇杆
/
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清0if(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; //清对象数组0Rocker_Read_Buffer[1]=120-ADC_Read_Data; //差值给数组1 }else{Rocker_Read_Buffer[0]=0; //摇杆在中间,清0Rocker_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;}