单片机------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(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%250)
{
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;
		
		}
上一篇:复选框的实现


下一篇:Linux系统编程39 进程控制 - 命令实现简析